function cleanInfo(info) {
  var ret = {};
  for (var x in info) {
    // Filter out address pointers and only print meaningful info
    if (x == 'id' || x == 'type' || x == 'name' || x == 'tag' ||
        x == 'target' || x == 'hasCatchAll' || x == 'delegateTarget' ||
        x == 'isDelegate' || x == 'numCatches' || x == 'catches' ||
        x == 'catchTags') {
      ret[x] = info[x];
    }
  }
  return ret;
}

function stringify(expr) {
  return JSON.stringify(cleanInfo(binaryen.getExpressionInfo(expr)));
}

var module = new binaryen.Module();
module.setFeatures(binaryen.Features.ReferenceTypes |
                   binaryen.Features.ExceptionHandling);

module.addTag("e", binaryen.Type.i32, binaryen.Type.none);

// (try $l0
//   (do
//     (throw $e (i32.const 0))
//   )
//   (catch
//     (drop (pop i32))
//     (rethrow $l0)
//   )
// )
var throw_ = module.throw("e", [module.i32.const(0)]);
var rethrow = module.rethrow("l0");
var try_catch = module.try(
  "l0",
  throw_,
  ["e"],
  [
    module.block(null,
      [
        module.drop(module.i32.pop()),
        rethrow
      ],
      binaryen.Type.none
    )
  ],
  ''
);

// (try $try_outer
//   (do
//     (try
//       (do
//         (throw $a-tag (i32.const 0))
//       )
//       (delegate $try_outer)
//     )
//   )
//   (catch_all)
// )
var try_delegate = module.try(
  'try_outer',
  module.try(
    '',
    throw_,
    [],
    [],
    'try_outer'
  ),
  [],
  [module.nop()],
  ''
);

// (block $catch_all_dest
//   (try_table (catch_all $catch_all_dest)
//     (throw $e (i32.const 0))
//   )
// )
var try_table = module.try_table(
  module.throw("e", [module.i32.const(0)]),
  [{ tag: null, dest: "catch_all_dest", ref: false }]
);
var try_table_block = module.block("catch_all_dest", [try_table], binaryen.Type.none);

// (throw_ref (ref.null noexn))
var throw_ref = module.throw_ref(module.ref.null(binaryen.HeapType.noexn));

var body = module.block('', [try_catch, try_delegate, try_table_block, throw_ref])
var func = module.addFunction("test", binaryen.Type.none, binaryen.Type.none, [], body);

console.log(module.emitText());
assert(module.validate());

console.log("getExpressionInfo(throw) = " + stringify(throw_));
console.log("getExpressionInfo(rethrow) = " + stringify(rethrow));
console.log("getExpressionInfo(try_catch) = " + stringify(try_catch));
console.log("getExpressionInfo(try_delegate) = " + stringify(try_delegate));
console.log("getExpressionInfo(try_table) = " + stringify(try_table));
console.log("getExpressionInfo(throw_ref) = " + stringify(throw_ref));
