| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <memory> | 5 #include <memory> |
| 6 | 6 |
| 7 #include "src/assembler-inl.h" | 7 #include "src/assembler-inl.h" |
| 8 #include "src/base/adapters.h" | 8 #include "src/base/adapters.h" |
| 9 #include "src/base/atomic-utils.h" | 9 #include "src/base/atomic-utils.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 1256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 //-------------------------------------------------------------------------- | 1267 //-------------------------------------------------------------------------- |
| 1268 int num_imported_functions = ProcessImports(code_table, instance); | 1268 int num_imported_functions = ProcessImports(code_table, instance); |
| 1269 if (num_imported_functions < 0) return nothing; | 1269 if (num_imported_functions < 0) return nothing; |
| 1270 | 1270 |
| 1271 //-------------------------------------------------------------------------- | 1271 //-------------------------------------------------------------------------- |
| 1272 // Process the initialization for the module's globals. | 1272 // Process the initialization for the module's globals. |
| 1273 //-------------------------------------------------------------------------- | 1273 //-------------------------------------------------------------------------- |
| 1274 InitGlobals(); | 1274 InitGlobals(); |
| 1275 | 1275 |
| 1276 //-------------------------------------------------------------------------- | 1276 //-------------------------------------------------------------------------- |
| 1277 // Set up the indirect function tables for the new instance. |
| 1278 //-------------------------------------------------------------------------- |
| 1279 if (function_table_count > 0) InitializeTables(code_table, instance); |
| 1280 |
| 1281 //-------------------------------------------------------------------------- |
| 1277 // Set up the memory for the new instance. | 1282 // Set up the memory for the new instance. |
| 1278 //-------------------------------------------------------------------------- | 1283 //-------------------------------------------------------------------------- |
| 1279 MaybeHandle<JSArrayBuffer> old_memory; | 1284 MaybeHandle<JSArrayBuffer> old_memory; |
| 1280 | 1285 |
| 1281 uint32_t min_mem_pages = module_->min_mem_pages; | 1286 uint32_t min_mem_pages = module_->min_mem_pages; |
| 1282 isolate_->counters()->wasm_min_mem_pages_count()->AddSample(min_mem_pages); | 1287 isolate_->counters()->wasm_min_mem_pages_count()->AddSample(min_mem_pages); |
| 1283 | 1288 |
| 1284 if (!memory_.is_null()) { | 1289 if (!memory_.is_null()) { |
| 1285 // Set externally passed ArrayBuffer non neuterable. | 1290 // Set externally passed ArrayBuffer non neuterable. |
| 1286 memory_->set_is_neuterable(false); | 1291 memory_->set_is_neuterable(false); |
| 1287 | 1292 |
| 1288 DCHECK_IMPLIES(EnableGuardRegions(), module_->origin == kAsmJsOrigin || | 1293 DCHECK_IMPLIES(EnableGuardRegions(), module_->origin == kAsmJsOrigin || |
| 1289 memory_->has_guard_region()); | 1294 memory_->has_guard_region()); |
| 1290 } else if (min_mem_pages > 0) { | 1295 } else if (min_mem_pages > 0) { |
| 1291 memory_ = AllocateMemory(min_mem_pages); | 1296 memory_ = AllocateMemory(min_mem_pages); |
| 1292 if (memory_.is_null()) return nothing; // failed to allocate memory | 1297 if (memory_.is_null()) return nothing; // failed to allocate memory |
| 1293 } | 1298 } |
| 1294 | 1299 |
| 1300 //-------------------------------------------------------------------------- |
| 1301 // Check that indirect function table segments are within bounds. |
| 1302 //-------------------------------------------------------------------------- |
| 1303 for (WasmTableInit& table_init : module_->table_inits) { |
| 1304 DCHECK(table_init.table_index < table_instances_.size()); |
| 1305 uint32_t base = EvalUint32InitExpr(table_init.offset); |
| 1306 uint32_t table_size = |
| 1307 table_instances_[table_init.table_index].function_table->length(); |
| 1308 if (!in_bounds(base, static_cast<uint32_t>(table_init.entries.size()), |
| 1309 table_size)) { |
| 1310 thrower_->LinkError("table initializer is out of bounds"); |
| 1311 return nothing; |
| 1312 } |
| 1313 } |
| 1314 |
| 1315 //-------------------------------------------------------------------------- |
| 1316 // Check that memory segments are within bounds. |
| 1317 //-------------------------------------------------------------------------- |
| 1318 for (WasmDataSegment& seg : module_->data_segments) { |
| 1319 uint32_t base = EvalUint32InitExpr(seg.dest_addr); |
| 1320 uint32_t mem_size = memory_.is_null() |
| 1321 ? 0 : static_cast<uint32_t>(memory_->byte_length()->Number()); |
| 1322 if (!in_bounds(base, seg.source_size, mem_size)) { |
| 1323 thrower_->LinkError("data segment is out of bounds"); |
| 1324 return nothing; |
| 1325 } |
| 1326 } |
| 1327 |
| 1328 //-------------------------------------------------------------------------- |
| 1329 // Initialize memory. |
| 1330 //-------------------------------------------------------------------------- |
| 1295 if (!memory_.is_null()) { | 1331 if (!memory_.is_null()) { |
| 1296 instance->set_memory_buffer(*memory_); | 1332 instance->set_memory_buffer(*memory_); |
| 1297 Address mem_start = static_cast<Address>(memory_->backing_store()); | 1333 Address mem_start = static_cast<Address>(memory_->backing_store()); |
| 1298 uint32_t mem_size = | 1334 uint32_t mem_size = |
| 1299 static_cast<uint32_t>(memory_->byte_length()->Number()); | 1335 static_cast<uint32_t>(memory_->byte_length()->Number()); |
| 1300 if (!LoadDataSegments(mem_start, mem_size)) return nothing; | 1336 LoadDataSegments(mem_start, mem_size); |
| 1301 | 1337 |
| 1302 uint32_t old_mem_size = compiled_module_->mem_size(); | 1338 uint32_t old_mem_size = compiled_module_->mem_size(); |
| 1303 Address old_mem_start = | 1339 Address old_mem_start = |
| 1304 compiled_module_->has_memory() | 1340 compiled_module_->has_memory() |
| 1305 ? static_cast<Address>( | 1341 ? static_cast<Address>( |
| 1306 compiled_module_->memory()->backing_store()) | 1342 compiled_module_->memory()->backing_store()) |
| 1307 : nullptr; | 1343 : nullptr; |
| 1308 RelocateMemoryReferencesInCode(code_table, old_mem_start, mem_start, | 1344 RelocateMemoryReferencesInCode(code_table, old_mem_start, mem_start, |
| 1309 old_mem_size, mem_size); | 1345 old_mem_size, mem_size); |
| 1310 compiled_module_->set_memory(memory_); | 1346 compiled_module_->set_memory(memory_); |
| 1311 } else { | |
| 1312 if (!LoadDataSegments(nullptr, 0)) return nothing; | |
| 1313 } | 1347 } |
| 1314 | 1348 |
| 1315 //-------------------------------------------------------------------------- | 1349 //-------------------------------------------------------------------------- |
| 1316 // Set up the runtime support for the new instance. | 1350 // Set up the runtime support for the new instance. |
| 1317 //-------------------------------------------------------------------------- | 1351 //-------------------------------------------------------------------------- |
| 1318 Handle<WeakCell> weak_link = factory->NewWeakCell(instance); | 1352 Handle<WeakCell> weak_link = factory->NewWeakCell(instance); |
| 1319 | 1353 |
| 1320 for (int i = num_imported_functions + FLAG_skip_compiling_wasm_funcs; | 1354 for (int i = num_imported_functions + FLAG_skip_compiling_wasm_funcs; |
| 1321 i < code_table->length(); ++i) { | 1355 i < code_table->length(); ++i) { |
| 1322 Handle<Code> code = code_table->GetValueChecked<Code>(isolate_, i); | 1356 Handle<Code> code = code_table->GetValueChecked<Code>(isolate_, i); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1336 | 1370 |
| 1337 //-------------------------------------------------------------------------- | 1371 //-------------------------------------------------------------------------- |
| 1338 // Add instance to Memory object | 1372 // Add instance to Memory object |
| 1339 //-------------------------------------------------------------------------- | 1373 //-------------------------------------------------------------------------- |
| 1340 DCHECK(wasm::IsWasmInstance(*instance)); | 1374 DCHECK(wasm::IsWasmInstance(*instance)); |
| 1341 if (instance->has_memory_object()) { | 1375 if (instance->has_memory_object()) { |
| 1342 instance->memory_object()->AddInstance(isolate_, instance); | 1376 instance->memory_object()->AddInstance(isolate_, instance); |
| 1343 } | 1377 } |
| 1344 | 1378 |
| 1345 //-------------------------------------------------------------------------- | 1379 //-------------------------------------------------------------------------- |
| 1346 // Set up the indirect function tables for the new instance. | 1380 // Initialize the indirect function tables. |
| 1347 //-------------------------------------------------------------------------- | 1381 //-------------------------------------------------------------------------- |
| 1348 if (function_table_count > 0) InitializeTables(code_table, instance); | 1382 if (function_table_count > 0) LoadTableSegments(code_table, instance); |
| 1349 | 1383 |
| 1350 // Patch new call sites and the context. | 1384 // Patch new call sites and the context. |
| 1351 PatchDirectCallsAndContext(code_table, compiled_module_, module_, | 1385 PatchDirectCallsAndContext(code_table, compiled_module_, module_, |
| 1352 num_imported_functions); | 1386 num_imported_functions); |
| 1353 | 1387 |
| 1354 FlushICache(isolate_, code_table); | 1388 FlushICache(isolate_, code_table); |
| 1355 | 1389 |
| 1356 //-------------------------------------------------------------------------- | 1390 //-------------------------------------------------------------------------- |
| 1357 // Unpack and notify signal handler of protected instructions. | 1391 // Unpack and notify signal handler of protected instructions. |
| 1358 //-------------------------------------------------------------------------- | 1392 //-------------------------------------------------------------------------- |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1541 case WasmInitExpr::kGlobalIndex: { | 1575 case WasmInitExpr::kGlobalIndex: { |
| 1542 uint32_t offset = module_->globals[expr.val.global_index].offset; | 1576 uint32_t offset = module_->globals[expr.val.global_index].offset; |
| 1543 return *reinterpret_cast<uint32_t*>(raw_buffer_ptr(globals_, offset)); | 1577 return *reinterpret_cast<uint32_t*>(raw_buffer_ptr(globals_, offset)); |
| 1544 } | 1578 } |
| 1545 default: | 1579 default: |
| 1546 UNREACHABLE(); | 1580 UNREACHABLE(); |
| 1547 return 0; | 1581 return 0; |
| 1548 } | 1582 } |
| 1549 } | 1583 } |
| 1550 | 1584 |
| 1585 bool in_bounds(uint32_t offset, uint32_t size, uint32_t upper) { |
| 1586 return offset + size <= upper && offset + size >= offset; |
| 1587 } |
| 1588 |
| 1551 // Load data segments into the memory. | 1589 // Load data segments into the memory. |
| 1552 bool LoadDataSegments(Address mem_addr, size_t mem_size) { | 1590 void LoadDataSegments(Address mem_addr, size_t mem_size) { |
| 1553 Handle<SeqOneByteString> module_bytes(compiled_module_->module_bytes(), | 1591 Handle<SeqOneByteString> module_bytes(compiled_module_->module_bytes(), |
| 1554 isolate_); | 1592 isolate_); |
| 1555 for (const WasmDataSegment& segment : module_->data_segments) { | 1593 for (const WasmDataSegment& segment : module_->data_segments) { |
| 1556 uint32_t source_size = segment.source_size; | 1594 uint32_t source_size = segment.source_size; |
| 1557 // Segments of size == 0 are just nops. | 1595 // Segments of size == 0 are just nops. |
| 1558 if (source_size == 0) continue; | 1596 if (source_size == 0) continue; |
| 1559 uint32_t dest_offset = EvalUint32InitExpr(segment.dest_addr); | 1597 uint32_t dest_offset = EvalUint32InitExpr(segment.dest_addr); |
| 1560 if (dest_offset + source_size > mem_size || | 1598 DCHECK(in_bounds(dest_offset, source_size, |
| 1561 dest_offset + source_size < dest_offset) { | 1599 static_cast<uint32_t>(mem_size))); |
| 1562 thrower_->LinkError("data segment (start = %" PRIu32 ", size = %" PRIu32 | |
| 1563 ") does not fit into memory (size = %" PRIuS ")", | |
| 1564 dest_offset, source_size, mem_size); | |
| 1565 return false; | |
| 1566 } | |
| 1567 byte* dest = mem_addr + dest_offset; | 1600 byte* dest = mem_addr + dest_offset; |
| 1568 const byte* src = reinterpret_cast<const byte*>( | 1601 const byte* src = reinterpret_cast<const byte*>( |
| 1569 module_bytes->GetCharsAddress() + segment.source_offset); | 1602 module_bytes->GetCharsAddress() + segment.source_offset); |
| 1570 memcpy(dest, src, source_size); | 1603 memcpy(dest, src, source_size); |
| 1571 } | 1604 } |
| 1572 return true; | |
| 1573 } | 1605 } |
| 1574 | 1606 |
| 1575 void WriteGlobalValue(WasmGlobal& global, Handle<Object> value) { | 1607 void WriteGlobalValue(WasmGlobal& global, Handle<Object> value) { |
| 1576 double num = 0; | 1608 double num = 0; |
| 1577 if (value->IsSmi()) { | 1609 if (value->IsSmi()) { |
| 1578 num = Smi::cast(*value)->value(); | 1610 num = Smi::cast(*value)->value(); |
| 1579 } else if (value->IsHeapNumber()) { | 1611 } else if (value->IsHeapNumber()) { |
| 1580 num = HeapNumber::cast(*value)->value(); | 1612 num = HeapNumber::cast(*value)->value(); |
| 1581 } else { | 1613 } else { |
| 1582 UNREACHABLE(); | 1614 UNREACHABLE(); |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2026 if (module_->origin == kWasmOrigin) { | 2058 if (module_->origin == kWasmOrigin) { |
| 2027 v8::Maybe<bool> success = JSReceiver::SetIntegrityLevel( | 2059 v8::Maybe<bool> success = JSReceiver::SetIntegrityLevel( |
| 2028 exports_object, FROZEN, Object::DONT_THROW); | 2060 exports_object, FROZEN, Object::DONT_THROW); |
| 2029 DCHECK(success.FromMaybe(false)); | 2061 DCHECK(success.FromMaybe(false)); |
| 2030 USE(success); | 2062 USE(success); |
| 2031 } | 2063 } |
| 2032 } | 2064 } |
| 2033 | 2065 |
| 2034 void InitializeTables(Handle<FixedArray> code_table, | 2066 void InitializeTables(Handle<FixedArray> code_table, |
| 2035 Handle<WasmInstanceObject> instance) { | 2067 Handle<WasmInstanceObject> instance) { |
| 2036 Handle<FixedArray> old_function_tables = | |
| 2037 compiled_module_->function_tables(); | |
| 2038 Handle<FixedArray> old_signature_tables = | |
| 2039 compiled_module_->signature_tables(); | |
| 2040 int function_table_count = | 2068 int function_table_count = |
| 2041 static_cast<int>(module_->function_tables.size()); | 2069 static_cast<int>(module_->function_tables.size()); |
| 2042 Handle<FixedArray> new_function_tables = | 2070 Handle<FixedArray> new_function_tables = |
| 2043 isolate_->factory()->NewFixedArray(function_table_count); | 2071 isolate_->factory()->NewFixedArray(function_table_count); |
| 2044 Handle<FixedArray> new_signature_tables = | 2072 Handle<FixedArray> new_signature_tables = |
| 2045 isolate_->factory()->NewFixedArray(function_table_count); | 2073 isolate_->factory()->NewFixedArray(function_table_count); |
| 2046 for (int index = 0; index < function_table_count; ++index) { | 2074 for (int index = 0; index < function_table_count; ++index) { |
| 2047 WasmIndirectFunctionTable& table = module_->function_tables[index]; | 2075 WasmIndirectFunctionTable& table = module_->function_tables[index]; |
| 2048 TableInstance& table_instance = table_instances_[index]; | 2076 TableInstance& table_instance = table_instances_[index]; |
| 2049 int table_size = static_cast<int>(table.min_size); | 2077 int table_size = static_cast<int>(table.min_size); |
| 2050 | 2078 |
| 2051 if (table_instance.function_table.is_null()) { | 2079 if (table_instance.function_table.is_null()) { |
| 2052 // Create a new dispatch table if necessary. | 2080 // Create a new dispatch table if necessary. |
| 2053 table_instance.function_table = | 2081 table_instance.function_table = |
| 2054 isolate_->factory()->NewFixedArray(table_size); | 2082 isolate_->factory()->NewFixedArray(table_size); |
| 2055 table_instance.signature_table = | 2083 table_instance.signature_table = |
| 2056 isolate_->factory()->NewFixedArray(table_size); | 2084 isolate_->factory()->NewFixedArray(table_size); |
| 2057 for (int i = 0; i < table_size; ++i) { | 2085 for (int i = 0; i < table_size; ++i) { |
| 2058 // Fill the table with invalid signature indexes so that | 2086 // Fill the table with invalid signature indexes so that |
| 2059 // uninitialized entries will always fail the signature check. | 2087 // uninitialized entries will always fail the signature check. |
| 2060 table_instance.signature_table->set(i, | 2088 table_instance.signature_table->set(i, |
| 2061 Smi::FromInt(kInvalidSigIndex)); | 2089 Smi::FromInt(kInvalidSigIndex)); |
| 2062 } | 2090 } |
| 2063 } | 2091 } |
| 2064 | 2092 |
| 2065 new_function_tables->set(static_cast<int>(index), | 2093 new_function_tables->set(static_cast<int>(index), |
| 2066 *table_instance.function_table); | 2094 *table_instance.function_table); |
| 2067 new_signature_tables->set(static_cast<int>(index), | 2095 new_signature_tables->set(static_cast<int>(index), |
| 2068 *table_instance.signature_table); | 2096 *table_instance.signature_table); |
| 2097 } |
| 2098 |
| 2099 // Patch all code that has references to the old indirect tables. |
| 2100 Handle<FixedArray> old_function_tables = |
| 2101 compiled_module_->function_tables(); |
| 2102 Handle<FixedArray> old_signature_tables = |
| 2103 compiled_module_->signature_tables(); |
| 2104 for (int i = 0; i < code_table->length(); ++i) { |
| 2105 if (!code_table->get(i)->IsCode()) continue; |
| 2106 Handle<Code> code(Code::cast(code_table->get(i)), isolate_); |
| 2107 for (int j = 0; j < function_table_count; ++j) { |
| 2108 ReplaceReferenceInCode( |
| 2109 code, Handle<Object>(old_function_tables->get(j), isolate_), |
| 2110 Handle<Object>(new_function_tables->get(j), isolate_)); |
| 2111 ReplaceReferenceInCode( |
| 2112 code, Handle<Object>(old_signature_tables->get(j), isolate_), |
| 2113 Handle<Object>(new_signature_tables->get(j), isolate_)); |
| 2114 } |
| 2115 } |
| 2116 compiled_module_->set_function_tables(new_function_tables); |
| 2117 compiled_module_->set_signature_tables(new_signature_tables); |
| 2118 } |
| 2119 |
| 2120 void LoadTableSegments(Handle<FixedArray> code_table, |
| 2121 Handle<WasmInstanceObject> instance) { |
| 2122 int function_table_count = |
| 2123 static_cast<int>(module_->function_tables.size()); |
| 2124 for (int index = 0; index < function_table_count; ++index) { |
| 2125 WasmIndirectFunctionTable& table = module_->function_tables[index]; |
| 2126 TableInstance& table_instance = table_instances_[index]; |
| 2069 | 2127 |
| 2070 Handle<FixedArray> all_dispatch_tables; | 2128 Handle<FixedArray> all_dispatch_tables; |
| 2071 if (!table_instance.table_object.is_null()) { | 2129 if (!table_instance.table_object.is_null()) { |
| 2072 // Get the existing dispatch table(s) with the WebAssembly.Table object. | 2130 // Get the existing dispatch table(s) with the WebAssembly.Table object. |
| 2073 all_dispatch_tables = WasmTableObject::AddDispatchTable( | 2131 all_dispatch_tables = WasmTableObject::AddDispatchTable( |
| 2074 isolate_, table_instance.table_object, | 2132 isolate_, table_instance.table_object, |
| 2075 Handle<WasmInstanceObject>::null(), index, | 2133 Handle<WasmInstanceObject>::null(), index, |
| 2076 Handle<FixedArray>::null(), Handle<FixedArray>::null()); | 2134 Handle<FixedArray>::null(), Handle<FixedArray>::null()); |
| 2077 } | 2135 } |
| 2078 | 2136 |
| 2079 // TODO(titzer): this does redundant work if there are multiple tables, | 2137 // TODO(titzer): this does redundant work if there are multiple tables, |
| 2080 // since initializations are not sorted by table index. | 2138 // since initializations are not sorted by table index. |
| 2081 for (auto table_init : module_->table_inits) { | 2139 for (auto table_init : module_->table_inits) { |
| 2082 uint32_t base = EvalUint32InitExpr(table_init.offset); | 2140 uint32_t base = EvalUint32InitExpr(table_init.offset); |
| 2083 if (base > static_cast<uint32_t>(table_size) || | 2141 DCHECK(in_bounds(base, static_cast<uint32_t>(table_init.entries.size()), |
| 2084 (base + table_init.entries.size() > | 2142 table_instance.function_table->length())); |
| 2085 static_cast<uint32_t>(table_size))) { | |
| 2086 thrower_->LinkError("table initializer is out of bounds"); | |
| 2087 continue; | |
| 2088 } | |
| 2089 for (int i = 0; i < static_cast<int>(table_init.entries.size()); ++i) { | 2143 for (int i = 0; i < static_cast<int>(table_init.entries.size()); ++i) { |
| 2090 uint32_t func_index = table_init.entries[i]; | 2144 uint32_t func_index = table_init.entries[i]; |
| 2091 WasmFunction* function = &module_->functions[func_index]; | 2145 WasmFunction* function = &module_->functions[func_index]; |
| 2092 int table_index = static_cast<int>(i + base); | 2146 int table_index = static_cast<int>(i + base); |
| 2093 int32_t sig_index = table.map.Find(function->sig); | 2147 int32_t sig_index = table.map.Find(function->sig); |
| 2094 DCHECK_GE(sig_index, 0); | 2148 DCHECK_GE(sig_index, 0); |
| 2095 table_instance.signature_table->set(table_index, | 2149 table_instance.signature_table->set(table_index, |
| 2096 Smi::FromInt(sig_index)); | 2150 Smi::FromInt(sig_index)); |
| 2097 table_instance.function_table->set(table_index, | 2151 table_instance.function_table->set(table_index, |
| 2098 code_table->get(func_index)); | 2152 code_table->get(func_index)); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2141 // TODO(titzer): we add the new dispatch table at the end to avoid | 2195 // TODO(titzer): we add the new dispatch table at the end to avoid |
| 2142 // redundant work and also because the new instance is not yet fully | 2196 // redundant work and also because the new instance is not yet fully |
| 2143 // initialized. | 2197 // initialized. |
| 2144 if (!table_instance.table_object.is_null()) { | 2198 if (!table_instance.table_object.is_null()) { |
| 2145 // Add the new dispatch table to the WebAssembly.Table object. | 2199 // Add the new dispatch table to the WebAssembly.Table object. |
| 2146 all_dispatch_tables = WasmTableObject::AddDispatchTable( | 2200 all_dispatch_tables = WasmTableObject::AddDispatchTable( |
| 2147 isolate_, table_instance.table_object, instance, index, | 2201 isolate_, table_instance.table_object, instance, index, |
| 2148 table_instance.function_table, table_instance.signature_table); | 2202 table_instance.function_table, table_instance.signature_table); |
| 2149 } | 2203 } |
| 2150 } | 2204 } |
| 2151 // Patch all code that has references to the old indirect tables. | |
| 2152 for (int i = 0; i < code_table->length(); ++i) { | |
| 2153 if (!code_table->get(i)->IsCode()) continue; | |
| 2154 Handle<Code> code(Code::cast(code_table->get(i)), isolate_); | |
| 2155 for (int j = 0; j < function_table_count; ++j) { | |
| 2156 ReplaceReferenceInCode( | |
| 2157 code, Handle<Object>(old_function_tables->get(j), isolate_), | |
| 2158 Handle<Object>(new_function_tables->get(j), isolate_)); | |
| 2159 ReplaceReferenceInCode( | |
| 2160 code, Handle<Object>(old_signature_tables->get(j), isolate_), | |
| 2161 Handle<Object>(new_signature_tables->get(j), isolate_)); | |
| 2162 } | |
| 2163 } | |
| 2164 compiled_module_->set_function_tables(new_function_tables); | |
| 2165 compiled_module_->set_signature_tables(new_signature_tables); | |
| 2166 } | 2205 } |
| 2167 }; | 2206 }; |
| 2168 | 2207 |
| 2169 // Instantiates a WASM module, creating a WebAssembly.Instance from a | 2208 // Instantiates a WASM module, creating a WebAssembly.Instance from a |
| 2170 // WebAssembly.Module. | 2209 // WebAssembly.Module. |
| 2171 MaybeHandle<WasmInstanceObject> WasmModule::Instantiate( | 2210 MaybeHandle<WasmInstanceObject> WasmModule::Instantiate( |
| 2172 Isolate* isolate, ErrorThrower* thrower, | 2211 Isolate* isolate, ErrorThrower* thrower, |
| 2173 Handle<WasmModuleObject> wasm_module, Handle<JSReceiver> ffi, | 2212 Handle<WasmModuleObject> wasm_module, Handle<JSReceiver> ffi, |
| 2174 Handle<JSArrayBuffer> memory) { | 2213 Handle<JSArrayBuffer> memory) { |
| 2175 WasmInstanceBuilder builder(isolate, thrower, wasm_module, ffi, memory); | 2214 WasmInstanceBuilder builder(isolate, thrower, wasm_module, ffi, memory); |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2642 | 2681 |
| 2643 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), | 2682 JSObject::AddProperty(entry, name_string, export_name.ToHandleChecked(), |
| 2644 NONE); | 2683 NONE); |
| 2645 JSObject::AddProperty(entry, kind_string, export_kind, NONE); | 2684 JSObject::AddProperty(entry, kind_string, export_kind, NONE); |
| 2646 | 2685 |
| 2647 storage->set(index, *entry); | 2686 storage->set(index, *entry); |
| 2648 } | 2687 } |
| 2649 | 2688 |
| 2650 return array_object; | 2689 return array_object; |
| 2651 } | 2690 } |
| OLD | NEW |