Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(213)

Unified Diff: src/wasm/wasm-module.cc

Issue 2396473003: [wasm] Refactor GrowMemory runtime call. (Closed)
Patch Set: Rebase again for weird trybot failures Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/wasm/wasm-module.h ('K') | « src/wasm/wasm-module.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-module.cc
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
index dde1571194105b8b1c89960b8b081611e22ee789..4365b42289538891aeb4aada1b75569a8d1da66b 100644
--- a/src/wasm/wasm-module.cc
+++ b/src/wasm/wasm-module.cc
@@ -1756,6 +1756,73 @@ 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, new_mem_start;
Mircea Trofin 2016/10/04 22:01:53 could you please initialize all these and the uint
gdeepti 2016/10/05 02:59:57 Done.
+ uint32_t old_size, new_size;
+
+ 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.
+ old_mem_start = nullptr;
+ old_size = 0;
+ // TODO(gdeepti): Fix bounds check to take into account size of memtype.
+ new_size = pages * wasm::WasmModule::kPageSize;
+ // The code generated in the wasm compiler guarantees this precondition.
+ DCHECK(pages <= wasm::WasmModule::kMaxMemPages);
+ new_mem_start =
+ static_cast<Address>(isolate->array_buffer_allocator()->Allocate(
+ static_cast<uint32_t>(new_size)));
+ if (new_mem_start == NULL) {
Mircea Trofin 2016/10/04 22:01:53 nullptr?
gdeepti 2016/10/05 02:59:56 Used NewArrayBuffer method instead of allocating,
+ return -1;
+ }
+#if DEBUG
+ // Double check the API allocator actually zero-initialized the memory.
Mircea Trofin 2016/10/04 22:01:53 could you encapsulate this and then reuse it below
gdeepti 2016/10/05 02:59:56 Used NewArrayBuffer method instead which sets up a
+ for (size_t i = old_size; i < new_size; i++) {
+ DCHECK_EQ(0, new_mem_start[i]);
+ }
+#endif
+ } 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);
+
+ new_size = old_size + pages * wasm::WasmModule::kPageSize;
Mircea Trofin 2016/10/04 22:01:53 In addition to the check below, we should check th
gdeepti 2016/10/05 02:59:57 Done.
+ if (new_size >
+ wasm::WasmModule::kMaxMemPages * wasm::WasmModule::kPageSize) {
+ return -1;
+ }
+ new_mem_start =
+ static_cast<Address>(isolate->array_buffer_allocator()->Allocate(
+ static_cast<uint32_t>(new_size)));
Mircea Trofin 2016/10/04 22:01:53 this static_cast is unnecessary, new_size is uint3
gdeepti 2016/10/05 02:59:57 Done.
+ if (new_mem_start == NULL) {
Mircea Trofin 2016/10/04 22:01:53 nullptr
gdeepti 2016/10/05 02:59:57 Used NewArrayBuffer method instead of allocating,
+ return -1;
+ }
+#if DEBUG
+ // Double check the API allocator actually zero-initialized the memory.
+ for (size_t i = old_size; i < new_size; i++) {
+ DCHECK_EQ(0, new_mem_start[i]);
+ }
+#endif
+ memcpy(new_mem_start, old_mem_start, old_size);
Mircea Trofin 2016/10/04 22:01:53 we should check earlier that old_size <= new_size,
gdeepti 2016/10/05 02:59:57 Done.
+ }
+
+ Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer();
+ JSArrayBuffer::Setup(buffer, isolate, false, new_mem_start, new_size);
+ wasm::SetInstanceMemory(instance, *buffer);
+ if (!UpdateWasmModuleMemory(instance, old_mem_start, new_mem_start, old_size,
+ new_size)) {
+ return -1;
+ }
+ return (old_size / WasmModule::kPageSize);
Mircea Trofin 2016/10/04 22:01:53 A DCHECK here that old_size % WasmModule::kPageSiz
gdeepti 2016/10/05 02:59:57 Done.
+}
+
namespace testing {
void ValidateInstancesChain(Isolate* isolate, Handle<JSObject> module_obj,
« src/wasm/wasm-module.h ('K') | « src/wasm/wasm-module.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698