Revision: 5423
Author: [email protected]
Date: Tue Sep 7 08:34:16 2010
Log: Move stack check below while statement.
Call to Runtime_StackGuard should be generated after loop body.
Otherwise, break position will be the previous position before
loop statement.
Review URL: http://codereview.chromium.org/3302012
http://code.google.com/p/v8/source/detail?r=5423
Modified:
/branches/bleeding_edge/src/full-codegen.cc
/branches/bleeding_edge/test/cctest/test-debug.cc
=======================================
--- /branches/bleeding_edge/src/full-codegen.cc Mon Aug 30 04:48:07 2010
+++ /branches/bleeding_edge/src/full-codegen.cc Tue Sep 7 08:34:16 2010
@@ -825,7 +825,7 @@
void FullCodeGenerator::VisitWhileStatement(WhileStatement* stmt) {
Comment cmnt(masm_, "[ WhileStatement");
- Label body, stack_limit_hit, stack_check_success;
+ Label body, stack_limit_hit, stack_check_success, done;
Iteration loop_statement(this, stmt);
increment_loop_depth();
@@ -833,11 +833,6 @@
// Emit the test at the bottom of the loop.
__ jmp(loop_statement.continue_target());
- __ bind(&stack_limit_hit);
- StackCheckStub stack_stub;
- __ CallStub(&stack_stub);
- __ jmp(&stack_check_success);
-
__ bind(&body);
Visit(stmt->body());
__ bind(loop_statement.continue_target());
@@ -856,6 +851,14 @@
loop_statement.break_target());
__ bind(loop_statement.break_target());
+ __ jmp(&done);
+
+ __ bind(&stack_limit_hit);
+ StackCheckStub stack_stub;
+ __ CallStub(&stack_stub);
+ __ jmp(&stack_check_success);
+
+ __ bind(&done);
decrement_loop_depth();
}
=======================================
--- /branches/bleeding_edge/test/cctest/test-debug.cc Fri Aug 27 00:08:03
2010
+++ /branches/bleeding_edge/test/cctest/test-debug.cc Tue Sep 7 08:34:16
2010
@@ -4590,6 +4590,18 @@
return res;
}
+
+// We match parts of the message to get source line.
+int GetSourceLineFromBreakEventMessage(char *message) {
+ const char* source_line = "\"sourceLine\":";
+ char* pos = strstr(message, source_line);
+ if (pos == NULL) {
+ return -1;
+ }
+ int res = -1;
+ res = StringToInt(pos + strlen(source_line));
+ return res;
+}
/* Test MessageQueues */
/* Tests the message queues that hold debugger commands and
@@ -4870,6 +4882,9 @@
v8::String::Value json(message.GetJSON());
Utf16ToAscii(*json, json.length(), print_buffer);
if (IsBreakEventMessage(print_buffer)) {
+ // Check that we are inside the while loop.
+ int source_line = GetSourceLineFromBreakEventMessage(print_buffer);
+ CHECK(8 <= source_line && source_line <= 13);
threaded_debugging_barriers.barrier_2.Wait();
}
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev