Set debug break slot at init of loop variable in a for loop.
BUG=102153 TEST=regress-102153.js Review URL: https://chromiumcodereview.appspot.com/9625011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10963 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
16f8a9545e
commit
13689a4f13
@ -1159,6 +1159,10 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) {
|
|||||||
Label test, body;
|
Label test, body;
|
||||||
|
|
||||||
Iteration loop_statement(this, stmt);
|
Iteration loop_statement(this, stmt);
|
||||||
|
|
||||||
|
// Set statement position for a break slot before entering the for-body.
|
||||||
|
SetStatementPosition(stmt);
|
||||||
|
|
||||||
if (stmt->init() != NULL) {
|
if (stmt->init() != NULL) {
|
||||||
Visit(stmt->init());
|
Visit(stmt->init());
|
||||||
}
|
}
|
||||||
@ -1173,7 +1177,6 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) {
|
|||||||
|
|
||||||
PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS);
|
PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS);
|
||||||
__ bind(loop_statement.continue_label());
|
__ bind(loop_statement.continue_label());
|
||||||
SetStatementPosition(stmt);
|
|
||||||
if (stmt->next() != NULL) {
|
if (stmt->next() != NULL) {
|
||||||
Visit(stmt->next());
|
Visit(stmt->next());
|
||||||
}
|
}
|
||||||
|
@ -2745,7 +2745,7 @@ TEST(DebugStepKeyedLoadLoop) {
|
|||||||
foo->Call(env->Global(), kArgc, args);
|
foo->Call(env->Global(), kArgc, args);
|
||||||
|
|
||||||
// With stepping all break locations are hit.
|
// With stepping all break locations are hit.
|
||||||
CHECK_EQ(33, break_point_hit_count);
|
CHECK_EQ(34, break_point_hit_count);
|
||||||
|
|
||||||
v8::Debug::SetDebugEventListener(NULL);
|
v8::Debug::SetDebugEventListener(NULL);
|
||||||
CheckDebuggerUnloaded();
|
CheckDebuggerUnloaded();
|
||||||
@ -2792,7 +2792,7 @@ TEST(DebugStepKeyedStoreLoop) {
|
|||||||
foo->Call(env->Global(), kArgc, args);
|
foo->Call(env->Global(), kArgc, args);
|
||||||
|
|
||||||
// With stepping all break locations are hit.
|
// With stepping all break locations are hit.
|
||||||
CHECK_EQ(32, break_point_hit_count);
|
CHECK_EQ(33, break_point_hit_count);
|
||||||
|
|
||||||
v8::Debug::SetDebugEventListener(NULL);
|
v8::Debug::SetDebugEventListener(NULL);
|
||||||
CheckDebuggerUnloaded();
|
CheckDebuggerUnloaded();
|
||||||
@ -2836,7 +2836,7 @@ TEST(DebugStepNamedLoadLoop) {
|
|||||||
foo->Call(env->Global(), 0, NULL);
|
foo->Call(env->Global(), 0, NULL);
|
||||||
|
|
||||||
// With stepping all break locations are hit.
|
// With stepping all break locations are hit.
|
||||||
CHECK_EQ(53, break_point_hit_count);
|
CHECK_EQ(54, break_point_hit_count);
|
||||||
|
|
||||||
v8::Debug::SetDebugEventListener(NULL);
|
v8::Debug::SetDebugEventListener(NULL);
|
||||||
CheckDebuggerUnloaded();
|
CheckDebuggerUnloaded();
|
||||||
@ -2880,7 +2880,7 @@ static void DoDebugStepNamedStoreLoop(int expected) {
|
|||||||
|
|
||||||
// Test of the stepping mechanism for named load in a loop.
|
// Test of the stepping mechanism for named load in a loop.
|
||||||
TEST(DebugStepNamedStoreLoop) {
|
TEST(DebugStepNamedStoreLoop) {
|
||||||
DoDebugStepNamedStoreLoop(22);
|
DoDebugStepNamedStoreLoop(23);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3252,7 +3252,7 @@ TEST(DebugStepForContinue) {
|
|||||||
v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) };
|
v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) };
|
||||||
result = foo->Call(env->Global(), argc, argv_10);
|
result = foo->Call(env->Global(), argc, argv_10);
|
||||||
CHECK_EQ(5, result->Int32Value());
|
CHECK_EQ(5, result->Int32Value());
|
||||||
CHECK_EQ(50, break_point_hit_count);
|
CHECK_EQ(51, break_point_hit_count);
|
||||||
|
|
||||||
// Looping 100 times.
|
// Looping 100 times.
|
||||||
step_action = StepIn;
|
step_action = StepIn;
|
||||||
@ -3260,7 +3260,7 @@ TEST(DebugStepForContinue) {
|
|||||||
v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
|
v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
|
||||||
result = foo->Call(env->Global(), argc, argv_100);
|
result = foo->Call(env->Global(), argc, argv_100);
|
||||||
CHECK_EQ(50, result->Int32Value());
|
CHECK_EQ(50, result->Int32Value());
|
||||||
CHECK_EQ(455, break_point_hit_count);
|
CHECK_EQ(456, break_point_hit_count);
|
||||||
|
|
||||||
// Get rid of the debug event listener.
|
// Get rid of the debug event listener.
|
||||||
v8::Debug::SetDebugEventListener(NULL);
|
v8::Debug::SetDebugEventListener(NULL);
|
||||||
@ -3304,7 +3304,7 @@ TEST(DebugStepForBreak) {
|
|||||||
v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) };
|
v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) };
|
||||||
result = foo->Call(env->Global(), argc, argv_10);
|
result = foo->Call(env->Global(), argc, argv_10);
|
||||||
CHECK_EQ(9, result->Int32Value());
|
CHECK_EQ(9, result->Int32Value());
|
||||||
CHECK_EQ(53, break_point_hit_count);
|
CHECK_EQ(54, break_point_hit_count);
|
||||||
|
|
||||||
// Looping 100 times.
|
// Looping 100 times.
|
||||||
step_action = StepIn;
|
step_action = StepIn;
|
||||||
@ -3312,7 +3312,7 @@ TEST(DebugStepForBreak) {
|
|||||||
v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
|
v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) };
|
||||||
result = foo->Call(env->Global(), argc, argv_100);
|
result = foo->Call(env->Global(), argc, argv_100);
|
||||||
CHECK_EQ(99, result->Int32Value());
|
CHECK_EQ(99, result->Int32Value());
|
||||||
CHECK_EQ(503, break_point_hit_count);
|
CHECK_EQ(504, break_point_hit_count);
|
||||||
|
|
||||||
// Get rid of the debug event listener.
|
// Get rid of the debug event listener.
|
||||||
v8::Debug::SetDebugEventListener(NULL);
|
v8::Debug::SetDebugEventListener(NULL);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2008 the V8 project authors. All rights reserved.
|
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||||
// Redistribution and use in source and binary forms, with or without
|
// Redistribution and use in source and binary forms, with or without
|
||||||
// modification, are permitted provided that the following conditions are
|
// modification, are permitted provided that the following conditions are
|
||||||
// met:
|
// met:
|
||||||
@ -112,8 +112,8 @@ function testGetter1_2() {
|
|||||||
function testGetter1_3() {
|
function testGetter1_3() {
|
||||||
expected_function_name = 'getter1';
|
expected_function_name = 'getter1';
|
||||||
expected_source_line_text = ' return this.name; // getter 1';
|
expected_source_line_text = ' return this.name; // getter 1';
|
||||||
debugger;
|
|
||||||
for (var i = 1; i < 2; i++) {
|
for (var i = 1; i < 2; i++) {
|
||||||
|
debugger;
|
||||||
var x = c['getter' + i];
|
var x = c['getter' + i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
57
test/mjsunit/regress/regress-102153.js
Normal file
57
test/mjsunit/regress/regress-102153.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// Copyright 2012 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
|
||||||
|
|
||||||
|
// Test that the break point is set before initializing the loop variable
|
||||||
|
// so that we break before any iteration has been run.
|
||||||
|
|
||||||
|
Debug = debug.Debug;
|
||||||
|
|
||||||
|
var break_hit = false;
|
||||||
|
|
||||||
|
function listener(event, exec_state, event_data, data) {
|
||||||
|
if (event == Debug.DebugEvent.Break) {
|
||||||
|
break_hit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.setListener(listener);
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
for (var i = 0; i < 3; i++) { // Break here.
|
||||||
|
if (i == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.setBreakPoint(test, 1, 0);
|
||||||
|
|
||||||
|
assertTrue(Debug.showBreakPoints(test).indexOf("// Break here.") >= 0);
|
||||||
|
|
||||||
|
test();
|
||||||
|
|
||||||
|
assertTrue(break_hit);
|
Loading…
Reference in New Issue
Block a user