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

Unified Diff: test/cctest/wasm/test-run-wasm-module.cc

Issue 2754153002: [wasm] Fix DetachArrayBuffer for WebAssembly.Memory on grow (Closed)
Patch Set: Fix Created 3 years, 9 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
« no previous file with comments | « src/wasm/wasm-module.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/wasm/test-run-wasm-module.cc
diff --git a/test/cctest/wasm/test-run-wasm-module.cc b/test/cctest/wasm/test-run-wasm-module.cc
index a3dd35713dfb23ca4c54fdd2a978716de1b8e544..a6c4d177b7f06cd36633b9e144696135845c0ed0 100644
--- a/test/cctest/wasm/test-run-wasm-module.cc
+++ b/test/cctest/wasm/test-run-wasm-module.cc
@@ -974,3 +974,68 @@ TEST(MemoryWithOOBEmptyDataSegment) {
}
Cleanup();
}
+
+TEST(Run_WasmModule_Buffer_Externalized_GrowMem) {
+ {
+ Isolate* isolate = CcTest::InitIsolateOnce();
+ HandleScope scope(isolate);
+ // Initial memory size = 16 + GrowWebAssemblyMemory(4) + GrowMemory(6)
+ static const int kExpectedValue = 26;
+ TestSignatures sigs;
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
+ ExportAsMain(f);
+ byte code[] = {WASM_GROW_MEMORY(WASM_I32V_1(6)), WASM_DROP,
+ WASM_MEMORY_SIZE};
+ EMIT_CODE_WITH_END(f, code);
+
+ ZoneBuffer buffer(&zone);
+ builder->WriteTo(buffer);
+ testing::SetupIsolateForWasmModule(isolate);
+ ErrorThrower thrower(isolate, "Test");
+ const Handle<WasmInstanceObject> instance =
+ testing::CompileInstantiateWasmModuleForTesting(
+ isolate, &thrower, buffer.begin(), buffer.end(),
+ ModuleOrigin::kWasmOrigin);
+ CHECK(!instance.is_null());
+ MaybeHandle<JSArrayBuffer> maybe_memory =
+ GetInstanceMemory(isolate, instance);
+ Handle<JSArrayBuffer> memory = maybe_memory.ToHandleChecked();
+
+ // Fake the Embedder flow by creating a memory object, externalize and grow.
+ Handle<WasmMemoryObject> mem_obj =
+ WasmMemoryObject::New(isolate, memory, 100);
+
+ // TODO(eholk): Skipping calls to externalize when guard pages are enabled
+ // for now. This will have to be dealt with when turning on guard pages as
+ // currently gin assumes that it can take ownership of the ArrayBuffer.
+ // Potential for crashes as this might lead to externalizing an already
+ // externalized buffer.
+ if (!memory->has_guard_region()) v8::Utils::ToLocal(memory)->Externalize();
+ void* backing_store = memory->backing_store();
+ uint64_t byte_length = NumberToSize(memory->byte_length());
+ uint32_t result = GrowWebAssemblyMemory(isolate, mem_obj, 4);
+ CHECK_EQ(16, result);
+ if (!memory->has_guard_region()) {
+ isolate->array_buffer_allocator()->Free(backing_store, byte_length);
+ }
+ memory = handle(mem_obj->buffer());
+ byte_length = NumberToSize(memory->byte_length());
+ instance->set_memory_buffer(*memory);
+ // Externalize should make no difference without the JS API as in this case
+ // the buffer is not detached.
+ if (!memory->has_guard_region()) v8::Utils::ToLocal(memory)->Externalize();
+ result = testing::RunWasmModuleForTesting(isolate, instance, 0, nullptr,
+ ModuleOrigin::kWasmOrigin);
+ CHECK_EQ(kExpectedValue, result);
+ // Free the buffer as the tracker does not know about it.
+ if (!memory->has_guard_region()) {
+ isolate->array_buffer_allocator()->Free(
+ memory->backing_store(), NumberToSize(memory->byte_length()));
+ }
+ }
+ Cleanup();
+}
« no previous file with comments | « src/wasm/wasm-module.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698