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

Unified Diff: src/frames.cc

Issue 2555243002: [wasm] Fix location for error in asm.js ToNumber conversion (Closed)
Patch Set: Fix gc error by storing callee_pc_address Created 4 years 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/frames.h ('k') | src/isolate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/frames.cc
diff --git a/src/frames.cc b/src/frames.cc
index f34c07ab09c292c1888dc09728ea48a183627604..b171a33eacd3bf001797526c8ee5959ed2b34e22 100644
--- a/src/frames.cc
+++ b/src/frames.cc
@@ -574,6 +574,7 @@ void ExitFrame::ComputeCallerState(State* state) const {
state->fp = Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset);
state->pc_address = ResolveReturnAddressLocation(
reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset));
+ state->callee_pc_address = nullptr;
if (FLAG_enable_embedded_constant_pool) {
state->constant_pool_address = reinterpret_cast<Address*>(
fp() + ExitFrameConstants::kConstantPoolOffset);
@@ -603,7 +604,7 @@ StackFrame::Type ExitFrame::GetStateForFramePointer(Address fp, State* state) {
if (fp == 0) return NONE;
Address sp = ComputeStackPointer(fp);
FillState(fp, sp, state);
- DCHECK(*state->pc_address != NULL);
+ DCHECK_NOT_NULL(*state->pc_address);
return ComputeFrameType(fp);
}
@@ -637,11 +638,12 @@ void ExitFrame::FillState(Address fp, Address sp, State* state) {
state->fp = fp;
state->pc_address = ResolveReturnAddressLocation(
reinterpret_cast<Address*>(sp - 1 * kPCOnStackSize));
+ state->callee_pc_address = nullptr;
// The constant pool recorded in the exit frame is not associated
// with the pc in this state (the return address into a C entry
// stub). ComputeCallerState will retrieve the constant pool
// together with the associated caller pc.
- state->constant_pool_address = NULL;
+ state->constant_pool_address = nullptr;
}
JSFunction* BuiltinExitFrame::function() const {
@@ -745,6 +747,7 @@ void StandardFrame::ComputeCallerState(State* state) const {
state->fp = caller_fp();
state->pc_address = ResolveReturnAddressLocation(
reinterpret_cast<Address*>(ComputePCAddress(fp())));
+ state->callee_pc_address = pc_address();
state->constant_pool_address =
reinterpret_cast<Address*>(ComputeConstantPoolAddress(fp()));
}
@@ -879,7 +882,7 @@ void StubFrame::Iterate(ObjectVisitor* v) const {
Code* StubFrame::unchecked_code() const {
- return static_cast<Code*>(isolate()->FindCodeObject(pc()));
+ return isolate()->FindCodeObject(pc());
}
@@ -1580,11 +1583,25 @@ int WasmFrame::position() const {
isolate());
DCHECK_LE(0, position);
position = WasmCompiledModule::GetAsmJsSourcePosition(
- compiled_module, function_index(), static_cast<uint32_t>(position));
+ compiled_module, function_index(), static_cast<uint32_t>(position),
+ at_to_number_conversion());
}
return position;
}
+bool WasmFrame::at_to_number_conversion() const {
+ // Check whether our callee is a WASM_TO_JS frame, and this frame is at the
+ // ToNumber conversion call.
+ Address callee_pc = reinterpret_cast<Address>(this->callee_pc());
+ Code* code = callee_pc ? isolate()->FindCodeObject(callee_pc) : nullptr;
+ if (!code || code->kind() != Code::WASM_TO_JS_FUNCTION) return false;
+ int offset = static_cast<int>(callee_pc - code->instruction_start());
+ int pos = AbstractCode::cast(code)->SourcePosition(offset);
+ DCHECK(pos == 0 || pos == 1);
+ // The imported call has position 0, ToNumber has position 1.
+ return !!pos;
+}
+
int WasmFrame::LookupExceptionHandlerInTable(int* stack_slots) {
DCHECK_NOT_NULL(stack_slots);
Code* code = LookupCode();
« no previous file with comments | « src/frames.h ('k') | src/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698