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

Unified Diff: src/runtime/runtime-internal.cc

Issue 1924253002: [wasm] Patch trapping position into stack trace (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@pass-wasm-position-to-runtime
Patch Set: Created 4 years, 8 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
Index: src/runtime/runtime-internal.cc
diff --git a/src/runtime/runtime-internal.cc b/src/runtime/runtime-internal.cc
index 0aefae9bf4eb69483fec2b58a71854d8658ae7fb..4a736ff84db80948b20d1ec8aadc805cd0a6805f 100644
--- a/src/runtime/runtime-internal.cc
+++ b/src/runtime/runtime-internal.cc
@@ -101,10 +101,47 @@ RUNTIME_FUNCTION(Runtime_ThrowWasmError) {
DCHECK_EQ(2, args.length());
CONVERT_SMI_ARG_CHECKED(message_id, 0);
CONVERT_SMI_ARG_CHECKED(byte_offset, 1);
- USE(byte_offset); // TODO(clemensh): patch the stack trace with this offset
- Handle<Object> error = isolate->factory()->NewError(
+ Handle<Object> error_obj = isolate->factory()->NewError(
static_cast<MessageTemplate::Template>(message_id));
- return isolate->Throw(*error);
+
+ // Now patch the given byte offset into the top-most frame (which must be a
titzer 2016/04/28 12:07:59 Can you adjust the comments a bit here to explain
Clemens Hammacher 2016/04/28 12:32:12 Done.
+ // wasm frame).
+ 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<FixedArray> stack_elements(
+ FixedArray::cast(JSArray::cast(*stack_trace_obj)->elements()));
+ DCHECK_EQ(1, stack_elements->length() % 4);
+ DCHECK(Code::cast(stack_elements->get(3))->kind() == Code::WASM_FUNCTION);
+ DCHECK(stack_elements->get(4)->IsSmi() &&
+ Smi::cast(stack_elements->get(4))->value() >= 0);
+ stack_elements->set(4, Smi::FromInt(-1 - byte_offset));
+ }
+ Handle<Object> detailed_stack_trace_obj = JSReceiver::GetDataProperty(
+ error, isolate->factory()->detailed_stack_trace_symbol());
+ // Patch the detailed stack trace (array of JSObjects with various
+ // properties).
+ 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("wasmByteOffset"));
+ LookupIterator it(top_frame, wasm_offset_key, top_frame,
+ LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
+ if (it.IsFound()) {
+ DCHECK(JSReceiver::GetDataProperty(&it)->IsSmi());
+ Maybe<bool> data_set = JSReceiver::SetDataProperty(
+ &it, handle(Smi::FromInt(byte_offset), isolate));
+ DCHECK(data_set.IsJust() && data_set.FromJust() == true);
+ }
+ }
+
+ return isolate->Throw(*error_obj);
}
RUNTIME_FUNCTION(Runtime_UnwindAndFindExceptionHandler) {

Powered by Google App Engine
This is Rietveld 408576698