From 2a8034c8f6349d71812eed69704aa3250f744db7 Mon Sep 17 00:00:00 2001 From: "yurys@chromium.org" Date: Mon, 1 Feb 2010 12:56:56 +0000 Subject: [PATCH] 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 --- src/compiler.cc | 14 ++--- src/mirror-delay.js | 6 ++- test/mjsunit/debug-compile-event-newfunction.js | 68 +++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 test/mjsunit/debug-compile-event-newfunction.js diff --git a/src/compiler.cc b/src/compiler.cc index 54e975d..7a5541b 100755 --- a/src/compiler.cc +++ b/src/compiler.cc @@ -144,12 +144,14 @@ static Handle MakeFunction(bool is_global, // For eval scripts add information on the function from which eval was // called. if (is_eval) { - JavaScriptFrameIterator it; - script->set_eval_from_shared( - JSFunction::cast(it.frame()->function())->shared()); - int offset = static_cast( - it.frame()->pc() - it.frame()->code()->instruction_start()); - script->set_eval_from_instructions_offset(Smi::FromInt(offset)); + StackTraceFrameIterator it; + if (!it.done()) { + script->set_eval_from_shared( + JSFunction::cast(it.frame()->function())->shared()); + int offset = static_cast( + it.frame()->pc() - it.frame()->code()->instruction_start()); + script->set_eval_from_instructions_offset(Smi::FromInt(offset)); + } } } diff --git a/src/mirror-delay.js b/src/mirror-delay.js index 0269f1f..1487ce5 100644 --- a/src/mirror-delay.js +++ b/src/mirror-delay.js @@ -2089,8 +2089,10 @@ JSONProtocolSerializer.prototype.serialize_ = function(mirror, reference, content.evalFromScript = this.serializeReference(mirror.evalFromScript()); var evalFromLocation = mirror.evalFromLocation() - content.evalFromLocation = { line: evalFromLocation.line, - column: evalFromLocation.column} + if (evalFromLocation) { + content.evalFromLocation = { line: evalFromLocation.line, + column: evalFromLocation.column }; + } if (mirror.evalFromFunctionName()) { content.evalFromFunctionName = mirror.evalFromFunctionName(); } diff --git a/test/mjsunit/debug-compile-event-newfunction.js b/test/mjsunit/debug-compile-event-newfunction.js new file mode 100644 index 0000000..fb43a87 --- /dev/null +++ b/test/mjsunit/debug-compile-event-newfunction.js @@ -0,0 +1,68 @@ +// 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); -- 2.7.4