diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 17:38:12 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 17:38:12 -0800 |
commit | 8e379d5409507acc75c3c2b1bdf6291297bfdbee (patch) | |
tree | b7dd06eb797070ff88b8b8409cb81d34164e2e44 /src | |
parent | 9f375280e1168645ba9be9a6b5889c58ebcf565a (diff) | |
download | binaryen-8e379d5409507acc75c3c2b1bdf6291297bfdbee.tar.gz binaryen-8e379d5409507acc75c3c2b1bdf6291297bfdbee.tar.bz2 binaryen-8e379d5409507acc75c3c2b1bdf6291297bfdbee.zip |
refactor trap code, and add some CallIndirect traps
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-interpreter.h | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 43efb5c3d..ae3f470ce 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -240,8 +240,10 @@ public: Flow target = visit(curr->target); if (target.breaking()) return target; size_t index = target.value.geti32(); - assert(index < instance.wasm.table.names.size()); - IString name = instance.wasm.table.names[index]; + if (index >= instance.wasm.table.names.size()) trap(); + Name name = instance.wasm.table.names[index]; + Function *func = instance.wasm.functionsMap[name]; + if (func->type.is() && func->type != curr->type->name) trap(); LiteralList arguments; Flow flow = generateArguments(curr->operands, arguments); if (flow.breaking()) return flow; @@ -510,26 +512,26 @@ public: case TruncSFloat32: case TruncSFloat64: { double val = curr->op == TruncSFloat32 ? value.getf32() : value.getf64(); - if (isnan(val)) instance.externalInterface->trap(); + if (isnan(val)) trap(); if (curr->type == i32) { - if (val > (double)INT_MAX || val < (double)INT_MIN) instance.externalInterface->trap(); + if (val > (double)INT_MAX || val < (double)INT_MIN) trap(); return Flow(Literal(int32_t(val))); } else { int64_t converted = val; - if ((val >= 1 && converted <= 0) || val < (double)LLONG_MIN) instance.externalInterface->trap(); + if ((val >= 1 && converted <= 0) || val < (double)LLONG_MIN) trap(); return Flow(Literal(converted)); } } case TruncUFloat32: case TruncUFloat64: { double val = curr->op == TruncUFloat32 ? value.getf32() : value.getf64(); - if (isnan(val)) instance.externalInterface->trap(); + if (isnan(val)) trap(); if (curr->type == i32) { - if (val > (double)UINT_MAX || val <= (double)-1) instance.externalInterface->trap(); + if (val > (double)UINT_MAX || val <= (double)-1) trap(); return Flow(Literal(uint32_t(val))); } else { uint64_t converted = val; - if (converted < val - 1 || val <= (double)-1) instance.externalInterface->trap(); + if (converted < val - 1 || val <= (double)-1) trap(); return Flow(Literal(converted)); } } @@ -566,6 +568,10 @@ public: NOTE_ENTER("Nop"); return Flow(); } + + void trap() { + instance.externalInterface->trap(); + } }; Function *function = functions[name]; |