summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-05 17:38:12 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-05 17:38:12 -0800
commit8e379d5409507acc75c3c2b1bdf6291297bfdbee (patch)
treeb7dd06eb797070ff88b8b8409cb81d34164e2e44 /src
parent9f375280e1168645ba9be9a6b5889c58ebcf565a (diff)
downloadbinaryen-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.h22
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];