| Index: test/cctest/wasm/test-wasm-trap-position.cc
|
| diff --git a/test/cctest/wasm/test-wasm-stack.cc b/test/cctest/wasm/test-wasm-trap-position.cc
|
| similarity index 66%
|
| copy from test/cctest/wasm/test-wasm-stack.cc
|
| copy to test/cctest/wasm/test-wasm-trap-position.cc
|
| index d32a2efb39c0001b50f9faa9025d1d319e66e9a5..13f2929ede8196b0ffde06ed4f5c8a4690568791 100644
|
| --- a/test/cctest/wasm/test-wasm-stack.cc
|
| +++ b/test/cctest/wasm/test-wasm-trap-position.cc
|
| @@ -31,19 +31,6 @@ namespace {
|
| } \
|
| } while (0)
|
|
|
| -void PrintStackTrace(v8::Local<v8::StackTrace> stack) {
|
| - printf("Stack Trace (length %d):\n", stack->GetFrameCount());
|
| - for (int i = 0, e = stack->GetFrameCount(); i != e; ++i) {
|
| - v8::Local<v8::StackFrame> frame = stack->GetFrame(i);
|
| - v8::Local<v8::String> script = frame->GetScriptName();
|
| - v8::Local<v8::String> func = frame->GetFunctionName();
|
| - printf("[%d] (%s) %s:%d:%d\n", i,
|
| - script.IsEmpty() ? "<null>" : *v8::String::Utf8Value(script),
|
| - func.IsEmpty() ? "<null>" : *v8::String::Utf8Value(func),
|
| - frame->GetLineNumber(), frame->GetColumn());
|
| - }
|
| -}
|
| -
|
| struct ExceptionInfo {
|
| const char* func_name;
|
| int line_nr;
|
| @@ -59,7 +46,6 @@ void CheckExceptionInfos(Isolate* isolate, Handle<Object> exc,
|
| // Extract stack frame from the exception.
|
| Local<v8::Value> localExc = Utils::ToLocal(exc);
|
| v8::Local<v8::StackTrace> stack = v8::Exception::GetStackTrace(localExc);
|
| - PrintStackTrace(stack);
|
| CHECK(!stack.IsEmpty());
|
| CHECK_EQ(N, stack->GetFrameCount());
|
|
|
| @@ -74,27 +60,19 @@ void CheckExceptionInfos(Isolate* isolate, Handle<Object> exc,
|
|
|
| } // namespace
|
|
|
| -// Call from JS to WASM to JS and throw an Error from JS.
|
| -TEST(CollectDetailedWasmStack_ExplicitThrowFromJs) {
|
| +// Trigger a trap for executing unreachable.
|
| +TEST(Unreachable) {
|
| TestSignatures sigs;
|
| TestingModule module;
|
|
|
| - // Initialize WasmFunctionCompiler first, since it sets up the HandleScope.
|
| - WasmFunctionCompiler comp1(sigs.v_v(), &module);
|
| -
|
| - uint32_t js_throwing_index = module.AddJsFunction(
|
| - sigs.v_v(),
|
| - "(function js() {\n function a() {\n throw new Error(); };\n a(); })");
|
| -
|
| - // Add a nop such that we don't always get position 1.
|
| - BUILD(comp1, WASM_NOP, WASM_CALL_FUNCTION0(js_throwing_index));
|
| + WasmFunctionCompiler comp1(sigs.v_v(), &module,
|
| + ArrayVector("exec_unreachable"));
|
| + // Set the execution context, such that a runtime error can be thrown.
|
| + comp1.SetModuleContext();
|
| + BUILD(comp1, WASM_UNREACHABLE);
|
| uint32_t wasm_index = comp1.CompileAndAdd();
|
|
|
| - WasmFunctionCompiler comp2(sigs.v_v(), &module);
|
| - BUILD(comp2, WASM_CALL_FUNCTION0(wasm_index));
|
| - uint32_t wasm_index_2 = comp2.CompileAndAdd();
|
| -
|
| - Handle<JSFunction> js_wasm_wrapper = module.WrapCode(wasm_index_2);
|
| + Handle<JSFunction> js_wasm_wrapper = module.WrapCode(wasm_index);
|
|
|
| Handle<JSFunction> js_trampoline = Handle<JSFunction>::cast(
|
| v8::Utils::OpenHandle(*v8::Local<v8::Function>::Cast(
|
| @@ -110,33 +88,29 @@ TEST(CollectDetailedWasmStack_ExplicitThrowFromJs) {
|
| Execution::TryCall(isolate, js_trampoline, global, 1, args, &maybe_exc);
|
| CHECK(returnObjMaybe.is_null());
|
|
|
| - // Line number is 1-based, with 0 == kNoLineNumberInfo.
|
| ExceptionInfo expected_exceptions[] = {
|
| - {"a", 3, 8}, // -
|
| - {"js", 4, 2}, // -
|
| - {"<WASM>", static_cast<int>(wasm_index), 2}, // -
|
| - {"<WASM>", static_cast<int>(wasm_index_2), 1}, // -
|
| - {"callFn", 1, 24} // -
|
| + {"<WASM>", static_cast<int>(wasm_index), 1}, // --
|
| + {"callFn", 1, 24} // --
|
| };
|
| CheckExceptionInfos(isolate, maybe_exc.ToHandleChecked(),
|
| expected_exceptions);
|
| }
|
|
|
| -// Trigger a trap in WASM, stack should be JS -> WASM -> WASM.
|
| -TEST(CollectDetailedWasmStack_WasmError) {
|
| +// Trigger a trap for loading from out-of-bounds.
|
| +TEST(IllegalLoad) {
|
| TestSignatures sigs;
|
| TestingModule module;
|
|
|
| - WasmFunctionCompiler comp1(sigs.i_v(), &module,
|
| - ArrayVector("exec_unreachable"));
|
| + WasmFunctionCompiler comp1(sigs.v_v(), &module, ArrayVector("mem_oob"));
|
| // Set the execution context, such that a runtime error can be thrown.
|
| comp1.SetModuleContext();
|
| - BUILD(comp1, WASM_UNREACHABLE);
|
| + BUILD(comp1, WASM_IF(WASM_ONE,
|
| + WASM_LOAD_MEM(MachineType::Int32(), WASM_I32V_1(-3))));
|
| uint32_t wasm_index = comp1.CompileAndAdd();
|
|
|
| - WasmFunctionCompiler comp2(sigs.i_v(), &module,
|
| - ArrayVector("call_exec_unreachable"));
|
| - BUILD(comp2, WASM_CALL_FUNCTION0(wasm_index));
|
| + WasmFunctionCompiler comp2(sigs.v_v(), &module, ArrayVector("call_mem_oob"));
|
| + // Insert a NOP such that the position of the call is not one.
|
| + BUILD(comp2, WASM_NOP, WASM_CALL_FUNCTION0(wasm_index));
|
| uint32_t wasm_index_2 = comp2.CompileAndAdd();
|
|
|
| Handle<JSFunction> js_wasm_wrapper = module.WrapCode(wasm_index_2);
|
| @@ -151,16 +125,15 @@ TEST(CollectDetailedWasmStack_WasmError) {
|
| Handle<Object> global(isolate->context()->global_object(), isolate);
|
| MaybeHandle<Object> maybe_exc;
|
| Handle<Object> args[] = {js_wasm_wrapper};
|
| - MaybeHandle<Object> maybe_return_obj =
|
| + MaybeHandle<Object> returnObjMaybe =
|
| Execution::TryCall(isolate, js_trampoline, global, 1, args, &maybe_exc);
|
| - CHECK(maybe_return_obj.is_null());
|
| + CHECK(returnObjMaybe.is_null());
|
|
|
| // Line number is 1-based, with 0 == kNoLineNumberInfo.
|
| ExceptionInfo expected_exceptions[] = {
|
| - // TODO(clemens): position should be 1
|
| - {"<WASM>", static_cast<int>(wasm_index), -1}, // -
|
| - {"<WASM>", static_cast<int>(wasm_index_2), 1}, // -
|
| - {"callFn", 1, 24} //-
|
| + {"<WASM>", static_cast<int>(wasm_index), 6}, // --
|
| + {"<WASM>", static_cast<int>(wasm_index_2), 2}, // --
|
| + {"callFn", 1, 24} // --
|
| };
|
| CheckExceptionInfos(isolate, maybe_exc.ToHandleChecked(),
|
| expected_exceptions);
|
|
|