summaryrefslogtreecommitdiff
path: root/src/wasm-interpreter.h
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-05 19:26:46 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-05 19:29:46 -0800
commitd6837db077213c218599e33042f1006118d97be4 (patch)
treebe9af48c021e213993634776e61e43f56a1c6668 /src/wasm-interpreter.h
parent0f96bc8b34c00562597bbfbacead38d94cd14319 (diff)
downloadbinaryen-d6837db077213c218599e33042f1006118d97be4.tar.gz
binaryen-d6837db077213c218599e33042f1006118d97be4.tar.bz2
binaryen-d6837db077213c218599e33042f1006118d97be4.zip
more int traps
Diffstat (limited to 'src/wasm-interpreter.h')
-rw-r--r--src/wasm-interpreter.h26
1 files changed, 21 insertions, 5 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 100e585d6..5cb1105e8 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -371,14 +371,22 @@ public:
case Mul: return Literal(l * r);
case DivS: {
if (r == 0) trap();
+ if (l == INT32_MIN && r == -1) trap(); // signed division overflow
return Literal(l / r);
}
case DivU: {
if (r == 0) trap();
return Literal(int32_t(uint32_t(l) / uint32_t(r)));
}
- case RemS: return Literal(l % r);
- case RemU: return Literal(int32_t(uint32_t(l) % uint32_t(r)));
+ case RemS: {
+ if (r == 0) trap();
+ if (l == INT32_MIN && r == -1) return Literal(int32_t(0));
+ return Literal(l % r);
+ }
+ case RemU: {
+ if (r == 0) trap();
+ return Literal(int32_t(uint32_t(l) % uint32_t(r)));
+ }
case And: return Literal(l & r);
case Or: return Literal(l | r);
case Xor: return Literal(l ^ r);
@@ -395,14 +403,22 @@ public:
case Mul: return Literal(l * r);
case DivS: {
if (r == 0) trap();
+ if (l == LLONG_MIN && r == -1) trap(); // signed division overflow
return Literal(l / r);
}
case DivU: {
if (r == 0) trap();
- return Literal(int32_t(uint32_t(l) / uint32_t(r)));
+ return Literal(int64_t(uint64_t(l) / uint64_t(r)));
+ }
+ case RemS: {
+ if (r == 0) trap();
+ if (l == LLONG_MIN && r == -1) return Literal(int64_t(0));
+ return Literal(l % r);
+ }
+ case RemU: {
+ if (r == 0) trap();
+ return Literal(int64_t(uint64_t(l) % uint64_t(r)));
}
- case RemS: return Literal(l % r);
- case RemU: return Literal(int64_t(uint64_t(l) % uint64_t(r)));
case And: return Literal(l & r);
case Or: return Literal(l | r);
case Xor: return Literal(l ^ r);