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

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

Issue 2476643003: [wasm] Fix a memory leak in test-run-wasm-module. (Closed)
Patch Set: Rebase Created 4 years, 1 month 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 45a66957f6aa912fa033ebb06af308b8915bfa13..a9694b4882eda999d762482112fb09adb5d4bd36 100644
--- a/test/cctest/wasm/test-run-wasm-module.cc
+++ b/test/cctest/wasm/test-run-wasm-module.cc
@@ -23,6 +23,16 @@ using namespace v8::internal::compiler;
using namespace v8::internal::wasm;
namespace {
+void Cleanup(Isolate* isolate = nullptr) {
+ // By sending a low memory notifications, we will try hard to collect all
+ // garbage and will therefore also invoke all weak callbacks of actually
+ // unreachable persistent handles.
+ if (!isolate) {
+ isolate = CcTest::InitIsolateOnce();
+ }
+ reinterpret_cast<v8::Isolate*>(isolate)->LowMemoryNotification();
+}
+
void TestModule(Zone* zone, WasmModuleBuilder* builder,
int32_t expected_result) {
ZoneBuffer buffer(zone);
@@ -55,122 +65,141 @@ void ExportAsMain(WasmFunctionBuilder* f) { f->ExportAs(CStrVector("main")); }
} // namespace
TEST(Run_WasmModule_Return114) {
- static const int32_t kReturnValue = 114;
- 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_I8(kReturnValue)};
- f->EmitCode(code, sizeof(code));
- TestModule(&zone, builder, kReturnValue);
+ {
+ static const int32_t kReturnValue = 114;
+ 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_I8(kReturnValue)};
+ f->EmitCode(code, sizeof(code));
+ TestModule(&zone, builder, kReturnValue);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_CallAdd) {
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
- TestSignatures sigs;
+ {
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+ TestSignatures sigs;
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- WasmFunctionBuilder* f1 = builder->AddFunction(sigs.i_ii());
- uint16_t param1 = 0;
- uint16_t param2 = 1;
- byte code1[] = {WASM_I32_ADD(WASM_GET_LOCAL(param1), WASM_GET_LOCAL(param2))};
- f1->EmitCode(code1, sizeof(code1));
+ WasmFunctionBuilder* f1 = builder->AddFunction(sigs.i_ii());
+ uint16_t param1 = 0;
+ uint16_t param2 = 1;
+ byte code1[] = {
+ WASM_I32_ADD(WASM_GET_LOCAL(param1), WASM_GET_LOCAL(param2))};
+ f1->EmitCode(code1, sizeof(code1));
- WasmFunctionBuilder* f2 = builder->AddFunction(sigs.i_v());
+ WasmFunctionBuilder* f2 = builder->AddFunction(sigs.i_v());
- ExportAsMain(f2);
- byte code2[] = {
- WASM_CALL_FUNCTION(f1->func_index(), WASM_I8(77), WASM_I8(22))};
- f2->EmitCode(code2, sizeof(code2));
- TestModule(&zone, builder, 99);
+ ExportAsMain(f2);
+ byte code2[] = {
+ WASM_CALL_FUNCTION(f1->func_index(), WASM_I8(77), WASM_I8(22))};
+ f2->EmitCode(code2, sizeof(code2));
+ TestModule(&zone, builder, 99);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_ReadLoadedDataSegment) {
- static const byte kDataSegmentDest0 = 12;
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
- TestSignatures sigs;
-
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
-
- ExportAsMain(f);
- byte code[] = {
- WASM_LOAD_MEM(MachineType::Int32(), WASM_I8(kDataSegmentDest0))};
- f->EmitCode(code, sizeof(code));
- byte data[] = {0xaa, 0xbb, 0xcc, 0xdd};
- builder->AddDataSegment(data, sizeof(data), kDataSegmentDest0);
- TestModule(&zone, builder, 0xddccbbaa);
+ {
+ static const byte kDataSegmentDest0 = 12;
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+ TestSignatures sigs;
+
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
+
+ ExportAsMain(f);
+ byte code[] = {
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_I8(kDataSegmentDest0))};
+ f->EmitCode(code, sizeof(code));
+ byte data[] = {0xaa, 0xbb, 0xcc, 0xdd};
+ builder->AddDataSegment(data, sizeof(data), kDataSegmentDest0);
+ TestModule(&zone, builder, 0xddccbbaa);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_CheckMemoryIsZero) {
- static const int kCheckSize = 16 * 1024;
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
- TestSignatures sigs;
-
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
-
- uint16_t localIndex = f->AddLocal(kAstI32);
- ExportAsMain(f);
- byte code[] = {WASM_BLOCK_I(
- WASM_WHILE(
- WASM_I32_LTS(WASM_GET_LOCAL(localIndex), WASM_I32V_3(kCheckSize)),
- WASM_IF_ELSE(
- WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(localIndex)),
- WASM_BRV(3, WASM_I8(-1)), WASM_INC_LOCAL_BY(localIndex, 4))),
- WASM_I8(11))};
- f->EmitCode(code, sizeof(code));
- TestModule(&zone, builder, 11);
+ {
+ static const int kCheckSize = 16 * 1024;
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+ TestSignatures sigs;
+
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
+
+ uint16_t localIndex = f->AddLocal(kAstI32);
+ ExportAsMain(f);
+ byte code[] = {WASM_BLOCK_I(
+ WASM_WHILE(
+ WASM_I32_LTS(WASM_GET_LOCAL(localIndex), WASM_I32V_3(kCheckSize)),
+ WASM_IF_ELSE(
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(localIndex)),
+ WASM_BRV(3, WASM_I8(-1)), WASM_INC_LOCAL_BY(localIndex, 4))),
+ WASM_I8(11))};
+ f->EmitCode(code, sizeof(code));
+ TestModule(&zone, builder, 11);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_CallMain_recursive) {
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
- TestSignatures sigs;
-
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
-
- uint16_t localIndex = f->AddLocal(kAstI32);
- ExportAsMain(f);
- byte code[] = {
- WASM_SET_LOCAL(localIndex,
- WASM_LOAD_MEM(MachineType::Int32(), WASM_ZERO)),
- WASM_IF_ELSE_I(WASM_I32_LTS(WASM_GET_LOCAL(localIndex), WASM_I8(5)),
- WASM_SEQ(WASM_STORE_MEM(MachineType::Int32(), WASM_ZERO,
- WASM_INC_LOCAL(localIndex)),
- WASM_CALL_FUNCTION0(0)),
- WASM_I8(55))};
- f->EmitCode(code, sizeof(code));
- TestModule(&zone, builder, 55);
+ {
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+ TestSignatures sigs;
+
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ WasmFunctionBuilder* f = builder->AddFunction(sigs.i_v());
+
+ uint16_t localIndex = f->AddLocal(kAstI32);
+ ExportAsMain(f);
+ byte code[] = {
+ WASM_SET_LOCAL(localIndex,
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_ZERO)),
+ WASM_IF_ELSE_I(WASM_I32_LTS(WASM_GET_LOCAL(localIndex), WASM_I8(5)),
+ WASM_SEQ(WASM_STORE_MEM(MachineType::Int32(), WASM_ZERO,
+ WASM_INC_LOCAL(localIndex)),
+ WASM_CALL_FUNCTION0(0)),
+ WASM_I8(55))};
+ f->EmitCode(code, sizeof(code));
+ TestModule(&zone, builder, 55);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_Global) {
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
- TestSignatures sigs;
-
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- uint32_t global1 = builder->AddGlobal(kAstI32, 0);
- uint32_t global2 = builder->AddGlobal(kAstI32, 0);
- WasmFunctionBuilder* f1 = builder->AddFunction(sigs.i_v());
- byte code1[] = {
- WASM_I32_ADD(WASM_GET_GLOBAL(global1), WASM_GET_GLOBAL(global2))};
- f1->EmitCode(code1, sizeof(code1));
- WasmFunctionBuilder* f2 = builder->AddFunction(sigs.i_v());
- ExportAsMain(f2);
- byte code2[] = {WASM_SET_GLOBAL(global1, WASM_I32V_1(56)),
- WASM_SET_GLOBAL(global2, WASM_I32V_1(41)),
- WASM_RETURN1(WASM_CALL_FUNCTION0(f1->func_index()))};
- f2->EmitCode(code2, sizeof(code2));
- TestModule(&zone, builder, 97);
+ {
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+ TestSignatures sigs;
+
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ uint32_t global1 = builder->AddGlobal(kAstI32, 0);
+ uint32_t global2 = builder->AddGlobal(kAstI32, 0);
+ WasmFunctionBuilder* f1 = builder->AddFunction(sigs.i_v());
+ byte code1[] = {
+ WASM_I32_ADD(WASM_GET_GLOBAL(global1), WASM_GET_GLOBAL(global2))};
+ f1->EmitCode(code1, sizeof(code1));
+ WasmFunctionBuilder* f2 = builder->AddFunction(sigs.i_v());
+ ExportAsMain(f2);
+ byte code2[] = {WASM_SET_GLOBAL(global1, WASM_I32V_1(56)),
+ WASM_SET_GLOBAL(global2, WASM_I32V_1(41)),
+ WASM_RETURN1(WASM_CALL_FUNCTION0(f1->func_index()))};
+ f2->EmitCode(code2, sizeof(code2));
+ TestModule(&zone, builder, 97);
+ }
+ Cleanup();
}
// Approximate gtest TEST_F style, in case we adopt gtest.
@@ -338,75 +367,100 @@ const char* WasmSerializationTest::kFunctionName = "increment";
TEST(DeserializeValidModule) {
WasmSerializationTest test;
- HandleScope scope(test.current_isolate());
- test.DeserializeAndRun();
+ {
+ HandleScope scope(test.current_isolate());
+ test.DeserializeAndRun();
+ }
+ Cleanup(test.current_isolate());
+ Cleanup();
}
TEST(DeserializeMismatchingVersion) {
WasmSerializationTest test;
- HandleScope scope(test.current_isolate());
- test.InvalidateVersion();
- test.DeserializeAndRun();
+ {
+ HandleScope scope(test.current_isolate());
+ test.InvalidateVersion();
+ test.DeserializeAndRun();
+ }
+ Cleanup(test.current_isolate());
+ Cleanup();
}
TEST(DeserializeNoSerializedData) {
WasmSerializationTest test;
- HandleScope scope(test.current_isolate());
- test.ClearSerializedData();
- test.DeserializeAndRun();
+ {
+ HandleScope scope(test.current_isolate());
+ test.ClearSerializedData();
+ test.DeserializeAndRun();
+ }
+ Cleanup(test.current_isolate());
+ Cleanup();
}
TEST(DeserializeWireBytesAndSerializedDataInvalid) {
WasmSerializationTest test;
- HandleScope scope(test.current_isolate());
- test.InvalidateVersion();
- test.InvalidateWireBytes();
- test.Deserialize();
+ {
+ HandleScope scope(test.current_isolate());
+ test.InvalidateVersion();
+ test.InvalidateWireBytes();
+ test.Deserialize();
+ }
+ Cleanup(test.current_isolate());
+ Cleanup();
}
TEST(MemorySize) {
- // Initial memory size is 16, see wasm-module-builder.cc
- static const int kExpectedValue = 16;
- 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_MEMORY_SIZE};
- f->EmitCode(code, sizeof(code));
- TestModule(&zone, builder, kExpectedValue);
+ {
+ // Initial memory size is 16, see wasm-module-builder.cc
+ static const int kExpectedValue = 16;
+ 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_MEMORY_SIZE};
+ f->EmitCode(code, sizeof(code));
+ TestModule(&zone, builder, kExpectedValue);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_MemSize_GrowMem) {
- // Initial memory size = 16 + GrowMemory(10)
- 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_I8(10)), WASM_DROP, WASM_MEMORY_SIZE};
- f->EmitCode(code, sizeof(code));
- TestModule(&zone, builder, kExpectedValue);
+ {
+ // Initial memory size = 16 + GrowMemory(10)
+ 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_I8(10)), WASM_DROP, WASM_MEMORY_SIZE};
+ f->EmitCode(code, sizeof(code));
+ TestModule(&zone, builder, kExpectedValue);
+ }
+ Cleanup();
}
TEST(GrowMemoryZero) {
- // Initial memory size is 16, see wasm-module-builder.cc
- static const int kExpectedValue = 16;
- 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(0))};
- f->EmitCode(code, sizeof(code));
- TestModule(&zone, builder, kExpectedValue);
+ {
+ // Initial memory size is 16, see wasm-module-builder.cc
+ static const int kExpectedValue = 16;
+ 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(0))};
+ f->EmitCode(code, sizeof(code));
+ TestModule(&zone, builder, kExpectedValue);
+ }
+ Cleanup();
}
class InterruptThread : public v8::base::Thread {
@@ -441,273 +495,297 @@ class InterruptThread : public v8::base::Thread {
};
TEST(TestInterruptLoop) {
- // Do not dump the module of this test because it contains an infinite loop.
- if (FLAG_dump_wasm_module) return;
-
- // This test tests that WebAssembly loops can be interrupted, i.e. that if an
- // InterruptCallback is registered by {Isolate::RequestInterrupt}, then the
- // InterruptCallback is eventually called even if a loop in WebAssembly code
- // is executed.
- // Test setup:
- // The main thread executes a WebAssembly function with a loop. In the loop
- // {signal_value_} is written to memory to signal a helper thread that the
- // main thread reached the loop in the WebAssembly program. When the helper
- // thread reads {signal_value_} from memory, it registers the
- // InterruptCallback. Upon exeution, the InterruptCallback write into the
- // WebAssemblyMemory to end the loop in the WebAssembly program.
- TestSignatures sigs;
- Isolate* isolate = CcTest::InitIsolateOnce();
- 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_LOOP(WASM_IFB(
- WASM_NOT(WASM_LOAD_MEM(
+ {
+ // Do not dump the module of this test because it contains an infinite loop.
+ if (FLAG_dump_wasm_module) return;
+
+ // This test tests that WebAssembly loops can be interrupted, i.e. that if
+ // an
+ // InterruptCallback is registered by {Isolate::RequestInterrupt}, then the
+ // InterruptCallback is eventually called even if a loop in WebAssembly code
+ // is executed.
+ // Test setup:
+ // The main thread executes a WebAssembly function with a loop. In the loop
+ // {signal_value_} is written to memory to signal a helper thread that the
+ // main thread reached the loop in the WebAssembly program. When the helper
+ // thread reads {signal_value_} from memory, it registers the
+ // InterruptCallback. Upon exeution, the InterruptCallback write into the
+ // WebAssemblyMemory to end the loop in the WebAssembly program.
+ TestSignatures sigs;
+ Isolate* isolate = CcTest::InitIsolateOnce();
+ 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_LOOP(
+ WASM_IFB(WASM_NOT(WASM_LOAD_MEM(
MachineType::Int32(),
WASM_I32V(InterruptThread::interrupt_location_ * 4))),
WASM_STORE_MEM(MachineType::Int32(), WASM_ZERO,
WASM_I32V(InterruptThread::signal_value_)),
WASM_BR(1))),
- WASM_I32V(121)};
- f->EmitCode(code, sizeof(code));
- ZoneBuffer buffer(&zone);
- builder->WriteTo(buffer);
-
- HandleScope scope(isolate);
- testing::SetupIsolateForWasmModule(isolate);
- ErrorThrower thrower(isolate, "Test");
- const Handle<JSObject> 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();
- int32_t* memory_array = reinterpret_cast<int32_t*>(memory->backing_store());
+ WASM_I32V(121)};
+ f->EmitCode(code, sizeof(code));
+ ZoneBuffer buffer(&zone);
+ builder->WriteTo(buffer);
- InterruptThread thread(isolate, memory_array);
- thread.Start();
- testing::RunWasmModuleForTesting(isolate, instance, 0, nullptr,
- ModuleOrigin::kWasmOrigin);
- int32_t val = memory_array[InterruptThread::interrupt_location_];
- CHECK_EQ(InterruptThread::interrupt_value_,
- ReadLittleEndianValue<int32_t>(&val));
+ HandleScope scope(isolate);
+ testing::SetupIsolateForWasmModule(isolate);
+ ErrorThrower thrower(isolate, "Test");
+ const Handle<JSObject> 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();
+ int32_t* memory_array = reinterpret_cast<int32_t*>(memory->backing_store());
+
+ InterruptThread thread(isolate, memory_array);
+ thread.Start();
+ testing::RunWasmModuleForTesting(isolate, instance, 0, nullptr,
+ ModuleOrigin::kWasmOrigin);
+ int32_t val = memory_array[InterruptThread::interrupt_location_];
+ CHECK_EQ(InterruptThread::interrupt_value_,
+ ReadLittleEndianValue<int32_t>(&val));
+ }
+ Cleanup();
}
TEST(Run_WasmModule_GrowMemoryInIf) {
- 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_IF_ELSE_I(WASM_I32V(0), WASM_GROW_MEMORY(WASM_I32V(1)),
- WASM_I32V(12))};
- f->EmitCode(code, sizeof(code));
- TestModule(&zone, builder, 12);
+ {
+ 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_IF_ELSE_I(WASM_I32V(0), WASM_GROW_MEMORY(WASM_I32V(1)),
+ WASM_I32V(12))};
+ f->EmitCode(code, sizeof(code));
+ TestModule(&zone, builder, 12);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_GrowMemOobOffset) {
- static const int kPageSize = 0x10000;
- // Initial memory size = 16 + GrowMemory(10)
- static const int index = kPageSize * 17 + 4;
- int value = 0xaced;
- 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_I8(1)),
- WASM_STORE_MEM(MachineType::Int32(), WASM_I32V(index), WASM_I32V(value))};
- f->EmitCode(code, sizeof(code));
- TestModuleException(&zone, builder);
+ {
+ static const int kPageSize = 0x10000;
+ // Initial memory size = 16 + GrowMemory(10)
+ static const int index = kPageSize * 17 + 4;
+ int value = 0xaced;
+ 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_I8(1)),
+ WASM_STORE_MEM(MachineType::Int32(), WASM_I32V(index),
+ WASM_I32V(value))};
+ f->EmitCode(code, sizeof(code));
+ TestModuleException(&zone, builder);
+ }
+ Cleanup();
}
TEST(Run_WasmModule_GrowMemOobFixedIndex) {
- static const int kPageSize = 0x10000;
- // Initial memory size = 16 + GrowMemory(10)
- static const int index = kPageSize * 26 + 4;
- int value = 0xaced;
- TestSignatures sigs;
- Isolate* isolate = CcTest::InitIsolateOnce();
- Zone zone(isolate->allocator(), ZONE_NAME);
+ {
+ static const int kPageSize = 0x10000;
+ // Initial memory size = 16 + GrowMemory(10)
+ static const int index = kPageSize * 26 + 4;
+ int value = 0xaced;
+ TestSignatures sigs;
+ Isolate* isolate = CcTest::InitIsolateOnce();
+ Zone zone(isolate->allocator(), ZONE_NAME);
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- WasmFunctionBuilder* f = builder->AddFunction(sigs.i_i());
- ExportAsMain(f);
- byte code[] = {
- WASM_GROW_MEMORY(WASM_GET_LOCAL(0)), WASM_DROP,
- WASM_STORE_MEM(MachineType::Int32(), WASM_I32V(index), WASM_I32V(value)),
- WASM_LOAD_MEM(MachineType::Int32(), WASM_I32V(index))};
- f->EmitCode(code, sizeof(code));
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ WasmFunctionBuilder* f = builder->AddFunction(sigs.i_i());
+ ExportAsMain(f);
+ byte code[] = {WASM_GROW_MEMORY(WASM_GET_LOCAL(0)), WASM_DROP,
+ WASM_STORE_MEM(MachineType::Int32(), WASM_I32V(index),
+ WASM_I32V(value)),
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_I32V(index))};
+ f->EmitCode(code, sizeof(code));
- HandleScope scope(isolate);
- ZoneBuffer buffer(&zone);
- builder->WriteTo(buffer);
- testing::SetupIsolateForWasmModule(isolate);
+ HandleScope scope(isolate);
+ ZoneBuffer buffer(&zone);
+ builder->WriteTo(buffer);
+ testing::SetupIsolateForWasmModule(isolate);
- ErrorThrower thrower(isolate, "Test");
- Handle<JSObject> instance = testing::CompileInstantiateWasmModuleForTesting(
- isolate, &thrower, buffer.begin(), buffer.end(),
- ModuleOrigin::kWasmOrigin);
- CHECK(!instance.is_null());
+ ErrorThrower thrower(isolate, "Test");
+ Handle<JSObject> instance = testing::CompileInstantiateWasmModuleForTesting(
+ isolate, &thrower, buffer.begin(), buffer.end(),
+ ModuleOrigin::kWasmOrigin);
+ CHECK(!instance.is_null());
+
+ // Initial memory size is 16 pages, should trap till index > MemSize on
+ // consecutive GrowMem calls
+ for (uint32_t i = 1; i < 5; i++) {
+ Handle<Object> params[1] = {Handle<Object>(Smi::FromInt(i), isolate)};
+ v8::TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate));
+ testing::RunWasmModuleForTesting(isolate, instance, 1, params,
+ ModuleOrigin::kWasmOrigin);
+ CHECK(try_catch.HasCaught());
+ isolate->clear_pending_exception();
+ }
- // Initial memory size is 16 pages, should trap till index > MemSize on
- // consecutive GrowMem calls
- for (uint32_t i = 1; i < 5; i++) {
- Handle<Object> params[1] = {Handle<Object>(Smi::FromInt(i), isolate)};
- v8::TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate));
- testing::RunWasmModuleForTesting(isolate, instance, 1, params,
- ModuleOrigin::kWasmOrigin);
- CHECK(try_catch.HasCaught());
- isolate->clear_pending_exception();
+ Handle<Object> params[1] = {Handle<Object>(Smi::FromInt(1), isolate)};
+ int32_t result = testing::RunWasmModuleForTesting(
+ isolate, instance, 1, params, ModuleOrigin::kWasmOrigin);
+ CHECK(result == 0xaced);
}
-
- Handle<Object> params[1] = {Handle<Object>(Smi::FromInt(1), isolate)};
- int32_t result = testing::RunWasmModuleForTesting(
- isolate, instance, 1, params, ModuleOrigin::kWasmOrigin);
- CHECK(result == 0xaced);
+ Cleanup();
}
TEST(Run_WasmModule_GrowMemOobVariableIndex) {
- static const int kPageSize = 0x10000;
- int value = 0xaced;
- TestSignatures sigs;
- Isolate* isolate = CcTest::InitIsolateOnce();
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
-
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- WasmFunctionBuilder* f = builder->AddFunction(sigs.i_i());
- ExportAsMain(f);
- byte code[] = {
- WASM_GROW_MEMORY(WASM_I8(1)), WASM_DROP,
- WASM_STORE_MEM(MachineType::Int32(), WASM_GET_LOCAL(0), WASM_I32V(value)),
- WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))};
- f->EmitCode(code, sizeof(code));
+ {
+ static const int kPageSize = 0x10000;
+ int value = 0xaced;
+ TestSignatures sigs;
+ Isolate* isolate = CcTest::InitIsolateOnce();
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
- HandleScope scope(isolate);
- ZoneBuffer buffer(&zone);
- builder->WriteTo(buffer);
- testing::SetupIsolateForWasmModule(isolate);
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ WasmFunctionBuilder* f = builder->AddFunction(sigs.i_i());
+ ExportAsMain(f);
+ byte code[] = {WASM_GROW_MEMORY(WASM_I8(1)), WASM_DROP,
+ WASM_STORE_MEM(MachineType::Int32(), WASM_GET_LOCAL(0),
+ WASM_I32V(value)),
+ WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))};
+ f->EmitCode(code, sizeof(code));
- ErrorThrower thrower(isolate, "Test");
- Handle<JSObject> instance = testing::CompileInstantiateWasmModuleForTesting(
- isolate, &thrower, buffer.begin(), buffer.end(),
- ModuleOrigin::kWasmOrigin);
+ HandleScope scope(isolate);
+ ZoneBuffer buffer(&zone);
+ builder->WriteTo(buffer);
+ testing::SetupIsolateForWasmModule(isolate);
- CHECK(!instance.is_null());
+ ErrorThrower thrower(isolate, "Test");
+ Handle<JSObject> instance = testing::CompileInstantiateWasmModuleForTesting(
+ isolate, &thrower, buffer.begin(), buffer.end(),
+ ModuleOrigin::kWasmOrigin);
+
+ CHECK(!instance.is_null());
+
+ // Initial memory size is 16 pages, should trap till index > MemSize on
+ // consecutive GrowMem calls
+ for (int i = 1; i < 5; i++) {
+ Handle<Object> params[1] = {
+ Handle<Object>(Smi::FromInt((16 + i) * kPageSize - 3), isolate)};
+ v8::TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate));
+ testing::RunWasmModuleForTesting(isolate, instance, 1, params,
+ ModuleOrigin::kWasmOrigin);
+ CHECK(try_catch.HasCaught());
+ isolate->clear_pending_exception();
+ }
+
+ for (int i = 1; i < 5; i++) {
+ Handle<Object> params[1] = {
+ Handle<Object>(Smi::FromInt((20 + i) * kPageSize - 4), isolate)};
+ int32_t result = testing::RunWasmModuleForTesting(
+ isolate, instance, 1, params, ModuleOrigin::kWasmOrigin);
+ CHECK(result == 0xaced);
+ }
- // Initial memory size is 16 pages, should trap till index > MemSize on
- // consecutive GrowMem calls
- for (int i = 1; i < 5; i++) {
- Handle<Object> params[1] = {
- Handle<Object>(Smi::FromInt((16 + i) * kPageSize - 3), isolate)};
v8::TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate));
+ Handle<Object> params[1] = {
+ Handle<Object>(Smi::FromInt(25 * kPageSize), isolate)};
testing::RunWasmModuleForTesting(isolate, instance, 1, params,
ModuleOrigin::kWasmOrigin);
CHECK(try_catch.HasCaught());
isolate->clear_pending_exception();
}
-
- for (int i = 1; i < 5; i++) {
- Handle<Object> params[1] = {
- Handle<Object>(Smi::FromInt((20 + i) * kPageSize - 4), isolate)};
- int32_t result = testing::RunWasmModuleForTesting(
- isolate, instance, 1, params, ModuleOrigin::kWasmOrigin);
- CHECK(result == 0xaced);
- }
-
- v8::TryCatch try_catch(reinterpret_cast<v8::Isolate*>(isolate));
- Handle<Object> params[1] = {
- Handle<Object>(Smi::FromInt(25 * kPageSize), isolate)};
- testing::RunWasmModuleForTesting(isolate, instance, 1, params,
- ModuleOrigin::kWasmOrigin);
- CHECK(try_catch.HasCaught());
- isolate->clear_pending_exception();
+ Cleanup();
}
TEST(Run_WasmModule_Global_init) {
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
- TestSignatures sigs;
-
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- uint32_t global1 =
- builder->AddGlobal(kAstI32, false, false, WasmInitExpr(777777));
- uint32_t global2 =
- builder->AddGlobal(kAstI32, false, false, WasmInitExpr(222222));
- WasmFunctionBuilder* f1 = builder->AddFunction(sigs.i_v());
- byte code[] = {
- WASM_I32_ADD(WASM_GET_GLOBAL(global1), WASM_GET_GLOBAL(global2))};
- f1->EmitCode(code, sizeof(code));
- ExportAsMain(f1);
- TestModule(&zone, builder, 999999);
-}
-
-template <typename CType>
-static void RunWasmModuleGlobalInitTest(LocalType type, CType expected) {
- v8::internal::AccountingAllocator allocator;
- Zone zone(&allocator, ZONE_NAME);
- TestSignatures sigs;
-
- LocalType types[] = {type};
- FunctionSig sig(1, 0, types);
+ {
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+ TestSignatures sigs;
- for (int padding = 0; padding < 5; padding++) {
- // Test with a simple initializer
WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
-
- for (int i = 0; i < padding; i++) { // pad global before
- builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 20000));
- }
- uint32_t global =
- builder->AddGlobal(type, false, false, WasmInitExpr(expected));
- for (int i = 0; i < padding; i++) { // pad global after
- builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 30000));
- }
-
- WasmFunctionBuilder* f1 = builder->AddFunction(&sig);
- byte code[] = {WASM_GET_GLOBAL(global)};
+ uint32_t global1 =
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(777777));
+ uint32_t global2 =
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(222222));
+ WasmFunctionBuilder* f1 = builder->AddFunction(sigs.i_v());
+ byte code[] = {
+ WASM_I32_ADD(WASM_GET_GLOBAL(global1), WASM_GET_GLOBAL(global2))};
f1->EmitCode(code, sizeof(code));
ExportAsMain(f1);
- TestModule(&zone, builder, expected);
+ TestModule(&zone, builder, 999999);
}
+ Cleanup();
+}
- for (int padding = 0; padding < 5; padding++) {
- // Test with a global index
- WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
- for (int i = 0; i < padding; i++) { // pad global before
- builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 40000));
- }
-
- uint32_t global1 =
- builder->AddGlobal(type, false, false, WasmInitExpr(expected));
+template <typename CType>
+static void RunWasmModuleGlobalInitTest(LocalType type, CType expected) {
+ {
+ v8::internal::AccountingAllocator allocator;
+ Zone zone(&allocator, ZONE_NAME);
+ TestSignatures sigs;
- for (int i = 0; i < padding; i++) { // pad global middle
- builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 50000));
+ LocalType types[] = {type};
+ FunctionSig sig(1, 0, types);
+
+ for (int padding = 0; padding < 5; padding++) {
+ // Test with a simple initializer
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+
+ for (int i = 0; i < padding; i++) { // pad global before
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 20000));
+ }
+ uint32_t global =
+ builder->AddGlobal(type, false, false, WasmInitExpr(expected));
+ for (int i = 0; i < padding; i++) { // pad global after
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 30000));
+ }
+
+ WasmFunctionBuilder* f1 = builder->AddFunction(&sig);
+ byte code[] = {WASM_GET_GLOBAL(global)};
+ f1->EmitCode(code, sizeof(code));
+ ExportAsMain(f1);
+ TestModule(&zone, builder, expected);
}
- uint32_t global2 = builder->AddGlobal(
- type, false, false, WasmInitExpr(WasmInitExpr::kGlobalIndex, global1));
-
- for (int i = 0; i < padding; i++) { // pad global after
- builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 60000));
+ for (int padding = 0; padding < 5; padding++) {
+ // Test with a global index
+ WasmModuleBuilder* builder = new (&zone) WasmModuleBuilder(&zone);
+ for (int i = 0; i < padding; i++) { // pad global before
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 40000));
+ }
+
+ uint32_t global1 =
+ builder->AddGlobal(type, false, false, WasmInitExpr(expected));
+
+ for (int i = 0; i < padding; i++) { // pad global middle
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 50000));
+ }
+
+ uint32_t global2 =
+ builder->AddGlobal(type, false, false,
+ WasmInitExpr(WasmInitExpr::kGlobalIndex, global1));
+
+ for (int i = 0; i < padding; i++) { // pad global after
+ builder->AddGlobal(kAstI32, false, false, WasmInitExpr(i + 60000));
+ }
+
+ WasmFunctionBuilder* f1 = builder->AddFunction(&sig);
+ byte code[] = {WASM_GET_GLOBAL(global2)};
+ f1->EmitCode(code, sizeof(code));
+ ExportAsMain(f1);
+ TestModule(&zone, builder, expected);
}
-
- WasmFunctionBuilder* f1 = builder->AddFunction(&sig);
- byte code[] = {WASM_GET_GLOBAL(global2)};
- f1->EmitCode(code, sizeof(code));
- ExportAsMain(f1);
- TestModule(&zone, builder, expected);
}
+ Cleanup();
}
TEST(Run_WasmModule_Global_i32) {
« 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