| 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)); |