Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Unified Diff: test/cctest/test-debug.cc

Issue 7212025: Add support for lazy deoptimization from deferred stack checks (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/ia32/lithium-codegen-ia32.cc ('K') | « src/x64/lithium-codegen-x64.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/test-debug.cc
diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc
index 4886a8a07f7cad90079d1f5d076a4882c1b255ed..73b84b78f067f1be724684e45c83155e813f920b 100644
--- a/test/cctest/test-debug.cc
+++ b/test/cctest/test-debug.cc
@@ -649,6 +649,7 @@ int last_source_column = -1;
// Debug event handler which counts the break points which have been hit.
int break_point_hit_count = 0;
+int break_point_hit_count_deoptimize = 0;
static void DebugEventBreakPointHitCount(v8::DebugEvent event,
v8::Handle<v8::Object> exec_state,
v8::Handle<v8::Object> event_data,
@@ -725,6 +726,12 @@ static void DebugEventBreakPointHitCount(v8::DebugEvent event,
script_data->WriteAscii(last_script_data_hit);
}
}
+
+ // Perform a full deoptimization when the specified number of
+ // breaks have been hit.
+ if (break_point_hit_count == break_point_hit_count_deoptimize) {
+ i::Deoptimizer::DeoptimizeAll();
+ }
} else if (event == v8::AfterCompile && !compiled_script_data.IsEmpty()) {
const int argc = 1;
v8::Handle<v8::Value> argv[argc] = { event_data };
@@ -983,12 +990,30 @@ static void DebugEventBreakMax(v8::DebugEvent event,
// Count the number of breaks.
break_point_hit_count++;
+ // Collect the JavsScript stack height if the function frame_count is
+ // compiled.
+ if (!frame_count.IsEmpty()) {
+ static const int kArgc = 1;
+ v8::Handle<v8::Value> argv[kArgc] = { exec_state };
+ // Using exec_state as receiver is just to have a receiver.
+ v8::Handle<v8::Value> result =
+ frame_count->Call(exec_state, kArgc, argv);
+ last_js_stack_height = result->Int32Value();
+ }
+
// Set the break flag again to come back here as soon as possible.
v8::Debug::DebugBreak();
+
} else if (terminate_after_max_break_point_hit) {
// Terminate execution after the last break if requested.
v8::V8::TerminateExecution();
}
+
+ // Perform a full deoptimization when the specified number of
+ // breaks have been hit.
+ if (break_point_hit_count == break_point_hit_count_deoptimize) {
+ i::Deoptimizer::DeoptimizeAll();
+ }
}
}
@@ -7195,29 +7220,38 @@ static void TestDebugBreakInLoop(const char* loop_head,
const char** loop_bodies,
const char* loop_tail) {
// Receive 100 breaks for each test and then terminate JavaScript execution.
- static int count = 0;
+ static const int kBreaksPerTest = 100;
+
+ for (int i = 0; i < 1 && loop_bodies[i] != NULL; i++) {
+ // Perform a lazy deoptimization after various numbers of breaks
+ // have been hit.
+ for (int j = 0; j < 10; j++) {
+ break_point_hit_count_deoptimize = j;
+ if (j == 10) {
+ break_point_hit_count_deoptimize = kBreaksPerTest;
+ }
- for (int i = 0; loop_bodies[i] != NULL; i++) {
- count++;
- max_break_point_hit_count = count * 100;
- terminate_after_max_break_point_hit = true;
+ break_point_hit_count = 0;
+ max_break_point_hit_count = kBreaksPerTest;
+ terminate_after_max_break_point_hit = true;
- EmbeddedVector<char, 1024> buffer;
- OS::SNPrintF(buffer,
- "function f() {%s%s%s}",
- loop_head, loop_bodies[i], loop_tail);
+ EmbeddedVector<char, 1024> buffer;
+ OS::SNPrintF(buffer,
+ "function f() {%s%s%s}",
+ loop_head, loop_bodies[i], loop_tail);
- // Function with infinite loop.
- CompileRun(buffer.start());
+ // Function with infinite loop.
+ CompileRun(buffer.start());
- // Set the debug break to enter the debugger as soon as possible.
- v8::Debug::DebugBreak();
+ // Set the debug break to enter the debugger as soon as possible.
+ v8::Debug::DebugBreak();
- // Call function with infinite loop.
- CompileRun("f();");
- CHECK_EQ(count * 100, break_point_hit_count);
+ // Call function with infinite loop.
+ CompileRun("f();");
+ CHECK_EQ(kBreaksPerTest, break_point_hit_count);
- CHECK(!v8::V8::IsExecutionTerminating());
+ CHECK(!v8::V8::IsExecutionTerminating());
+ }
}
}
@@ -7229,6 +7263,9 @@ TEST(DebugBreakLoop) {
// Register a debug event listener which sets the break flag and counts.
v8::Debug::SetDebugEventListener(DebugEventBreakMax);
+ // Create a function for getting the frame count when hitting the break.
+ frame_count = CompileFunction(&env, frame_count_source, "frame_count");
+
CompileRun("var a = 1;");
CompileRun("function g() { }");
CompileRun("function h() { }");
« src/ia32/lithium-codegen-ia32.cc ('K') | « src/x64/lithium-codegen-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698