| Index: src/runtime/runtime-wasm.cc
|
| diff --git a/src/runtime/runtime-wasm.cc b/src/runtime/runtime-wasm.cc
|
| index 0a0b3eff70f8c26544852e8bf085dfe7ea8f52f2..e840eb464e9797325d5a89514ff82c3a94b3d3c0 100644
|
| --- a/src/runtime/runtime-wasm.cc
|
| +++ b/src/runtime/runtime-wasm.cc
|
| @@ -61,6 +61,60 @@ RUNTIME_FUNCTION(Runtime_WasmGrowMemory) {
|
| wasm::GrowMemory(isolate, instance, delta_pages));
|
| }
|
|
|
| +RUNTIME_FUNCTION(Runtime_ThrowWasmError) {
|
| + HandleScope scope(isolate);
|
| + DCHECK_EQ(2, args.length());
|
| + CONVERT_SMI_ARG_CHECKED(message_id, 0);
|
| + CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
|
| + Handle<Object> error_obj = isolate->factory()->NewWasmRuntimeError(
|
| + static_cast<MessageTemplate::Template>(message_id));
|
| +
|
| + // For wasm traps, the byte offset (a.k.a source position) can not be
|
| + // determined from relocation info, since the explicit checks for traps
|
| + // converge in one singe block which calls this runtime function.
|
| + // We hence pass the byte offset explicitely, and patch it into the top-most
|
| + // frame (a wasm frame) on the collected stack trace.
|
| + // TODO(wasm): This implementation is temporary, see bug #5007:
|
| + // https://bugs.chromium.org/p/v8/issues/detail?id=5007
|
| + Handle<JSObject> error = Handle<JSObject>::cast(error_obj);
|
| + Handle<Object> stack_trace_obj = JSReceiver::GetDataProperty(
|
| + error, isolate->factory()->stack_trace_symbol());
|
| + // Patch the stack trace (array of <receiver, function, code, position>).
|
| + if (stack_trace_obj->IsJSArray()) {
|
| + Handle<FrameArray> stack_elements(
|
| + FrameArray::cast(JSArray::cast(*stack_trace_obj)->elements()));
|
| + DCHECK(stack_elements->Code(0)->kind() == AbstractCode::WASM_FUNCTION);
|
| + DCHECK(stack_elements->Offset(0)->value() >= 0);
|
| + stack_elements->SetOffset(0, Smi::FromInt(-1 - byte_offset));
|
| + }
|
| +
|
| + // Patch the detailed stack trace (array of JSObjects with various
|
| + // properties).
|
| + Handle<Object> detailed_stack_trace_obj = JSReceiver::GetDataProperty(
|
| + error, isolate->factory()->detailed_stack_trace_symbol());
|
| + if (detailed_stack_trace_obj->IsJSArray()) {
|
| + Handle<FixedArray> stack_elements(
|
| + FixedArray::cast(JSArray::cast(*detailed_stack_trace_obj)->elements()));
|
| + DCHECK_GE(stack_elements->length(), 1);
|
| + Handle<JSObject> top_frame(JSObject::cast(stack_elements->get(0)));
|
| + Handle<String> wasm_offset_key =
|
| + isolate->factory()->InternalizeOneByteString(
|
| + STATIC_CHAR_VECTOR("column"));
|
| + LookupIterator it(top_frame, wasm_offset_key, top_frame,
|
| + LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
|
| + if (it.IsFound()) {
|
| + DCHECK(JSReceiver::GetDataProperty(&it)->IsSmi());
|
| + // Make column number 1-based here.
|
| + Maybe<bool> data_set = JSReceiver::SetDataProperty(
|
| + &it, handle(Smi::FromInt(byte_offset + 1), isolate));
|
| + DCHECK(data_set.IsJust() && data_set.FromJust() == true);
|
| + USE(data_set);
|
| + }
|
| + }
|
| +
|
| + return isolate->Throw(*error_obj);
|
| +}
|
| +
|
| RUNTIME_FUNCTION(Runtime_WasmThrowTypeError) {
|
| HandleScope scope(isolate);
|
| DCHECK_EQ(0, args.length());
|
|
|