|
5 | 5 | package exec |
6 | 6 |
|
7 | 7 | import ( |
| 8 | + "errors" |
8 | 9 | "math" |
9 | 10 | "math/bits" |
10 | 11 | ) |
@@ -34,6 +35,9 @@ func (vm *VM) i32Mul() { |
34 | 35 | func (vm *VM) i32DivS() { |
35 | 36 | v2 := vm.popInt32() |
36 | 37 | v1 := vm.popInt32() |
| 38 | + if v1 == math.MinInt32 && v2 == -1 { |
| 39 | + panic(errors.New("integer overflow")) |
| 40 | + } |
37 | 41 | vm.pushInt32(v1 / v2) |
38 | 42 | } |
39 | 43 |
|
@@ -76,19 +80,19 @@ func (vm *VM) i32Xor() { |
76 | 80 | func (vm *VM) i32Shl() { |
77 | 81 | v2 := vm.popUint32() |
78 | 82 | v1 := vm.popUint32() |
79 | | - vm.pushUint32(v1 << v2) |
| 83 | + vm.pushUint32(v1 << (v2 % 32)) |
80 | 84 | } |
81 | 85 |
|
82 | 86 | func (vm *VM) i32ShrU() { |
83 | 87 | v2 := vm.popUint32() |
84 | 88 | v1 := vm.popUint32() |
85 | | - vm.pushUint32(v1 >> v2) |
| 89 | + vm.pushUint32(v1 >> (v2 % 32)) |
86 | 90 | } |
87 | 91 |
|
88 | 92 | func (vm *VM) i32ShrS() { |
89 | 93 | v2 := vm.popUint32() |
90 | 94 | v1 := vm.popInt32() |
91 | | - vm.pushInt32(v1 >> v2) |
| 95 | + vm.pushInt32(v1 >> (v2 % 32)) |
92 | 96 | } |
93 | 97 |
|
94 | 98 | func (vm *VM) i32Rotl() { |
@@ -194,6 +198,9 @@ func (vm *VM) i64Mul() { |
194 | 198 | func (vm *VM) i64DivS() { |
195 | 199 | v2 := vm.popInt64() |
196 | 200 | v1 := vm.popInt64() |
| 201 | + if v1 == math.MinInt64 && v2 == -1 { |
| 202 | + panic(errors.New("integer overflow")) |
| 203 | + } |
197 | 204 | vm.pushInt64(v1 / v2) |
198 | 205 | } |
199 | 206 |
|
@@ -230,19 +237,19 @@ func (vm *VM) i64Xor() { |
230 | 237 | func (vm *VM) i64Shl() { |
231 | 238 | v2 := vm.popUint64() |
232 | 239 | v1 := vm.popUint64() |
233 | | - vm.pushUint64(v1 << v2) |
| 240 | + vm.pushUint64(v1 << (v2 % 64)) |
234 | 241 | } |
235 | 242 |
|
236 | 243 | func (vm *VM) i64ShrS() { |
237 | 244 | v2 := vm.popUint64() |
238 | 245 | v1 := vm.popInt64() |
239 | | - vm.pushInt64(v1 >> v2) |
| 246 | + vm.pushInt64(v1 >> (v2 % 64)) |
240 | 247 | } |
241 | 248 |
|
242 | 249 | func (vm *VM) i64ShrU() { |
243 | 250 | v2 := vm.popUint64() |
244 | 251 | v1 := vm.popUint64() |
245 | | - vm.pushUint64(v1 >> v2) |
| 252 | + vm.pushUint64(v1 >> (v2 % 64)) |
246 | 253 | } |
247 | 254 |
|
248 | 255 | func (vm *VM) i64Rotl() { |
|
0 commit comments