Commit 2a8034c8 authored by yurys@chromium.org's avatar yurys@chromium.org

Correctly set eval_from_shared value when new function is created by "new...

Correctly set eval_from_shared value when new function is created by "new Function(...)". At the moment it's set to the native script where the Function is defined(v8natives.js) which doesn't make much sense for the user when he tries to debug his code. Moreover, it causes an exception in JSONProtocolSerializer.prototype.serialize_.

Related Chromium bug: http://crbug.com/29062
Review URL: http://codereview.chromium.org/551227

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3755 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent d450fe1e
......@@ -144,7 +144,8 @@ static Handle<JSFunction> MakeFunction(bool is_global,
// For eval scripts add information on the function from which eval was
// called.
if (is_eval) {
JavaScriptFrameIterator it;
StackTraceFrameIterator it;
if (!it.done()) {
script->set_eval_from_shared(
JSFunction::cast(it.frame()->function())->shared());
int offset = static_cast<int>(
......@@ -152,6 +153,7 @@ static Handle<JSFunction> MakeFunction(bool is_global,
script->set_eval_from_instructions_offset(Smi::FromInt(offset));
}
}
}
// Notify debugger
Debugger::OnBeforeCompile(script);
......
......@@ -2089,8 +2089,10 @@ JSONProtocolSerializer.prototype.serialize_ = function(mirror, reference,
content.evalFromScript =
this.serializeReference(mirror.evalFromScript());
var evalFromLocation = mirror.evalFromLocation()
if (evalFromLocation) {
content.evalFromLocation = { line: evalFromLocation.line,
column: evalFromLocation.column}
column: evalFromLocation.column };
}
if (mirror.evalFromFunctionName()) {
content.evalFromFunctionName = mirror.evalFromFunctionName();
}
......
// Copyright 2010 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following
// disclaimer in the documentation and/or other materials provided
// with the distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Flags: --expose-debug-as debug
// Get the Debug object exposed from the debug context global object.
Debug = debug.Debug
var exception = null; // Exception in debug event listener.
function listener(event, exec_state, event_data, data) {
try {
if (event == Debug.DebugEvent.AfterCompile) {
assertEquals(Debug.ScriptCompilationType.Eval,
event_data.script().compilationType(),
'Wrong compilationType');
var evalFromScript = event_data.script().evalFromScript();
assertTrue(!!evalFromScript, ' evalFromScript ');
assertFalse(evalFromScript.isUndefined(), 'evalFromScript.isUndefined()');
assertTrue(/debug-compile-event-newfunction.js$/.test(
evalFromScript.name()),
'Wrong eval from script name.');
var evalFromLocation = event_data.script().evalFromLocation();
assertTrue(!!evalFromLocation, 'evalFromLocation is undefined');
assertEquals(63, evalFromLocation.line);
// Check that the event can be serialized without exceptions.
var json = event_data.toJSONProtocol();
}
} catch (e) {
exception = e
}
};
// Add the debug event listener.
Debug.setListener(listener);
// Create a function from its body text. It will lead to an eval.
new Function('arg1', 'return arg1 + 1;');
assertNull(exception, "exception in listener");
Debug.setListener(null);
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