Chromium Code Reviews| Index: src/wasm/ast-decoder.cc |
| diff --git a/src/wasm/ast-decoder.cc b/src/wasm/ast-decoder.cc |
| index 48db8e9e68089e74f6fe6a8b42cadd353178a3dd..fbb3360451c7c6681c8b652160d479f74fde0b67 100644 |
| --- a/src/wasm/ast-decoder.cc |
| +++ b/src/wasm/ast-decoder.cc |
| @@ -1229,7 +1229,14 @@ class WasmFullDecoder : public WasmDecoder { |
| case kExprF64StoreMem: |
| len = DecodeStoreMem(kAstF64, MachineType::Float64()); |
| break; |
| - |
| + case kExprGrowMemory: |
| + if (module_->origin != kAsmJsOrigin) { |
| + Push(kAstI32, BUILD(GrowMemory, Pop(0, kAstI32).node)); |
| + break; |
| + } else { |
| + error("grow_memory is not supported for asmjs modules"); |
| + return; |
|
titzer
2016/09/08 08:16:29
No need to return here; the error will cause the m
ahaas
2016/09/09 10:52:28
Done.
|
| + } |
| case kExprMemorySize: |
| Push(kAstI32, BUILD(MemSize, 0)); |
| break; |
| @@ -1279,8 +1286,36 @@ class WasmFullDecoder : public WasmDecoder { |
| break; |
| } |
| default: |
| - error("Invalid opcode"); |
| - return; |
| + // Deal with special asmjs opcodes. |
| + if (module_->origin == kAsmJsOrigin) { |
| + sig = WasmOpcodes::AsmjsSignature(opcode); |
| + if (sig) { |
| + // Fast case of a simple operator. |
| + TFNode* node; |
|
titzer
2016/09/08 08:16:29
Factor this switch out to an inline method?
ahaas
2016/09/09 10:52:28
Done.
|
| + switch (sig->parameter_count()) { |
| + case 1: { |
| + Value val = Pop(0, sig->GetParam(0)); |
| + node = BUILD(Unop, opcode, val.node, position()); |
| + break; |
| + } |
| + case 2: { |
| + Value rval = Pop(1, sig->GetParam(1)); |
| + Value lval = Pop(0, sig->GetParam(0)); |
| + node = |
| + BUILD(Binop, opcode, lval.node, rval.node, position()); |
| + break; |
| + } |
| + default: |
| + UNREACHABLE(); |
| + node = nullptr; |
| + break; |
| + } |
| + Push(GetReturnType(sig), node); |
| + } |
| + } else { |
| + error("Invalid opcode"); |
| + return; |
| + } |
| } |
| } // end complex bytecode |