Index: src/wasm/wasm-module.cc |
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc |
index dde1571194105b8b1c89960b8b081611e22ee789..68ee4c0ca5d0780db5aba9a1fae2d9f5f5600cac 100644 |
--- a/src/wasm/wasm-module.cc |
+++ b/src/wasm/wasm-module.cc |
@@ -1381,7 +1381,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate, |
uint32_t size = Smi::cast(metadata->get(kSize))->value(); |
Handle<FixedArray> table = |
metadata->GetValueChecked<FixedArray>(isolate, kTable); |
- wasm::PopulateFunctionTable(table, size, &functions); |
+ PopulateFunctionTable(table, size, &functions); |
} |
instance->SetInternalField(kWasmModuleFunctionTable, *indirect_tables); |
} |
@@ -1756,6 +1756,52 @@ void SetInstanceMemory(Handle<JSObject> instance, JSArrayBuffer* buffer) { |
module->set_ptr_to_heap(buffer); |
} |
+int32_t GrowInstanceMemory(Isolate* isolate, Handle<JSObject> instance, |
+ uint32_t pages) { |
+ Address old_mem_start = nullptr; |
+ uint32_t old_size = 0, new_size = 0; |
+ |
+ MaybeHandle<JSArrayBuffer> maybe_mem_buffer = |
+ GetInstanceMemory(isolate, instance); |
+ Handle<JSArrayBuffer> old_buffer; |
+ if (!maybe_mem_buffer.ToHandle(&old_buffer)) { |
+ // If module object does not have linear memory associated with it, |
+ // Allocate new array buffer of given size. |
+ // TODO(gdeepti): Fix bounds check to take into account size of memtype. |
+ new_size = pages * WasmModule::kPageSize; |
+ // The code generated in the wasm compiler guarantees this precondition. |
+ DCHECK(pages <= WasmModule::kMaxMemPages); |
+ } else { |
+ old_mem_start = static_cast<Address>(old_buffer->backing_store()); |
+ old_size = old_buffer->byte_length()->Number(); |
+ // If the old memory was zero-sized, we should have been in the |
+ // "undefined" case above. |
+ DCHECK_NOT_NULL(old_mem_start); |
+ DCHECK_NE(0, old_size); |
+ DCHECK(old_size + pages * WasmModule::kPageSize <= |
+ std::numeric_limits<uint32_t>::max()); |
+ new_size = old_size + pages * WasmModule::kPageSize; |
+ } |
+ |
+ if (new_size <= old_size || |
+ WasmModule::kMaxMemPages * WasmModule::kPageSize <= new_size) { |
+ return -1; |
+ } |
+ Handle<JSArrayBuffer> buffer = NewArrayBuffer(isolate, new_size); |
+ if (buffer.is_null()) return -1; |
+ Address new_mem_start = static_cast<Address>(buffer->backing_store()); |
+ if (old_size != 0) { |
+ memcpy(new_mem_start, old_mem_start, old_size); |
+ } |
+ SetInstanceMemory(instance, *buffer); |
+ if (!UpdateWasmModuleMemory(instance, old_mem_start, new_mem_start, old_size, |
+ new_size)) { |
+ return -1; |
+ } |
+ DCHECK(old_size % WasmModule::kPageSize == 0); |
+ return (old_size / WasmModule::kPageSize); |
+} |
+ |
namespace testing { |
void ValidateInstancesChain(Isolate* isolate, Handle<JSObject> module_obj, |