| 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()); | 
|  |