Commit 22a2ae07 authored by mstarzinger's avatar mstarzinger Committed by Commit bot

[runtime] Fix call-site rendering for inlined calls.

This makes sure call-site rendering for certain {TypeError} messages is
based on the correct underlying {JSFunction}, even when inlined frames
are present. Only the {FrameSummary} knows the exact function.

R=verwaest@chromium.org
TEST=message/regress/regress-crbug-661579
BUG=chromium:661579

Review-Url: https://codereview.chromium.org/2521103005
Cr-Commit-Position: refs/heads/master@{#41264}
parent c63c34e1
...@@ -365,20 +365,19 @@ namespace { ...@@ -365,20 +365,19 @@ namespace {
bool ComputeLocation(Isolate* isolate, MessageLocation* target) { bool ComputeLocation(Isolate* isolate, MessageLocation* target) {
JavaScriptFrameIterator it(isolate); JavaScriptFrameIterator it(isolate);
if (!it.done()) { if (!it.done()) {
JavaScriptFrame* frame = it.frame(); // Compute the location from the function and the relocation info of the
JSFunction* fun = frame->function(); // baseline code. For optimized code this will use the deoptimization
Object* script = fun->shared()->script(); // information to get canonical location information.
List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
it.frame()->Summarize(&frames);
FrameSummary& summary = frames.last();
Handle<JSFunction> function = summary.function();
Handle<Object> script(function->shared()->script(), isolate);
int pos = summary.abstract_code()->SourcePosition(summary.code_offset());
if (script->IsScript() && if (script->IsScript() &&
!(Script::cast(script)->source()->IsUndefined(isolate))) { !(Handle<Script>::cast(script)->source()->IsUndefined(isolate))) {
Handle<Script> casted_script(Script::cast(script), isolate); Handle<Script> casted_script = Handle<Script>::cast(script);
// Compute the location from the function and the relocation info of the *target = MessageLocation(casted_script, pos, pos + 1, function);
// baseline code. For optimized code this will use the deoptimization
// information to get canonical location information.
List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
it.frame()->Summarize(&frames);
FrameSummary& summary = frames.last();
int pos = summary.abstract_code()->SourcePosition(summary.code_offset());
*target = MessageLocation(casted_script, pos, pos + 1, handle(fun));
return true; return true;
} }
} }
......
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var a = {};
function foo() {
a.push();
}
function bar() {
foo();
}
bar();
# Copyright 2016 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
*%(basename)s:7: TypeError: a.push is not a function
a.push();
^
TypeError: a.push is not a function
at foo (*%(basename)s:7:5)
at bar (*%(basename)s:10:3)
at *%(basename)s:12:1
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment