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

Unified Diff: runtime/vm/debugger_api_impl_test.cc

Issue 27054002: Add unit tests to cover stack inspect in the presence of closure calls (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 2 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
« no previous file with comments | « no previous file | runtime/vm/deopt_instructions.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/debugger_api_impl_test.cc
===================================================================
--- runtime/vm/debugger_api_impl_test.cc (revision 28523)
+++ runtime/vm/debugger_api_impl_test.cc (working copy)
@@ -431,10 +431,6 @@
bool saved_osr = FLAG_use_osr;
FLAG_use_osr = false;
- // Set up the breakpoint.
- Dart_SetPausedEventHandler(InspectOptimizedStack_Breakpoint);
- SetBreakpointAtEntry("", "breakpointNow");
-
if (optimize) {
// Warm up the code to make sure it gets optimized. We ignore any
// breakpoints that get hit during warm-up.
@@ -447,6 +443,10 @@
FLAG_optimization_counter_threshold = kHighThreshold;
}
+ // Set up the breakpoint.
+ Dart_SetPausedEventHandler(InspectOptimizedStack_Breakpoint);
+ SetBreakpointAtEntry("", "breakpointNow");
+
// Run the code and inspect the stack.
stack_buffer[0] = '\0';
dart_args[0] = Dart_True();
@@ -489,6 +489,101 @@
}
+static void InspectStackWithClosureTest(bool optimize) {
+ const char* kScriptChars =
+ "void breakpointNow() {\n"
+ "}\n"
+ "int helper(int a, int b, bool stop) {\n"
+ " if (b == 99 && stop) {\n"
+ " breakpointNow();\n"
+ " }\n"
+ " int c = a*b;\n"
+ " return c;\n"
+ "}\n"
+ "int anotherMiddleMan(func) {\n"
+ " return func(10);\n"
+ "}\n"
+ "int middleMan(int x, int limit, bool stop) {\n"
+ " int value = 0;\n"
+ " for (int i = 0; i < limit; i++) {\n"
+ " value += anotherMiddleMan((value) {\n"
+ " return helper((x * value), i, stop);\n"
+ " });\n"
+ " }\n"
+ " return value;\n"
+ "}\n"
+ "int test(bool stop, int limit) {\n"
+ " return middleMan(5, limit, stop);\n"
+ "}\n";
+
+ LoadScript(kScriptChars);
+
+ // Save/restore some compiler flags.
+ Dart_Handle dart_args[2];
+ int saved_threshold = FLAG_optimization_counter_threshold;
+ const int kLowThreshold = 100;
+ const int kHighThreshold = 10000;
+ bool saved_osr = FLAG_use_osr;
+ FLAG_use_osr = false;
+
+ if (optimize) {
+ // Warm up the code to make sure it gets optimized. We ignore any
+ // breakpoints that get hit during warm-up.
+ FLAG_optimization_counter_threshold = kLowThreshold;
+ dart_args[0] = Dart_False();
+ dart_args[1] = Dart_NewInteger(kLowThreshold);
+ EXPECT_VALID(Dart_Invoke(script_lib, NewString("test"), 2, dart_args));
+ } else {
+ // Try to ensure that none of the test code gets optimized.
+ FLAG_optimization_counter_threshold = kHighThreshold;
+ }
+
+ // Set up the breakpoint.
+ Dart_SetPausedEventHandler(InspectOptimizedStack_Breakpoint);
+ SetBreakpointAtEntry("", "breakpointNow");
+
+ // Run the code and inspect the stack.
+ stack_buffer[0] = '\0';
+ dart_args[0] = Dart_True();
+ dart_args[1] = Dart_NewInteger(kLowThreshold);
+ EXPECT_VALID(Dart_Invoke(script_lib, NewString("test"), 2, dart_args));
+ if (optimize) {
+ EXPECT_STREQ("[0] breakpointNow { }\n"
+ "[1] helper { a = 50 b = 99 stop = null }\n"
+ "[2] <anonymous closure> { x = <unknown>"
+ " stop = <unknown> value = null }\n"
+ "[3] anotherMiddleMan { func = null }\n"
+ "[4] middleMan { limit = 100 value = 242550 }\n"
+ "[5] test { stop = true limit = 100 }\n",
+ stack_buffer);
+ } else {
+ EXPECT_STREQ("[0] breakpointNow { }\n"
+ "[1] helper { a = 50 b = 99 stop = true }\n"
+ "[2] <anonymous closure> { x = 5 i = 99"
+ " stop = <unknown> value = 10 }\n"
+ "[3] anotherMiddleMan {"
+ " func = Closure: (dynamic) => dynamic }\n"
+ "[4] middleMan { x = 5 limit = 100 stop = <unknown>"
+ " value = 242550 i = 99 }\n"
+ "[5] test { stop = true limit = 100 }\n",
+ stack_buffer);
+ }
+
+ FLAG_optimization_counter_threshold = saved_threshold;
+ FLAG_use_osr = saved_osr;
+}
+
+
+TEST_CASE(Debug_InspectStackWithClosure_NotOptimized) {
+ InspectStackWithClosureTest(false);
+}
+
+
+TEST_CASE(Debug_InspectStackWithClosure_Optimized) {
+ InspectStackWithClosureTest(true);
+}
+
+
void TestStepOutHandler(Dart_IsolateId isolate_id,
const Dart_CodeLocation& location) {
Dart_StackTrace trace;
« no previous file with comments | « no previous file | runtime/vm/deopt_instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698