OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/wasm/wasm-interpreter.h" | 5 #include "src/wasm/wasm-interpreter.h" |
6 | 6 |
7 #include "src/utils.h" | 7 #include "src/utils.h" |
8 #include "src/wasm/ast-decoder.h" | 8 #include "src/wasm/ast-decoder.h" |
9 #include "src/wasm/decoder.h" | 9 #include "src/wasm/decoder.h" |
10 #include "src/wasm/wasm-external-refs.h" | 10 #include "src/wasm/wasm-external-refs.h" |
(...skipping 1401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1412 } | 1412 } |
1413 case kExprCallIndirect: { | 1413 case kExprCallIndirect: { |
1414 CallIndirectOperand operand(&decoder, code->at(pc)); | 1414 CallIndirectOperand operand(&decoder, code->at(pc)); |
1415 uint32_t entry_index = Pop().to<uint32_t>(); | 1415 uint32_t entry_index = Pop().to<uint32_t>(); |
1416 // Assume only one table for now. | 1416 // Assume only one table for now. |
1417 DCHECK_LE(module()->function_tables.size(), 1u); | 1417 DCHECK_LE(module()->function_tables.size(), 1u); |
1418 InterpreterCode* target = codemap()->GetIndirectCode(0, entry_index); | 1418 InterpreterCode* target = codemap()->GetIndirectCode(0, entry_index); |
1419 if (target == nullptr) { | 1419 if (target == nullptr) { |
1420 return DoTrap(kTrapFuncInvalid, pc); | 1420 return DoTrap(kTrapFuncInvalid, pc); |
1421 } else if (target->function->sig_index != operand.index) { | 1421 } else if (target->function->sig_index != operand.index) { |
1422 return DoTrap(kTrapFuncSigMismatch, pc); | 1422 // If not an exact match, we have to do a canonical check. |
| 1423 // TODO(titzer): make this faster with some kind of caching? |
| 1424 const WasmIndirectFunctionTable* table = |
| 1425 &module()->function_tables[0]; |
| 1426 int function_key = table->map.Find(target->function->sig); |
| 1427 if (function_key < 0 || |
| 1428 (function_key != |
| 1429 table->map.Find(module()->signatures[operand.index]))) { |
| 1430 return DoTrap(kTrapFuncSigMismatch, pc); |
| 1431 } |
1423 } | 1432 } |
1424 | 1433 |
1425 DoCall(target, &pc, pc + 1 + operand.length, &limit); | 1434 DoCall(target, &pc, pc + 1 + operand.length, &limit); |
1426 code = target; | 1435 code = target; |
1427 decoder.Reset(code->start, code->end); | 1436 decoder.Reset(code->start, code->end); |
1428 continue; | 1437 continue; |
1429 } | 1438 } |
1430 case kExprGetGlobal: { | 1439 case kExprGetGlobal: { |
1431 GlobalIndexOperand operand(&decoder, code->at(pc)); | 1440 GlobalIndexOperand operand(&decoder, code->at(pc)); |
1432 const WasmGlobal* global = &module()->globals[operand.index]; | 1441 const WasmGlobal* global = &module()->globals[operand.index]; |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1835 | 1844 |
1836 ControlTransferMap WasmInterpreter::ComputeControlTransfersForTesting( | 1845 ControlTransferMap WasmInterpreter::ComputeControlTransfersForTesting( |
1837 Zone* zone, const byte* start, const byte* end) { | 1846 Zone* zone, const byte* start, const byte* end) { |
1838 ControlTransfers targets(zone, nullptr, nullptr, start, end); | 1847 ControlTransfers targets(zone, nullptr, nullptr, start, end); |
1839 return targets.map_; | 1848 return targets.map_; |
1840 } | 1849 } |
1841 | 1850 |
1842 } // namespace wasm | 1851 } // namespace wasm |
1843 } // namespace internal | 1852 } // namespace internal |
1844 } // namespace v8 | 1853 } // namespace v8 |
OLD | NEW |