| 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') { |
| 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.i32, binaryen.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.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()], |
| '' |
| ); |
| |
| var body = module.block('', [try_catch, try_delegate]) |
| var func = module.addFunction("test", binaryen.none, binaryen.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)); |