From: yangguo@chromium.org Date: Wed, 17 Sep 2014 12:27:16 +0000 (+0000) Subject: Support stepping into generator function. X-Git-Tag: upstream/4.7.83~6873 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1cc4b0b95e9b9e7af57b43e5d648ce56ab3761ea;p=platform%2Fupstream%2Fv8.git Support stepping into generator function. R=aandrey@chromium.org, wingo@igalia.com BUG=v8:3572 LOG=Y Review URL: https://codereview.chromium.org/544953005 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24000 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/generator.js b/src/generator.js index c94c4ff..8e7bd2f 100644 --- a/src/generator.js +++ b/src/generator.js @@ -20,6 +20,7 @@ function GeneratorObjectNext(value) { ['[Generator].prototype.next', this]); } + if (DEBUG_IS_ACTIVE) %DebugPrepareStepInIfStepping(this); return %_GeneratorNext(this, value); } diff --git a/src/runtime.cc b/src/runtime.cc index dd0884b..330225d 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -5524,13 +5524,22 @@ RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) { DCHECK(args.length() == 1); Debug* debug = isolate->debug(); if (!debug->IsStepping()) return isolate->heap()->undefined_value(); - CONVERT_ARG_HANDLE_CHECKED(JSFunction, callback, 0); + HandleScope scope(isolate); - // When leaving the callback, step out has been activated, but not performed - // if we do not leave the builtin. To be able to step into the callback + CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); + RUNTIME_ASSERT(object->IsJSFunction() || object->IsJSGeneratorObject()); + Handle fun; + if (object->IsJSFunction()) { + fun = Handle::cast(object); + } else { + fun = Handle( + Handle::cast(object)->function(), isolate); + } + // When leaving the function, step out has been activated, but not performed + // if we do not leave the builtin. To be able to step into the function // again, we need to clear the step out at this point. debug->ClearStepOut(); - debug->FloodWithOneShot(callback); + debug->FloodWithOneShot(fun); return isolate->heap()->undefined_value(); } diff --git a/test/mjsunit/es6/debug-stepin-generators.js b/test/mjsunit/es6/debug-stepin-generators.js new file mode 100644 index 0000000..f48c5ef --- /dev/null +++ b/test/mjsunit/es6/debug-stepin-generators.js @@ -0,0 +1,45 @@ +// Copyright 2014 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. + +// Flags: --expose-debug-as debug + +Debug = debug.Debug +var exception = null; +var yields = 0; + +function listener(event, exec_state, event_data, data) { + if (event != Debug.DebugEvent.Break) return; + try { + var source = exec_state.frame(0).sourceLineText(); + print(source); + if (/stop stepping/.test(source)) return; + if (/yield/.test(source)) yields++; + exec_state.prepareStep(Debug.StepAction.StepIn, 1); + } catch (e) { + print(e, e.stack); + exception = e; + } +}; + +Debug.setListener(listener); + +function* g() { + for (var i = 0; i < 3; ++i) { + yield i; + } +} + +var i = g(); +debugger; +for (var num of g()) {} +i.next(); + +print(); // stop stepping + +// Not stepped into. +i.next(); +i.next(); + +assertNull(exception); +assertEquals(4, yields);