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

Reply via email to