| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "include/dart_mirrors_api.h" | 5 #include "include/dart_mirrors_api.h" |
| 6 #include "include/dart_tools_api.h" | 6 #include "include/dart_tools_api.h" |
| 7 #include "platform/assert.h" | 7 #include "platform/assert.h" |
| 8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
| 9 #include "vm/lockers.h" | 9 #include "vm/lockers.h" |
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 DECLARE_FLAG(bool, trace_shutdown); | 14 DECLARE_FLAG(bool, trace_shutdown); |
| 15 | 15 |
| 16 #ifndef PRODUCT | 16 #ifndef PRODUCT |
| 17 | 17 |
| 18 static bool breakpoint_hit = false; | 18 static bool breakpoint_hit = false; |
| 19 static int breakpoint_hit_counter = 0; | 19 static int breakpoint_hit_counter = 0; |
| 20 static Dart_Handle script_lib = NULL; | 20 static Dart_Handle script_lib = NULL; |
| 21 | 21 |
| 22 static const bool verbose = true; | 22 static const bool verbose = true; |
| 23 | 23 |
| 24 static void LoadScript(const char* source) { | 24 static void LoadScript(const char* source) { |
| 25 script_lib = TestCase::LoadTestScript(source, NULL); | 25 script_lib = TestCase::LoadTestScript(source, NULL); |
| 26 EXPECT_VALID(script_lib); | 26 EXPECT_VALID(script_lib); |
| 27 } | 27 } |
| 28 | 28 |
| 29 | |
| 30 static void SetBreakpointAtEntry(const char* cname, const char* fname) { | 29 static void SetBreakpointAtEntry(const char* cname, const char* fname) { |
| 31 ASSERT(script_lib != NULL); | 30 ASSERT(script_lib != NULL); |
| 32 ASSERT(!Dart_IsError(script_lib)); | 31 ASSERT(!Dart_IsError(script_lib)); |
| 33 ASSERT(Dart_IsLibrary(script_lib)); | 32 ASSERT(Dart_IsLibrary(script_lib)); |
| 34 Dart_Handle res = | 33 Dart_Handle res = |
| 35 Dart_SetBreakpointAtEntry(script_lib, NewString(cname), NewString(fname)); | 34 Dart_SetBreakpointAtEntry(script_lib, NewString(cname), NewString(fname)); |
| 36 EXPECT(Dart_IsInteger(res)); | 35 EXPECT(Dart_IsInteger(res)); |
| 37 } | 36 } |
| 38 | 37 |
| 39 | |
| 40 static void DisableDebuggabilityOfDartColonLibraries() { | 38 static void DisableDebuggabilityOfDartColonLibraries() { |
| 41 const char* dart_colon = "dart:"; | 39 const char* dart_colon = "dart:"; |
| 42 const intptr_t dart_colon_length = strlen(dart_colon); | 40 const intptr_t dart_colon_length = strlen(dart_colon); |
| 43 // Disable debuggability of all dart: libraries. | 41 // Disable debuggability of all dart: libraries. |
| 44 Dart_Handle library_ids = Dart_GetLibraryIds(); | 42 Dart_Handle library_ids = Dart_GetLibraryIds(); |
| 45 intptr_t library_ids_length; | 43 intptr_t library_ids_length; |
| 46 Dart_ListLength(library_ids, &library_ids_length); | 44 Dart_ListLength(library_ids, &library_ids_length); |
| 47 for (intptr_t i = 0; i < library_ids_length; i++) { | 45 for (intptr_t i = 0; i < library_ids_length; i++) { |
| 48 Dart_Handle library_id_handle = Dart_ListGetAt(library_ids, i); | 46 Dart_Handle library_id_handle = Dart_ListGetAt(library_ids, i); |
| 49 int64_t library_id; | 47 int64_t library_id; |
| 50 Dart_IntegerToInt64(library_id_handle, &library_id); | 48 Dart_IntegerToInt64(library_id_handle, &library_id); |
| 51 Dart_Handle library_url_handle = Dart_GetLibraryURL(library_id); | 49 Dart_Handle library_url_handle = Dart_GetLibraryURL(library_id); |
| 52 const char* library_url; | 50 const char* library_url; |
| 53 Dart_StringToCString(library_url_handle, &library_url); | 51 Dart_StringToCString(library_url_handle, &library_url); |
| 54 if (strncmp(library_url, dart_colon, dart_colon_length) == 0) { | 52 if (strncmp(library_url, dart_colon, dart_colon_length) == 0) { |
| 55 Dart_SetLibraryDebuggable(library_id, false); | 53 Dart_SetLibraryDebuggable(library_id, false); |
| 56 } else { | 54 } else { |
| 57 Dart_SetLibraryDebuggable(library_id, true); | 55 Dart_SetLibraryDebuggable(library_id, true); |
| 58 } | 56 } |
| 59 } | 57 } |
| 60 } | 58 } |
| 61 | 59 |
| 62 | |
| 63 static Dart_Handle Invoke(const char* func_name) { | 60 static Dart_Handle Invoke(const char* func_name) { |
| 64 ASSERT(script_lib != NULL); | 61 ASSERT(script_lib != NULL); |
| 65 ASSERT(!Dart_IsError(script_lib)); | 62 ASSERT(!Dart_IsError(script_lib)); |
| 66 ASSERT(Dart_IsLibrary(script_lib)); | 63 ASSERT(Dart_IsLibrary(script_lib)); |
| 67 return Dart_Invoke(script_lib, NewString(func_name), 0, NULL); | 64 return Dart_Invoke(script_lib, NewString(func_name), 0, NULL); |
| 68 } | 65 } |
| 69 | 66 |
| 70 | |
| 71 static char const* ToCString(Dart_Handle str) { | 67 static char const* ToCString(Dart_Handle str) { |
| 72 EXPECT(Dart_IsString(str)); | 68 EXPECT(Dart_IsString(str)); |
| 73 char const* c_str = NULL; | 69 char const* c_str = NULL; |
| 74 Dart_StringToCString(str, &c_str); | 70 Dart_StringToCString(str, &c_str); |
| 75 return c_str; | 71 return c_str; |
| 76 } | 72 } |
| 77 | 73 |
| 78 | |
| 79 static int64_t ToInt64(Dart_Handle h) { | 74 static int64_t ToInt64(Dart_Handle h) { |
| 80 EXPECT(Dart_IsInteger(h)); | 75 EXPECT(Dart_IsInteger(h)); |
| 81 int64_t i = 0; | 76 int64_t i = 0; |
| 82 Dart_Handle res = Dart_IntegerToInt64(h, &i); | 77 Dart_Handle res = Dart_IntegerToInt64(h, &i); |
| 83 EXPECT_VALID(res); | 78 EXPECT_VALID(res); |
| 84 return i; | 79 return i; |
| 85 } | 80 } |
| 86 | 81 |
| 87 | |
| 88 static double ToDouble(Dart_Handle h) { | 82 static double ToDouble(Dart_Handle h) { |
| 89 EXPECT(Dart_IsDouble(h)); | 83 EXPECT(Dart_IsDouble(h)); |
| 90 double d = 0.0; | 84 double d = 0.0; |
| 91 Dart_Handle res = Dart_DoubleValue(h, &d); | 85 Dart_Handle res = Dart_DoubleValue(h, &d); |
| 92 EXPECT_VALID(res); | 86 EXPECT_VALID(res); |
| 93 return d; | 87 return d; |
| 94 } | 88 } |
| 95 | 89 |
| 96 | |
| 97 static char const* BreakpointInfo(Dart_StackTrace trace) { | 90 static char const* BreakpointInfo(Dart_StackTrace trace) { |
| 98 static char info_str[128]; | 91 static char info_str[128]; |
| 99 Dart_ActivationFrame frame; | 92 Dart_ActivationFrame frame; |
| 100 Dart_Handle res = Dart_GetActivationFrame(trace, 0, &frame); | 93 Dart_Handle res = Dart_GetActivationFrame(trace, 0, &frame); |
| 101 EXPECT_TRUE(res); | 94 EXPECT_TRUE(res); |
| 102 Dart_Handle func_name; | 95 Dart_Handle func_name; |
| 103 Dart_Handle url; | 96 Dart_Handle url; |
| 104 intptr_t line_number = 0; | 97 intptr_t line_number = 0; |
| 105 intptr_t library_id = 0; | 98 intptr_t library_id = 0; |
| 106 res = Dart_ActivationFrameInfo(frame, &func_name, &url, &line_number, | 99 res = Dart_ActivationFrameInfo(frame, &func_name, &url, &line_number, |
| 107 &library_id); | 100 &library_id); |
| 108 EXPECT_TRUE(res); | 101 EXPECT_TRUE(res); |
| 109 OS::SNPrint(info_str, sizeof(info_str), "function %s (%s:%" Pd ")", | 102 OS::SNPrint(info_str, sizeof(info_str), "function %s (%s:%" Pd ")", |
| 110 ToCString(func_name), ToCString(url), line_number); | 103 ToCString(func_name), ToCString(url), line_number); |
| 111 return info_str; | 104 return info_str; |
| 112 } | 105 } |
| 113 | 106 |
| 114 | |
| 115 static void PrintValue(Dart_Handle value, bool expand); | 107 static void PrintValue(Dart_Handle value, bool expand); |
| 116 | 108 |
| 117 | |
| 118 static void PrintObjectList(Dart_Handle list, const char* prefix, bool expand) { | 109 static void PrintObjectList(Dart_Handle list, const char* prefix, bool expand) { |
| 119 intptr_t list_length = 0; | 110 intptr_t list_length = 0; |
| 120 Dart_Handle retval = Dart_ListLength(list, &list_length); | 111 Dart_Handle retval = Dart_ListLength(list, &list_length); |
| 121 EXPECT_VALID(retval); | 112 EXPECT_VALID(retval); |
| 122 for (int i = 0; i + 1 < list_length; i += 2) { | 113 for (int i = 0; i + 1 < list_length; i += 2) { |
| 123 Dart_Handle name_handle = Dart_ListGetAt(list, i); | 114 Dart_Handle name_handle = Dart_ListGetAt(list, i); |
| 124 EXPECT_VALID(name_handle); | 115 EXPECT_VALID(name_handle); |
| 125 EXPECT(Dart_IsString(name_handle)); | 116 EXPECT(Dart_IsString(name_handle)); |
| 126 Dart_Handle value_handle = Dart_ListGetAt(list, i + 1); | 117 Dart_Handle value_handle = Dart_ListGetAt(list, i + 1); |
| 127 OS::Print("\n %s %s = ", prefix, ToCString(name_handle)); | 118 OS::Print("\n %s %s = ", prefix, ToCString(name_handle)); |
| 128 PrintValue(value_handle, expand); | 119 PrintValue(value_handle, expand); |
| 129 } | 120 } |
| 130 } | 121 } |
| 131 | 122 |
| 132 | |
| 133 static void PrintObject(Dart_Handle obj, bool expand) { | 123 static void PrintObject(Dart_Handle obj, bool expand) { |
| 134 Dart_Handle obj_class = Dart_GetObjClass(obj); | 124 Dart_Handle obj_class = Dart_GetObjClass(obj); |
| 135 EXPECT_VALID(obj_class); | 125 EXPECT_VALID(obj_class); |
| 136 EXPECT(!Dart_IsNull(obj_class)); | 126 EXPECT(!Dart_IsNull(obj_class)); |
| 137 Dart_Handle class_name = Dart_ToString(obj_class); | 127 Dart_Handle class_name = Dart_ToString(obj_class); |
| 138 EXPECT_VALID(class_name); | 128 EXPECT_VALID(class_name); |
| 139 EXPECT(Dart_IsString(class_name)); | 129 EXPECT(Dart_IsString(class_name)); |
| 140 char const* class_name_str; | 130 char const* class_name_str; |
| 141 Dart_StringToCString(class_name, &class_name_str); | 131 Dart_StringToCString(class_name, &class_name_str); |
| 142 Dart_Handle fields = Dart_GetInstanceFields(obj); | 132 Dart_Handle fields = Dart_GetInstanceFields(obj); |
| 143 EXPECT_VALID(fields); | 133 EXPECT_VALID(fields); |
| 144 EXPECT(Dart_IsList(fields)); | 134 EXPECT(Dart_IsList(fields)); |
| 145 OS::Print("object of type '%s'", class_name_str); | 135 OS::Print("object of type '%s'", class_name_str); |
| 146 PrintObjectList(fields, "field", false); | 136 PrintObjectList(fields, "field", false); |
| 147 Dart_Handle statics = Dart_GetStaticFields(obj_class); | 137 Dart_Handle statics = Dart_GetStaticFields(obj_class); |
| 148 EXPECT_VALID(obj_class); | 138 EXPECT_VALID(obj_class); |
| 149 PrintObjectList(statics, "static field", false); | 139 PrintObjectList(statics, "static field", false); |
| 150 } | 140 } |
| 151 | 141 |
| 152 | |
| 153 static void PrintValue(Dart_Handle value, bool expand) { | 142 static void PrintValue(Dart_Handle value, bool expand) { |
| 154 if (Dart_IsNull(value)) { | 143 if (Dart_IsNull(value)) { |
| 155 OS::Print("null"); | 144 OS::Print("null"); |
| 156 } else if (Dart_IsString(value)) { | 145 } else if (Dart_IsString(value)) { |
| 157 Dart_Handle str_value = Dart_ToString(value); | 146 Dart_Handle str_value = Dart_ToString(value); |
| 158 EXPECT_VALID(str_value); | 147 EXPECT_VALID(str_value); |
| 159 EXPECT(Dart_IsString(str_value)); | 148 EXPECT(Dart_IsString(str_value)); |
| 160 OS::Print("\"%s\"", ToCString(str_value)); | 149 OS::Print("\"%s\"", ToCString(str_value)); |
| 161 } else if (Dart_IsNumber(value) || Dart_IsBoolean(value)) { | 150 } else if (Dart_IsNumber(value) || Dart_IsBoolean(value)) { |
| 162 Dart_Handle str_value = Dart_ToString(value); | 151 Dart_Handle str_value = Dart_ToString(value); |
| 163 EXPECT_VALID(str_value); | 152 EXPECT_VALID(str_value); |
| 164 EXPECT(Dart_IsString(str_value)); | 153 EXPECT(Dart_IsString(str_value)); |
| 165 OS::Print("%s", ToCString(str_value)); | 154 OS::Print("%s", ToCString(str_value)); |
| 166 } else { | 155 } else { |
| 167 PrintObject(value, expand); | 156 PrintObject(value, expand); |
| 168 } | 157 } |
| 169 } | 158 } |
| 170 | 159 |
| 171 | |
| 172 static void PrintActivationFrame(Dart_ActivationFrame frame) { | 160 static void PrintActivationFrame(Dart_ActivationFrame frame) { |
| 173 Dart_Handle func_name; | 161 Dart_Handle func_name; |
| 174 Dart_Handle res; | 162 Dart_Handle res; |
| 175 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, NULL, NULL); | 163 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, NULL, NULL); |
| 176 EXPECT_TRUE(res); | 164 EXPECT_TRUE(res); |
| 177 EXPECT(Dart_IsString(func_name)); | 165 EXPECT(Dart_IsString(func_name)); |
| 178 const char* func_name_chars; | 166 const char* func_name_chars; |
| 179 Dart_StringToCString(func_name, &func_name_chars); | 167 Dart_StringToCString(func_name, &func_name_chars); |
| 180 OS::Print(" function %s\n", func_name_chars); | 168 OS::Print(" function %s\n", func_name_chars); |
| 181 Dart_Handle locals = Dart_GetLocalVariables(frame); | 169 Dart_Handle locals = Dart_GetLocalVariables(frame); |
| 182 EXPECT_VALID(locals); | 170 EXPECT_VALID(locals); |
| 183 intptr_t list_length = 0; | 171 intptr_t list_length = 0; |
| 184 Dart_Handle ret = Dart_ListLength(locals, &list_length); | 172 Dart_Handle ret = Dart_ListLength(locals, &list_length); |
| 185 EXPECT_VALID(ret); | 173 EXPECT_VALID(ret); |
| 186 for (int i = 0; i + 1 < list_length; i += 2) { | 174 for (int i = 0; i + 1 < list_length; i += 2) { |
| 187 Dart_Handle name_handle = Dart_ListGetAt(locals, i); | 175 Dart_Handle name_handle = Dart_ListGetAt(locals, i); |
| 188 EXPECT_VALID(name_handle); | 176 EXPECT_VALID(name_handle); |
| 189 EXPECT(Dart_IsString(name_handle)); | 177 EXPECT(Dart_IsString(name_handle)); |
| 190 OS::Print(" local var %s = ", ToCString(name_handle)); | 178 OS::Print(" local var %s = ", ToCString(name_handle)); |
| 191 Dart_Handle value_handle = Dart_ListGetAt(locals, i + 1); | 179 Dart_Handle value_handle = Dart_ListGetAt(locals, i + 1); |
| 192 EXPECT_VALID(value_handle); | 180 EXPECT_VALID(value_handle); |
| 193 PrintValue(value_handle, true); | 181 PrintValue(value_handle, true); |
| 194 OS::Print("\n"); | 182 OS::Print("\n"); |
| 195 } | 183 } |
| 196 } | 184 } |
| 197 | 185 |
| 198 | |
| 199 static Dart_Handle GetLocalVariable(Dart_ActivationFrame frame, | 186 static Dart_Handle GetLocalVariable(Dart_ActivationFrame frame, |
| 200 const char* name) { | 187 const char* name) { |
| 201 Dart_Handle locals = Dart_GetLocalVariables(frame); | 188 Dart_Handle locals = Dart_GetLocalVariables(frame); |
| 202 EXPECT_VALID(locals); | 189 EXPECT_VALID(locals); |
| 203 intptr_t list_length = 0; | 190 intptr_t list_length = 0; |
| 204 Dart_Handle ret = Dart_ListLength(locals, &list_length); | 191 Dart_Handle ret = Dart_ListLength(locals, &list_length); |
| 205 EXPECT_VALID(ret); | 192 EXPECT_VALID(ret); |
| 206 for (int i = 0; i + 1 < list_length; i += 2) { | 193 for (int i = 0; i + 1 < list_length; i += 2) { |
| 207 Dart_Handle name_handle = Dart_ListGetAt(locals, i); | 194 Dart_Handle name_handle = Dart_ListGetAt(locals, i); |
| 208 EXPECT_VALID(name_handle); | 195 EXPECT_VALID(name_handle); |
| 209 EXPECT(Dart_IsString(name_handle)); | 196 EXPECT(Dart_IsString(name_handle)); |
| 210 if (strcmp(ToCString(name_handle), name) == 0) { | 197 if (strcmp(ToCString(name_handle), name) == 0) { |
| 211 Dart_Handle value_handle = Dart_ListGetAt(locals, i + 1); | 198 Dart_Handle value_handle = Dart_ListGetAt(locals, i + 1); |
| 212 EXPECT_VALID(value_handle); | 199 EXPECT_VALID(value_handle); |
| 213 return value_handle; | 200 return value_handle; |
| 214 } | 201 } |
| 215 } | 202 } |
| 216 FAIL("local variable not found"); | 203 FAIL("local variable not found"); |
| 217 return Dart_Null(); | 204 return Dart_Null(); |
| 218 } | 205 } |
| 219 | 206 |
| 220 | |
| 221 static void PrintStackTrace(Dart_StackTrace trace) { | 207 static void PrintStackTrace(Dart_StackTrace trace) { |
| 222 intptr_t trace_len; | 208 intptr_t trace_len; |
| 223 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 209 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 224 EXPECT_TRUE(res); | 210 EXPECT_TRUE(res); |
| 225 for (int i = 0; i < trace_len; i++) { | 211 for (int i = 0; i < trace_len; i++) { |
| 226 Dart_ActivationFrame frame; | 212 Dart_ActivationFrame frame; |
| 227 res = Dart_GetActivationFrame(trace, i, &frame); | 213 res = Dart_GetActivationFrame(trace, i, &frame); |
| 228 EXPECT_TRUE(res); | 214 EXPECT_TRUE(res); |
| 229 PrintActivationFrame(frame); | 215 PrintActivationFrame(frame); |
| 230 } | 216 } |
| 231 } | 217 } |
| 232 | 218 |
| 233 | |
| 234 static void VerifyListEquals(Dart_Handle expected, | 219 static void VerifyListEquals(Dart_Handle expected, |
| 235 Dart_Handle got, | 220 Dart_Handle got, |
| 236 bool skip_null_expects) { | 221 bool skip_null_expects) { |
| 237 EXPECT(Dart_IsList(expected)); | 222 EXPECT(Dart_IsList(expected)); |
| 238 EXPECT(Dart_IsList(got)); | 223 EXPECT(Dart_IsList(got)); |
| 239 Dart_Handle res; | 224 Dart_Handle res; |
| 240 intptr_t expected_length; | 225 intptr_t expected_length; |
| 241 res = Dart_ListLength(expected, &expected_length); | 226 res = Dart_ListLength(expected, &expected_length); |
| 242 EXPECT_VALID(res); | 227 EXPECT_VALID(res); |
| 243 intptr_t got_length; | 228 intptr_t got_length; |
| 244 res = Dart_ListLength(expected, &got_length); | 229 res = Dart_ListLength(expected, &got_length); |
| 245 EXPECT_VALID(res); | 230 EXPECT_VALID(res); |
| 246 EXPECT_EQ(expected_length, got_length); | 231 EXPECT_EQ(expected_length, got_length); |
| 247 for (intptr_t i = 0; i < expected_length; i++) { | 232 for (intptr_t i = 0; i < expected_length; i++) { |
| 248 Dart_Handle expected_elem = Dart_ListGetAt(expected, i); | 233 Dart_Handle expected_elem = Dart_ListGetAt(expected, i); |
| 249 EXPECT_VALID(expected_elem); | 234 EXPECT_VALID(expected_elem); |
| 250 Dart_Handle got_elem = Dart_ListGetAt(got, i); | 235 Dart_Handle got_elem = Dart_ListGetAt(got, i); |
| 251 EXPECT_VALID(got_elem); | 236 EXPECT_VALID(got_elem); |
| 252 bool equals; | 237 bool equals; |
| 253 res = Dart_ObjectEquals(expected_elem, got_elem, &equals); | 238 res = Dart_ObjectEquals(expected_elem, got_elem, &equals); |
| 254 EXPECT_VALID(res); | 239 EXPECT_VALID(res); |
| 255 EXPECT(equals || (Dart_IsNull(expected_elem) && skip_null_expects)); | 240 EXPECT(equals || (Dart_IsNull(expected_elem) && skip_null_expects)); |
| 256 } | 241 } |
| 257 } | 242 } |
| 258 | 243 |
| 259 | |
| 260 static void VerifyStackFrame(Dart_ActivationFrame frame, | 244 static void VerifyStackFrame(Dart_ActivationFrame frame, |
| 261 const char* expected_name, | 245 const char* expected_name, |
| 262 Dart_Handle expected_locals, | 246 Dart_Handle expected_locals, |
| 263 bool skip_null_expects) { | 247 bool skip_null_expects) { |
| 264 Dart_Handle func_name; | 248 Dart_Handle func_name; |
| 265 Dart_Handle func; | 249 Dart_Handle func; |
| 266 Dart_Handle res; | 250 Dart_Handle res; |
| 267 res = Dart_ActivationFrameGetLocation(frame, &func_name, &func, NULL); | 251 res = Dart_ActivationFrameGetLocation(frame, &func_name, &func, NULL); |
| 268 EXPECT_TRUE(res); | 252 EXPECT_TRUE(res); |
| 269 EXPECT(Dart_IsString(func_name)); | 253 EXPECT(Dart_IsString(func_name)); |
| 270 const char* func_name_chars; | 254 const char* func_name_chars; |
| 271 Dart_StringToCString(func_name, &func_name_chars); | 255 Dart_StringToCString(func_name, &func_name_chars); |
| 272 if (expected_name != NULL) { | 256 if (expected_name != NULL) { |
| 273 EXPECT_SUBSTRING(expected_name, func_name_chars); | 257 EXPECT_SUBSTRING(expected_name, func_name_chars); |
| 274 } | 258 } |
| 275 EXPECT(Dart_IsFunction(func)); | 259 EXPECT(Dart_IsFunction(func)); |
| 276 const char* func_name_chars_from_func_handle; | 260 const char* func_name_chars_from_func_handle; |
| 277 Dart_StringToCString(Dart_FunctionName(func), | 261 Dart_StringToCString(Dart_FunctionName(func), |
| 278 &func_name_chars_from_func_handle); | 262 &func_name_chars_from_func_handle); |
| 279 EXPECT_SUBSTRING(func_name_chars_from_func_handle, func_name_chars); | 263 EXPECT_SUBSTRING(func_name_chars_from_func_handle, func_name_chars); |
| 280 | 264 |
| 281 if (!Dart_IsNull(expected_locals)) { | 265 if (!Dart_IsNull(expected_locals)) { |
| 282 Dart_Handle locals = Dart_GetLocalVariables(frame); | 266 Dart_Handle locals = Dart_GetLocalVariables(frame); |
| 283 EXPECT_VALID(locals); | 267 EXPECT_VALID(locals); |
| 284 VerifyListEquals(expected_locals, locals, skip_null_expects); | 268 VerifyListEquals(expected_locals, locals, skip_null_expects); |
| 285 } | 269 } |
| 286 } | 270 } |
| 287 | 271 |
| 288 | |
| 289 static void VerifyStackTrace(Dart_StackTrace trace, | 272 static void VerifyStackTrace(Dart_StackTrace trace, |
| 290 const char* func_names[], | 273 const char* func_names[], |
| 291 Dart_Handle local_vars[], | 274 Dart_Handle local_vars[], |
| 292 int expected_frames, | 275 int expected_frames, |
| 293 bool skip_null_expects) { | 276 bool skip_null_expects) { |
| 294 intptr_t trace_len; | 277 intptr_t trace_len; |
| 295 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 278 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 296 EXPECT_TRUE(res); | 279 EXPECT_TRUE(res); |
| 297 uintptr_t last_frame_pointer = 0; | 280 uintptr_t last_frame_pointer = 0; |
| 298 uintptr_t frame_pointer; | 281 uintptr_t frame_pointer; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 314 } | 297 } |
| 315 last_frame_pointer = frame_pointer; | 298 last_frame_pointer = frame_pointer; |
| 316 if (i < expected_frames) { | 299 if (i < expected_frames) { |
| 317 VerifyStackFrame(frame, func_names[i], local_vars[i], skip_null_expects); | 300 VerifyStackFrame(frame, func_names[i], local_vars[i], skip_null_expects); |
| 318 } else { | 301 } else { |
| 319 VerifyStackFrame(frame, NULL, Dart_Null(), skip_null_expects); | 302 VerifyStackFrame(frame, NULL, Dart_Null(), skip_null_expects); |
| 320 } | 303 } |
| 321 } | 304 } |
| 322 } | 305 } |
| 323 | 306 |
| 324 | |
| 325 void TestBreakpointHandler(Dart_IsolateId isolate_id, | 307 void TestBreakpointHandler(Dart_IsolateId isolate_id, |
| 326 intptr_t bp_id, | 308 intptr_t bp_id, |
| 327 const Dart_CodeLocation& location) { | 309 const Dart_CodeLocation& location) { |
| 328 const char* expected_trace[] = {"A.foo", "main"}; | 310 const char* expected_trace[] = {"A.foo", "main"}; |
| 329 const intptr_t expected_trace_length = 2; | 311 const intptr_t expected_trace_length = 2; |
| 330 breakpoint_hit = true; | 312 breakpoint_hit = true; |
| 331 breakpoint_hit_counter++; | 313 breakpoint_hit_counter++; |
| 332 Dart_StackTrace trace; | 314 Dart_StackTrace trace; |
| 333 Dart_GetStackTrace(&trace); | 315 Dart_GetStackTrace(&trace); |
| 334 intptr_t trace_len; | 316 intptr_t trace_len; |
| 335 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 317 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 336 EXPECT_VALID(res); | 318 EXPECT_VALID(res); |
| 337 EXPECT_EQ(expected_trace_length, trace_len); | 319 EXPECT_EQ(expected_trace_length, trace_len); |
| 338 for (int i = 0; i < trace_len; i++) { | 320 for (int i = 0; i < trace_len; i++) { |
| 339 Dart_ActivationFrame frame; | 321 Dart_ActivationFrame frame; |
| 340 res = Dart_GetActivationFrame(trace, i, &frame); | 322 res = Dart_GetActivationFrame(trace, i, &frame); |
| 341 EXPECT_VALID(res); | 323 EXPECT_VALID(res); |
| 342 Dart_Handle func_name; | 324 Dart_Handle func_name; |
| 343 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, NULL, NULL); | 325 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, NULL, NULL); |
| 344 EXPECT_VALID(res); | 326 EXPECT_VALID(res); |
| 345 EXPECT(Dart_IsString(func_name)); | 327 EXPECT(Dart_IsString(func_name)); |
| 346 const char* name_chars; | 328 const char* name_chars; |
| 347 Dart_StringToCString(func_name, &name_chars); | 329 Dart_StringToCString(func_name, &name_chars); |
| 348 EXPECT_STREQ(expected_trace[i], name_chars); | 330 EXPECT_STREQ(expected_trace[i], name_chars); |
| 349 if (verbose) OS::Print(" >> %d: %s\n", i, name_chars); | 331 if (verbose) OS::Print(" >> %d: %s\n", i, name_chars); |
| 350 } | 332 } |
| 351 } | 333 } |
| 352 | 334 |
| 353 | |
| 354 TEST_CASE(Debug_Breakpoint) { | 335 TEST_CASE(Debug_Breakpoint) { |
| 355 const char* kScriptChars = | 336 const char* kScriptChars = |
| 356 "void moo(s) { } \n" | 337 "void moo(s) { } \n" |
| 357 "class A { \n" | 338 "class A { \n" |
| 358 " static void foo() { \n" | 339 " static void foo() { \n" |
| 359 " moo('good news'); \n" | 340 " moo('good news'); \n" |
| 360 " } \n" | 341 " } \n" |
| 361 "} \n" | 342 "} \n" |
| 362 "void main() { \n" | 343 "void main() { \n" |
| 363 " A.foo(); \n" | 344 " A.foo(); \n" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 416 pos = OS::SNPrint(buffer, buffer_size, "%s = %s ", name_cstr, value_cstr); | 397 pos = OS::SNPrint(buffer, buffer_size, "%s = %s ", name_cstr, value_cstr); |
| 417 buffer += pos; | 398 buffer += pos; |
| 418 buffer_size -= pos; | 399 buffer_size -= pos; |
| 419 } | 400 } |
| 420 pos = OS::SNPrint(buffer, buffer_size, "}\n"); | 401 pos = OS::SNPrint(buffer, buffer_size, "}\n"); |
| 421 buffer += pos; | 402 buffer += pos; |
| 422 buffer_size -= pos; | 403 buffer_size -= pos; |
| 423 } | 404 } |
| 424 } | 405 } |
| 425 | 406 |
| 426 | |
| 427 static void InspectOptimizedStack_Breakpoint(Dart_IsolateId isolate_id, | 407 static void InspectOptimizedStack_Breakpoint(Dart_IsolateId isolate_id, |
| 428 intptr_t bp_id, | 408 intptr_t bp_id, |
| 429 const Dart_CodeLocation& loc) { | 409 const Dart_CodeLocation& loc) { |
| 430 Dart_StackTrace trace; | 410 Dart_StackTrace trace; |
| 431 Dart_GetStackTrace(&trace); | 411 Dart_GetStackTrace(&trace); |
| 432 SaveStackTrace(trace); | 412 SaveStackTrace(trace); |
| 433 } | 413 } |
| 434 | 414 |
| 435 | |
| 436 static void InspectStackTest(bool optimize) { | 415 static void InspectStackTest(bool optimize) { |
| 437 const char* kScriptChars = | 416 const char* kScriptChars = |
| 438 "void breakpointNow() {\n" | 417 "void breakpointNow() {\n" |
| 439 "}\n" | 418 "}\n" |
| 440 "int helper(int a, int b, bool stop) {\n" | 419 "int helper(int a, int b, bool stop) {\n" |
| 441 " if (b == 99 && stop) {\n" | 420 " if (b == 99 && stop) {\n" |
| 442 " breakpointNow();\n" | 421 " breakpointNow();\n" |
| 443 " }\n" | 422 " }\n" |
| 444 " int c = a*b;\n" | 423 " int c = a*b;\n" |
| 445 " return c;\n" | 424 " return c;\n" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 "[3] middleMan { x = 5 limit = 100 stop = true value = 24255" | 487 "[3] middleMan { x = 5 limit = 100 stop = true value = 24255" |
| 509 " i = 99 }\n" | 488 " i = 99 }\n" |
| 510 "[4] test { stop = true limit = 100 }\n", | 489 "[4] test { stop = true limit = 100 }\n", |
| 511 stack_buffer); | 490 stack_buffer); |
| 512 } | 491 } |
| 513 | 492 |
| 514 FLAG_optimization_counter_threshold = saved_threshold; | 493 FLAG_optimization_counter_threshold = saved_threshold; |
| 515 isolate->set_use_osr(saved_use_osr); | 494 isolate->set_use_osr(saved_use_osr); |
| 516 } | 495 } |
| 517 | 496 |
| 518 | |
| 519 TEST_CASE(Debug_InspectStack_NotOptimized) { | 497 TEST_CASE(Debug_InspectStack_NotOptimized) { |
| 520 InspectStackTest(false); | 498 InspectStackTest(false); |
| 521 } | 499 } |
| 522 | 500 |
| 523 | |
| 524 TEST_CASE(Debug_InspectStack_Optimized) { | 501 TEST_CASE(Debug_InspectStack_Optimized) { |
| 525 // Ensure code gets optimized. | 502 // Ensure code gets optimized. |
| 526 FLAG_background_compilation = false; | 503 FLAG_background_compilation = false; |
| 527 InspectStackTest(true); | 504 InspectStackTest(true); |
| 528 } | 505 } |
| 529 | 506 |
| 530 | |
| 531 static void InspectStackWithClosureTest(bool optimize) { | 507 static void InspectStackWithClosureTest(bool optimize) { |
| 532 const char* kScriptChars = | 508 const char* kScriptChars = |
| 533 "void breakpointNow() {\n" | 509 "void breakpointNow() {\n" |
| 534 "}\n" | 510 "}\n" |
| 535 "int helper(int a, int b, bool stop) {\n" | 511 "int helper(int a, int b, bool stop) {\n" |
| 536 " if (b == 99 && stop) {\n" | 512 " if (b == 99 && stop) {\n" |
| 537 " breakpointNow();\n" | 513 " breakpointNow();\n" |
| 538 " }\n" | 514 " }\n" |
| 539 " int c = a*b;\n" | 515 " int c = a*b;\n" |
| 540 " return c;\n" | 516 " return c;\n" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 "[4] middleMan { x = 5 limit = 100 stop = true" | 584 "[4] middleMan { x = 5 limit = 100 stop = true" |
| 609 " value = 242550 i = 99 }\n" | 585 " value = 242550 i = 99 }\n" |
| 610 "[5] test { stop = true limit = 100 }\n", | 586 "[5] test { stop = true limit = 100 }\n", |
| 611 stack_buffer); | 587 stack_buffer); |
| 612 } | 588 } |
| 613 | 589 |
| 614 FLAG_optimization_counter_threshold = saved_threshold; | 590 FLAG_optimization_counter_threshold = saved_threshold; |
| 615 FLAG_use_osr = saved_osr; | 591 FLAG_use_osr = saved_osr; |
| 616 } | 592 } |
| 617 | 593 |
| 618 | |
| 619 TEST_CASE(Debug_InspectStackWithClosure_NotOptimized) { | 594 TEST_CASE(Debug_InspectStackWithClosure_NotOptimized) { |
| 620 InspectStackWithClosureTest(false); | 595 InspectStackWithClosureTest(false); |
| 621 } | 596 } |
| 622 | 597 |
| 623 | |
| 624 TEST_CASE(Debug_InspectStackWithClosure_Optimized) { | 598 TEST_CASE(Debug_InspectStackWithClosure_Optimized) { |
| 625 // Ensure code gets optimized. | 599 // Ensure code gets optimized. |
| 626 FLAG_background_compilation = false; | 600 FLAG_background_compilation = false; |
| 627 InspectStackWithClosureTest(true); | 601 InspectStackWithClosureTest(true); |
| 628 } | 602 } |
| 629 | 603 |
| 630 | |
| 631 void TestStepOutHandler(Dart_IsolateId isolate_id, | 604 void TestStepOutHandler(Dart_IsolateId isolate_id, |
| 632 intptr_t bp_id, | 605 intptr_t bp_id, |
| 633 const Dart_CodeLocation& location) { | 606 const Dart_CodeLocation& location) { |
| 634 Dart_StackTrace trace; | 607 Dart_StackTrace trace; |
| 635 Dart_GetStackTrace(&trace); | 608 Dart_GetStackTrace(&trace); |
| 636 const char* expected_bpts[] = {"f1", "foo", "main"}; | 609 const char* expected_bpts[] = {"f1", "foo", "main"}; |
| 637 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); | 610 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); |
| 638 intptr_t trace_len; | 611 intptr_t trace_len; |
| 639 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 612 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 640 EXPECT_VALID(res); | 613 EXPECT_VALID(res); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 652 EXPECT_STREQ(expected_bpts[breakpoint_hit_counter], name_chars); | 625 EXPECT_STREQ(expected_bpts[breakpoint_hit_counter], name_chars); |
| 653 } | 626 } |
| 654 if (verbose) { | 627 if (verbose) { |
| 655 OS::Print(" >> bpt nr %d: %s\n", breakpoint_hit_counter, name_chars); | 628 OS::Print(" >> bpt nr %d: %s\n", breakpoint_hit_counter, name_chars); |
| 656 } | 629 } |
| 657 breakpoint_hit = true; | 630 breakpoint_hit = true; |
| 658 breakpoint_hit_counter++; | 631 breakpoint_hit_counter++; |
| 659 Dart_SetStepOut(); | 632 Dart_SetStepOut(); |
| 660 } | 633 } |
| 661 | 634 |
| 662 | |
| 663 TEST_CASE(Debug_StepOut) { | 635 TEST_CASE(Debug_StepOut) { |
| 664 const char* kScriptChars = | 636 const char* kScriptChars = |
| 665 "f1() { return 1; } \n" | 637 "f1() { return 1; } \n" |
| 666 "f2() { return 2; } \n" | 638 "f2() { return 2; } \n" |
| 667 " \n" | 639 " \n" |
| 668 "foo() { \n" | 640 "foo() { \n" |
| 669 " f1(); \n" | 641 " f1(); \n" |
| 670 " return f2(); \n" | 642 " return f2(); \n" |
| 671 "} \n" | 643 "} \n" |
| 672 " \n" | 644 " \n" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 EXPECT_STREQ(step_into_expected_bpts[breakpoint_hit_counter], name_chars); | 706 EXPECT_STREQ(step_into_expected_bpts[breakpoint_hit_counter], name_chars); |
| 735 } | 707 } |
| 736 if (verbose) { | 708 if (verbose) { |
| 737 OS::Print(" >> bpt nr %d: %s\n", breakpoint_hit_counter, name_chars); | 709 OS::Print(" >> bpt nr %d: %s\n", breakpoint_hit_counter, name_chars); |
| 738 } | 710 } |
| 739 breakpoint_hit = true; | 711 breakpoint_hit = true; |
| 740 breakpoint_hit_counter++; | 712 breakpoint_hit_counter++; |
| 741 Dart_SetStepInto(); | 713 Dart_SetStepInto(); |
| 742 } | 714 } |
| 743 | 715 |
| 744 | |
| 745 TEST_CASE(Debug_StepInto) { | 716 TEST_CASE(Debug_StepInto) { |
| 746 const char* kScriptChars = | 717 const char* kScriptChars = |
| 747 "f1() { return 1; } \n" | 718 "f1() { return 1; } \n" |
| 748 "f2() { return 2; } \n" | 719 "f2() { return 2; } \n" |
| 749 " \n" | 720 " \n" |
| 750 "class X { \n" | 721 "class X { \n" |
| 751 " kvmk(a, {b, c}) { \n" | 722 " kvmk(a, {b, c}) { \n" |
| 752 " return c + f2(); \n" | 723 " return c + f2(); \n" |
| 753 " } \n" | 724 " } \n" |
| 754 "} \n" | 725 "} \n" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 773 breakpoint_hit_counter = 0; | 744 breakpoint_hit_counter = 0; |
| 774 Dart_Handle retval = Invoke("main"); | 745 Dart_Handle retval = Invoke("main"); |
| 775 EXPECT_VALID(retval); | 746 EXPECT_VALID(retval); |
| 776 EXPECT(Dart_IsInteger(retval)); | 747 EXPECT(Dart_IsInteger(retval)); |
| 777 int64_t int_value = ToInt64(retval); | 748 int64_t int_value = ToInt64(retval); |
| 778 EXPECT_EQ(7, int_value); | 749 EXPECT_EQ(7, int_value); |
| 779 EXPECT(breakpoint_hit == true); | 750 EXPECT(breakpoint_hit == true); |
| 780 EXPECT(breakpoint_hit_counter == ARRAY_SIZE(step_into_expected_bpts)); | 751 EXPECT(breakpoint_hit_counter == ARRAY_SIZE(step_into_expected_bpts)); |
| 781 } | 752 } |
| 782 | 753 |
| 783 | |
| 784 static void StepIntoHandler(Dart_IsolateId isolate_id, | 754 static void StepIntoHandler(Dart_IsolateId isolate_id, |
| 785 intptr_t bp_id, | 755 intptr_t bp_id, |
| 786 const Dart_CodeLocation& location) { | 756 const Dart_CodeLocation& location) { |
| 787 Dart_StackTrace trace; | 757 Dart_StackTrace trace; |
| 788 Dart_GetStackTrace(&trace); | 758 Dart_GetStackTrace(&trace); |
| 789 if (verbose) { | 759 if (verbose) { |
| 790 OS::Print(">>> Breakpoint nr. %d in %s <<<\n", breakpoint_hit_counter, | 760 OS::Print(">>> Breakpoint nr. %d in %s <<<\n", breakpoint_hit_counter, |
| 791 BreakpointInfo(trace)); | 761 BreakpointInfo(trace)); |
| 792 PrintStackTrace(trace); | 762 PrintStackTrace(trace); |
| 793 } | 763 } |
| 794 breakpoint_hit = true; | 764 breakpoint_hit = true; |
| 795 breakpoint_hit_counter++; | 765 breakpoint_hit_counter++; |
| 796 Dart_SetStepInto(); | 766 Dart_SetStepInto(); |
| 797 } | 767 } |
| 798 | 768 |
| 799 | |
| 800 TEST_CASE(Debug_IgnoreBP) { | 769 TEST_CASE(Debug_IgnoreBP) { |
| 801 const char* kScriptChars = | 770 const char* kScriptChars = |
| 802 "class B { \n" | 771 "class B { \n" |
| 803 " static var z = 0; \n" | 772 " static var z = 0; \n" |
| 804 " var i = 100; \n" | 773 " var i = 100; \n" |
| 805 " var d = 3.14; \n" | 774 " var d = 3.14; \n" |
| 806 " var s = 'Dr Seuss'; \n" | 775 " var s = 'Dr Seuss'; \n" |
| 807 "} \n" | 776 "} \n" |
| 808 " \n" | 777 " \n" |
| 809 "main() { \n" | 778 "main() { \n" |
| 810 " var x = new B(); \n" | 779 " var x = new B(); \n" |
| 811 " return x.i + 1; \n" | 780 " return x.i + 1; \n" |
| 812 "} \n"; | 781 "} \n"; |
| 813 | 782 |
| 814 LoadScript(kScriptChars); | 783 LoadScript(kScriptChars); |
| 815 Dart_SetPausedEventHandler(&StepIntoHandler); | 784 Dart_SetPausedEventHandler(&StepIntoHandler); |
| 816 | 785 |
| 817 SetBreakpointAtEntry("", "main"); | 786 SetBreakpointAtEntry("", "main"); |
| 818 | 787 |
| 819 breakpoint_hit = false; | 788 breakpoint_hit = false; |
| 820 breakpoint_hit_counter = 0; | 789 breakpoint_hit_counter = 0; |
| 821 Dart_Handle retval = Invoke("main"); | 790 Dart_Handle retval = Invoke("main"); |
| 822 EXPECT_VALID(retval); | 791 EXPECT_VALID(retval); |
| 823 EXPECT(Dart_IsInteger(retval)); | 792 EXPECT(Dart_IsInteger(retval)); |
| 824 int64_t int_value = ToInt64(retval); | 793 int64_t int_value = ToInt64(retval); |
| 825 EXPECT_EQ(101, int_value); | 794 EXPECT_EQ(101, int_value); |
| 826 EXPECT(breakpoint_hit == true); | 795 EXPECT(breakpoint_hit == true); |
| 827 } | 796 } |
| 828 | 797 |
| 829 | |
| 830 TEST_CASE(Debug_DeoptimizeFunction) { | 798 TEST_CASE(Debug_DeoptimizeFunction) { |
| 831 const char* kScriptChars = | 799 const char* kScriptChars = |
| 832 "foo(x) => 2 * x; \n" | 800 "foo(x) => 2 * x; \n" |
| 833 " \n" | 801 " \n" |
| 834 "warmup() { \n" | 802 "warmup() { \n" |
| 835 " for (int i = 0; i < 5000; i++) { \n" | 803 " for (int i = 0; i < 5000; i++) { \n" |
| 836 " foo(i); \n" | 804 " foo(i); \n" |
| 837 " } \n" | 805 " } \n" |
| 838 "} \n" | 806 "} \n" |
| 839 " \n" | 807 " \n" |
| 840 "main() { \n" | 808 "main() { \n" |
| 841 " return foo(99); \n" | 809 " return foo(99); \n" |
| 842 "} \n"; | 810 "} \n"; |
| 843 | 811 |
| 844 LoadScript(kScriptChars); | 812 LoadScript(kScriptChars); |
| 845 Dart_SetPausedEventHandler(&StepIntoHandler); | 813 Dart_SetPausedEventHandler(&StepIntoHandler); |
| 846 | 814 |
| 847 | |
| 848 // Cause function foo to be optimized before we set a BP. | 815 // Cause function foo to be optimized before we set a BP. |
| 849 Dart_Handle res = Invoke("warmup"); | 816 Dart_Handle res = Invoke("warmup"); |
| 850 EXPECT_VALID(res); | 817 EXPECT_VALID(res); |
| 851 | 818 |
| 852 // Now set breakpoint in main and then step into optimized function foo. | 819 // Now set breakpoint in main and then step into optimized function foo. |
| 853 SetBreakpointAtEntry("", "main"); | 820 SetBreakpointAtEntry("", "main"); |
| 854 | 821 |
| 855 | |
| 856 breakpoint_hit = false; | 822 breakpoint_hit = false; |
| 857 breakpoint_hit_counter = 0; | 823 breakpoint_hit_counter = 0; |
| 858 Dart_Handle retval = Invoke("main"); | 824 Dart_Handle retval = Invoke("main"); |
| 859 EXPECT_VALID(retval); | 825 EXPECT_VALID(retval); |
| 860 EXPECT(Dart_IsInteger(retval)); | 826 EXPECT(Dart_IsInteger(retval)); |
| 861 int64_t int_value = ToInt64(retval); | 827 int64_t int_value = ToInt64(retval); |
| 862 EXPECT_EQ(2 * 99, int_value); | 828 EXPECT_EQ(2 * 99, int_value); |
| 863 EXPECT(breakpoint_hit == true); | 829 EXPECT(breakpoint_hit == true); |
| 864 } | 830 } |
| 865 | 831 |
| 866 | |
| 867 void TestSingleStepHandler(Dart_IsolateId isolate_id, | 832 void TestSingleStepHandler(Dart_IsolateId isolate_id, |
| 868 intptr_t bp_id, | 833 intptr_t bp_id, |
| 869 const Dart_CodeLocation& location) { | 834 const Dart_CodeLocation& location) { |
| 870 Dart_StackTrace trace; | 835 Dart_StackTrace trace; |
| 871 Dart_GetStackTrace(&trace); | 836 Dart_GetStackTrace(&trace); |
| 872 const char* expected_bpts[] = {"moo", "moo", "foo", "moo", "moo", | 837 const char* expected_bpts[] = {"moo", "moo", "foo", "moo", "moo", |
| 873 "foo", "moo", "moo", "foo", "main"}; | 838 "foo", "moo", "moo", "foo", "main"}; |
| 874 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); | 839 const intptr_t expected_bpts_length = ARRAY_SIZE(expected_bpts); |
| 875 intptr_t trace_len; | 840 intptr_t trace_len; |
| 876 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 841 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 889 OS::Print(" >> bpt nr %d: %s\n", breakpoint_hit_counter, name_chars); | 854 OS::Print(" >> bpt nr %d: %s\n", breakpoint_hit_counter, name_chars); |
| 890 } | 855 } |
| 891 if (breakpoint_hit_counter < expected_bpts_length) { | 856 if (breakpoint_hit_counter < expected_bpts_length) { |
| 892 EXPECT_STREQ(expected_bpts[breakpoint_hit_counter], name_chars); | 857 EXPECT_STREQ(expected_bpts[breakpoint_hit_counter], name_chars); |
| 893 } | 858 } |
| 894 breakpoint_hit = true; | 859 breakpoint_hit = true; |
| 895 breakpoint_hit_counter++; | 860 breakpoint_hit_counter++; |
| 896 Dart_SetStepOver(); | 861 Dart_SetStepOver(); |
| 897 } | 862 } |
| 898 | 863 |
| 899 | |
| 900 TEST_CASE(Debug_SingleStep) { | 864 TEST_CASE(Debug_SingleStep) { |
| 901 const char* kScriptChars = | 865 const char* kScriptChars = |
| 902 "moo(s) { return 1; } \n" | 866 "moo(s) { return 1; } \n" |
| 903 " \n" | 867 " \n" |
| 904 "void foo() { \n" | 868 "void foo() { \n" |
| 905 " moo('step one'); \n" | 869 " moo('step one'); \n" |
| 906 " moo('step two'); \n" | 870 " moo('step two'); \n" |
| 907 " moo('step three'); \n" | 871 " moo('step three'); \n" |
| 908 "} \n" | 872 "} \n" |
| 909 " \n" | 873 " \n" |
| 910 "void main() { \n" | 874 "void main() { \n" |
| 911 " foo(); \n" | 875 " foo(); \n" |
| 912 "} \n"; | 876 "} \n"; |
| 913 | 877 |
| 914 LoadScript(kScriptChars); | 878 LoadScript(kScriptChars); |
| 915 Dart_SetPausedEventHandler(&TestSingleStepHandler); | 879 Dart_SetPausedEventHandler(&TestSingleStepHandler); |
| 916 | 880 |
| 917 SetBreakpointAtEntry("", "moo"); | 881 SetBreakpointAtEntry("", "moo"); |
| 918 | 882 |
| 919 breakpoint_hit = false; | 883 breakpoint_hit = false; |
| 920 breakpoint_hit_counter = 0; | 884 breakpoint_hit_counter = 0; |
| 921 Dart_Handle retval = Invoke("main"); | 885 Dart_Handle retval = Invoke("main"); |
| 922 EXPECT_VALID(retval); | 886 EXPECT_VALID(retval); |
| 923 EXPECT(breakpoint_hit == true); | 887 EXPECT(breakpoint_hit == true); |
| 924 } | 888 } |
| 925 | 889 |
| 926 | |
| 927 static void ClosureBreakpointHandler(Dart_IsolateId isolate_id, | 890 static void ClosureBreakpointHandler(Dart_IsolateId isolate_id, |
| 928 intptr_t bp_id, | 891 intptr_t bp_id, |
| 929 const Dart_CodeLocation& location) { | 892 const Dart_CodeLocation& location) { |
| 930 Dart_StackTrace trace; | 893 Dart_StackTrace trace; |
| 931 Dart_GetStackTrace(&trace); | 894 Dart_GetStackTrace(&trace); |
| 932 const char* expected_trace[] = {"callback", "main"}; | 895 const char* expected_trace[] = {"callback", "main"}; |
| 933 const intptr_t expected_trace_length = 2; | 896 const intptr_t expected_trace_length = 2; |
| 934 breakpoint_hit_counter++; | 897 breakpoint_hit_counter++; |
| 935 intptr_t trace_len; | 898 intptr_t trace_len; |
| 936 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 899 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 937 EXPECT_VALID(res); | 900 EXPECT_VALID(res); |
| 938 EXPECT_EQ(expected_trace_length, trace_len); | 901 EXPECT_EQ(expected_trace_length, trace_len); |
| 939 for (int i = 0; i < trace_len; i++) { | 902 for (int i = 0; i < trace_len; i++) { |
| 940 Dart_ActivationFrame frame; | 903 Dart_ActivationFrame frame; |
| 941 res = Dart_GetActivationFrame(trace, i, &frame); | 904 res = Dart_GetActivationFrame(trace, i, &frame); |
| 942 EXPECT_VALID(res); | 905 EXPECT_VALID(res); |
| 943 Dart_Handle func_name; | 906 Dart_Handle func_name; |
| 944 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, NULL, NULL); | 907 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, NULL, NULL); |
| 945 EXPECT_VALID(res); | 908 EXPECT_VALID(res); |
| 946 EXPECT(Dart_IsString(func_name)); | 909 EXPECT(Dart_IsString(func_name)); |
| 947 const char* name_chars; | 910 const char* name_chars; |
| 948 Dart_StringToCString(func_name, &name_chars); | 911 Dart_StringToCString(func_name, &name_chars); |
| 949 EXPECT_STREQ(expected_trace[i], name_chars); | 912 EXPECT_STREQ(expected_trace[i], name_chars); |
| 950 if (verbose) OS::Print(" >> %d: %s\n", i, name_chars); | 913 if (verbose) OS::Print(" >> %d: %s\n", i, name_chars); |
| 951 } | 914 } |
| 952 } | 915 } |
| 953 | 916 |
| 954 | |
| 955 TEST_CASE(Debug_ClosureBreakpoint) { | 917 TEST_CASE(Debug_ClosureBreakpoint) { |
| 956 const char* kScriptChars = | 918 const char* kScriptChars = |
| 957 "callback(s) { \n" | 919 "callback(s) { \n" |
| 958 " return 111; \n" | 920 " return 111; \n" |
| 959 "} \n" | 921 "} \n" |
| 960 " \n" | 922 " \n" |
| 961 "main() { \n" | 923 "main() { \n" |
| 962 " var h = callback; \n" | 924 " var h = callback; \n" |
| 963 " h('bla'); \n" | 925 " h('bla'); \n" |
| 964 " callback('jada'); \n" | 926 " callback('jada'); \n" |
| 965 " return 442; \n" | 927 " return 442; \n" |
| 966 "} \n"; | 928 "} \n"; |
| 967 | 929 |
| 968 LoadScript(kScriptChars); | 930 LoadScript(kScriptChars); |
| 969 Dart_SetPausedEventHandler(&ClosureBreakpointHandler); | 931 Dart_SetPausedEventHandler(&ClosureBreakpointHandler); |
| 970 | 932 |
| 971 SetBreakpointAtEntry("", "callback"); | 933 SetBreakpointAtEntry("", "callback"); |
| 972 | 934 |
| 973 breakpoint_hit_counter = 0; | 935 breakpoint_hit_counter = 0; |
| 974 Dart_Handle retval = Invoke("main"); | 936 Dart_Handle retval = Invoke("main"); |
| 975 EXPECT_VALID(retval); | 937 EXPECT_VALID(retval); |
| 976 int64_t int_value = ToInt64(retval); | 938 int64_t int_value = ToInt64(retval); |
| 977 EXPECT_EQ(442, int_value); | 939 EXPECT_EQ(442, int_value); |
| 978 EXPECT_EQ(2, breakpoint_hit_counter); | 940 EXPECT_EQ(2, breakpoint_hit_counter); |
| 979 } | 941 } |
| 980 | 942 |
| 981 | |
| 982 static void ExprClosureBreakpointHandler(Dart_IsolateId isolate_id, | 943 static void ExprClosureBreakpointHandler(Dart_IsolateId isolate_id, |
| 983 intptr_t bp_id, | 944 intptr_t bp_id, |
| 984 const Dart_CodeLocation& location) { | 945 const Dart_CodeLocation& location) { |
| 985 Dart_StackTrace trace; | 946 Dart_StackTrace trace; |
| 986 Dart_GetStackTrace(&trace); | 947 Dart_GetStackTrace(&trace); |
| 987 static const char* expected_trace[] = {"<anonymous closure>", "main"}; | 948 static const char* expected_trace[] = {"<anonymous closure>", "main"}; |
| 988 Dart_Handle add_locals = Dart_NewList(4); | 949 Dart_Handle add_locals = Dart_NewList(4); |
| 989 Dart_ListSetAt(add_locals, 0, NewString("a")); | 950 Dart_ListSetAt(add_locals, 0, NewString("a")); |
| 990 Dart_ListSetAt(add_locals, 1, Dart_NewInteger(10)); | 951 Dart_ListSetAt(add_locals, 1, Dart_NewInteger(10)); |
| 991 Dart_ListSetAt(add_locals, 2, NewString("b")); | 952 Dart_ListSetAt(add_locals, 2, NewString("b")); |
| 992 Dart_ListSetAt(add_locals, 3, Dart_NewInteger(20)); | 953 Dart_ListSetAt(add_locals, 3, Dart_NewInteger(20)); |
| 993 Dart_Handle expected_locals[] = {add_locals, Dart_Null()}; | 954 Dart_Handle expected_locals[] = {add_locals, Dart_Null()}; |
| 994 breakpoint_hit_counter++; | 955 breakpoint_hit_counter++; |
| 995 PrintStackTrace(trace); | 956 PrintStackTrace(trace); |
| 996 VerifyStackTrace(trace, expected_trace, expected_locals, 2, false); | 957 VerifyStackTrace(trace, expected_trace, expected_locals, 2, false); |
| 997 } | 958 } |
| 998 | 959 |
| 999 | |
| 1000 TEST_CASE(Debug_ExprClosureBreakpoint) { | 960 TEST_CASE(Debug_ExprClosureBreakpoint) { |
| 1001 const char* kScriptChars = | 961 const char* kScriptChars = |
| 1002 "var c; \n" | 962 "var c; \n" |
| 1003 " \n" | 963 " \n" |
| 1004 "main() { \n" | 964 "main() { \n" |
| 1005 " c = (a, b) { \n" | 965 " c = (a, b) { \n" |
| 1006 " return a + b; \n" | 966 " return a + b; \n" |
| 1007 " }; \n" | 967 " }; \n" |
| 1008 " return c(10, 20); \n" | 968 " return c(10, 20); \n" |
| 1009 "} \n"; | 969 "} \n"; |
| 1010 | 970 |
| 1011 LoadScript(kScriptChars); | 971 LoadScript(kScriptChars); |
| 1012 Dart_SetPausedEventHandler(&ExprClosureBreakpointHandler); | 972 Dart_SetPausedEventHandler(&ExprClosureBreakpointHandler); |
| 1013 | 973 |
| 1014 Dart_Handle script_url = NewString(TestCase::url()); | 974 Dart_Handle script_url = NewString(TestCase::url()); |
| 1015 intptr_t line_no = 5; // In closure 'add'. | 975 intptr_t line_no = 5; // In closure 'add'. |
| 1016 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 976 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 1017 EXPECT_VALID(res); | 977 EXPECT_VALID(res); |
| 1018 EXPECT(Dart_IsInteger(res)); | 978 EXPECT(Dart_IsInteger(res)); |
| 1019 | 979 |
| 1020 breakpoint_hit_counter = 0; | 980 breakpoint_hit_counter = 0; |
| 1021 Dart_Handle retval = Invoke("main"); | 981 Dart_Handle retval = Invoke("main"); |
| 1022 EXPECT_VALID(retval); | 982 EXPECT_VALID(retval); |
| 1023 int64_t int_value = ToInt64(retval); | 983 int64_t int_value = ToInt64(retval); |
| 1024 EXPECT_EQ(30, int_value); | 984 EXPECT_EQ(30, int_value); |
| 1025 EXPECT_EQ(1, breakpoint_hit_counter); | 985 EXPECT_EQ(1, breakpoint_hit_counter); |
| 1026 } | 986 } |
| 1027 | 987 |
| 1028 | |
| 1029 void TestBreakpointHandlerWithVerify(Dart_IsolateId isolate_id, | 988 void TestBreakpointHandlerWithVerify(Dart_IsolateId isolate_id, |
| 1030 intptr_t bp_id, | 989 intptr_t bp_id, |
| 1031 const Dart_CodeLocation& location) { | 990 const Dart_CodeLocation& location) { |
| 1032 breakpoint_hit = true; | 991 breakpoint_hit = true; |
| 1033 breakpoint_hit_counter++; | 992 breakpoint_hit_counter++; |
| 1034 Dart_StackTrace trace; | 993 Dart_StackTrace trace; |
| 1035 Dart_GetStackTrace(&trace); | 994 Dart_GetStackTrace(&trace); |
| 1036 Dart_ActivationFrame frame; | 995 Dart_ActivationFrame frame; |
| 1037 Dart_Handle res = Dart_GetActivationFrame(trace, 0, &frame); | 996 Dart_Handle res = Dart_GetActivationFrame(trace, 0, &frame); |
| 1038 EXPECT_VALID(res); | 997 EXPECT_VALID(res); |
| 1039 Dart_Handle func_name; | 998 Dart_Handle func_name; |
| 1040 intptr_t line_number = -1; | 999 intptr_t line_number = -1; |
| 1041 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, &line_number, NULL); | 1000 res = Dart_ActivationFrameInfo(frame, &func_name, NULL, &line_number, NULL); |
| 1042 EXPECT_NE(-1, line_number); | 1001 EXPECT_NE(-1, line_number); |
| 1043 if (verbose) OS::Print("Hit line %" Pd "\n", line_number); | 1002 if (verbose) OS::Print("Hit line %" Pd "\n", line_number); |
| 1044 | 1003 |
| 1045 VerifyPointersVisitor::VerifyPointers(); | 1004 VerifyPointersVisitor::VerifyPointers(); |
| 1046 } | 1005 } |
| 1047 | 1006 |
| 1048 | |
| 1049 static void NoopNativeFunction(Dart_NativeArguments args) { | 1007 static void NoopNativeFunction(Dart_NativeArguments args) { |
| 1050 Dart_EnterScope(); | 1008 Dart_EnterScope(); |
| 1051 Dart_SetReturnValue(args, Dart_True()); | 1009 Dart_SetReturnValue(args, Dart_True()); |
| 1052 Dart_ExitScope(); | 1010 Dart_ExitScope(); |
| 1053 } | 1011 } |
| 1054 | 1012 |
| 1055 | |
| 1056 static Dart_NativeFunction NoopNativeResolver(Dart_Handle name, | 1013 static Dart_NativeFunction NoopNativeResolver(Dart_Handle name, |
| 1057 int arg_count, | 1014 int arg_count, |
| 1058 bool* auto_setup_scope) { | 1015 bool* auto_setup_scope) { |
| 1059 ASSERT(auto_setup_scope != NULL); | 1016 ASSERT(auto_setup_scope != NULL); |
| 1060 *auto_setup_scope = false; | 1017 *auto_setup_scope = false; |
| 1061 return &NoopNativeFunction; | 1018 return &NoopNativeFunction; |
| 1062 } | 1019 } |
| 1063 | 1020 |
| 1064 | |
| 1065 TEST_CASE(Debug_BreakpointStubPatching) { | 1021 TEST_CASE(Debug_BreakpointStubPatching) { |
| 1066 // Note changes to this script may require changes to the breakpoint line | 1022 // Note changes to this script may require changes to the breakpoint line |
| 1067 // numbers below. | 1023 // numbers below. |
| 1068 const char* kScriptChars = | 1024 const char* kScriptChars = |
| 1069 "bar(i) {} \n" | 1025 "bar(i) {} \n" |
| 1070 "nat() native 'a'; \n" | 1026 "nat() native 'a'; \n" |
| 1071 "foo(n) { \n" | 1027 "foo(n) { \n" |
| 1072 " for(var i = 0; i < n; i++) { \n" | 1028 " for(var i = 0; i < n; i++) { \n" |
| 1073 " bar(i); \n" // Static call. | 1029 " bar(i); \n" // Static call. |
| 1074 " i++; \n" // Instance call. | 1030 " i++; \n" // Instance call. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1105 } | 1061 } |
| 1106 | 1062 |
| 1107 breakpoint_hit = false; | 1063 breakpoint_hit = false; |
| 1108 breakpoint_hit_counter = 0; | 1064 breakpoint_hit_counter = 0; |
| 1109 Dart_Handle retval = Invoke("main"); | 1065 Dart_Handle retval = Invoke("main"); |
| 1110 EXPECT_VALID(retval); | 1066 EXPECT_VALID(retval); |
| 1111 EXPECT(breakpoint_hit == true); | 1067 EXPECT(breakpoint_hit == true); |
| 1112 EXPECT_EQ(num_breakpoints, breakpoint_hit_counter); | 1068 EXPECT_EQ(num_breakpoints, breakpoint_hit_counter); |
| 1113 } | 1069 } |
| 1114 | 1070 |
| 1115 | |
| 1116 static intptr_t bp_id_to_be_deleted; | 1071 static intptr_t bp_id_to_be_deleted; |
| 1117 | 1072 |
| 1118 static void DeleteBreakpointHandler(Dart_IsolateId isolate_id, | 1073 static void DeleteBreakpointHandler(Dart_IsolateId isolate_id, |
| 1119 intptr_t bp_id, | 1074 intptr_t bp_id, |
| 1120 const Dart_CodeLocation& location) { | 1075 const Dart_CodeLocation& location) { |
| 1121 Dart_StackTrace trace; | 1076 Dart_StackTrace trace; |
| 1122 Dart_GetStackTrace(&trace); | 1077 Dart_GetStackTrace(&trace); |
| 1123 const char* expected_trace[] = {"foo", "main"}; | 1078 const char* expected_trace[] = {"foo", "main"}; |
| 1124 const intptr_t expected_trace_length = 2; | 1079 const intptr_t expected_trace_length = 2; |
| 1125 breakpoint_hit_counter++; | 1080 breakpoint_hit_counter++; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1142 } | 1097 } |
| 1143 // Remove the breakpoint after we've hit it twice | 1098 // Remove the breakpoint after we've hit it twice |
| 1144 if (breakpoint_hit_counter == 2) { | 1099 if (breakpoint_hit_counter == 2) { |
| 1145 if (verbose) OS::Print("uninstalling breakpoint\n"); | 1100 if (verbose) OS::Print("uninstalling breakpoint\n"); |
| 1146 EXPECT_EQ(bp_id_to_be_deleted, bp_id); | 1101 EXPECT_EQ(bp_id_to_be_deleted, bp_id); |
| 1147 Dart_Handle res = Dart_RemoveBreakpoint(bp_id); | 1102 Dart_Handle res = Dart_RemoveBreakpoint(bp_id); |
| 1148 EXPECT_VALID(res); | 1103 EXPECT_VALID(res); |
| 1149 } | 1104 } |
| 1150 } | 1105 } |
| 1151 | 1106 |
| 1152 | |
| 1153 TEST_CASE(Debug_DeleteBreakpoint) { | 1107 TEST_CASE(Debug_DeleteBreakpoint) { |
| 1154 const char* kScriptChars = | 1108 const char* kScriptChars = |
| 1155 "moo(s) { } \n" | 1109 "moo(s) { } \n" |
| 1156 " \n" | 1110 " \n" |
| 1157 "foo() { \n" | 1111 "foo() { \n" |
| 1158 " moo('good news'); \n" | 1112 " moo('good news'); \n" |
| 1159 "} \n" | 1113 "} \n" |
| 1160 " \n" | 1114 " \n" |
| 1161 "void main() { \n" | 1115 "void main() { \n" |
| 1162 " foo(); \n" | 1116 " foo(); \n" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1179 // Function main() calls foo() 3 times. On the second iteration, the | 1133 // Function main() calls foo() 3 times. On the second iteration, the |
| 1180 // breakpoint is removed by the handler, so we expect the breakpoint | 1134 // breakpoint is removed by the handler, so we expect the breakpoint |
| 1181 // to fire twice only. | 1135 // to fire twice only. |
| 1182 bp_id_to_be_deleted = bp_id; | 1136 bp_id_to_be_deleted = bp_id; |
| 1183 breakpoint_hit_counter = 0; | 1137 breakpoint_hit_counter = 0; |
| 1184 Dart_Handle retval = Invoke("main"); | 1138 Dart_Handle retval = Invoke("main"); |
| 1185 EXPECT_VALID(retval); | 1139 EXPECT_VALID(retval); |
| 1186 EXPECT_EQ(2, breakpoint_hit_counter); | 1140 EXPECT_EQ(2, breakpoint_hit_counter); |
| 1187 } | 1141 } |
| 1188 | 1142 |
| 1189 | |
| 1190 static void InspectStaticFieldHandler(Dart_IsolateId isolate_id, | 1143 static void InspectStaticFieldHandler(Dart_IsolateId isolate_id, |
| 1191 intptr_t bp_id, | 1144 intptr_t bp_id, |
| 1192 const Dart_CodeLocation& location) { | 1145 const Dart_CodeLocation& location) { |
| 1193 Dart_StackTrace trace; | 1146 Dart_StackTrace trace; |
| 1194 Dart_GetStackTrace(&trace); | 1147 Dart_GetStackTrace(&trace); |
| 1195 ASSERT(script_lib != NULL); | 1148 ASSERT(script_lib != NULL); |
| 1196 ASSERT(!Dart_IsError(script_lib)); | 1149 ASSERT(!Dart_IsError(script_lib)); |
| 1197 ASSERT(Dart_IsLibrary(script_lib)); | 1150 ASSERT(Dart_IsLibrary(script_lib)); |
| 1198 Dart_Handle class_A = Dart_GetClass(script_lib, NewString("A")); | 1151 Dart_Handle class_A = Dart_GetClass(script_lib, NewString("A")); |
| 1199 EXPECT_VALID(class_A); | 1152 EXPECT_VALID(class_A); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1236 EXPECT_VALID(value_handle); | 1189 EXPECT_VALID(value_handle); |
| 1237 EXPECT(Dart_IsString(value_handle)); | 1190 EXPECT(Dart_IsString(value_handle)); |
| 1238 char const* value; | 1191 char const* value; |
| 1239 Dart_StringToCString(value_handle, &value); | 1192 Dart_StringToCString(value_handle, &value); |
| 1240 EXPECT_STREQ(expected[expected_idx].field_value, value); | 1193 EXPECT_STREQ(expected[expected_idx].field_value, value); |
| 1241 OS::Print(" %s: %s\n", name, value); | 1194 OS::Print(" %s: %s\n", name, value); |
| 1242 expected_idx++; | 1195 expected_idx++; |
| 1243 } | 1196 } |
| 1244 } | 1197 } |
| 1245 | 1198 |
| 1246 | |
| 1247 TEST_CASE(Debug_InspectStaticField) { | 1199 TEST_CASE(Debug_InspectStaticField) { |
| 1248 const char* kScriptChars = | 1200 const char* kScriptChars = |
| 1249 " class A { \n" | 1201 " class A { \n" |
| 1250 " static var bla = 'yada yada yada'; \n" | 1202 " static var bla = 'yada yada yada'; \n" |
| 1251 " static var u; \n" | 1203 " static var u; \n" |
| 1252 " } \n" | 1204 " } \n" |
| 1253 " \n" | 1205 " \n" |
| 1254 " debugBreak() { } \n" | 1206 " debugBreak() { } \n" |
| 1255 " main() { \n" | 1207 " main() { \n" |
| 1256 " var a = new A(); \n" | 1208 " var a = new A(); \n" |
| 1257 " debugBreak(); \n" | 1209 " debugBreak(); \n" |
| 1258 " A.u = 442; \n" | 1210 " A.u = 442; \n" |
| 1259 " A.bla = 'silence is golden'; \n" | 1211 " A.bla = 'silence is golden'; \n" |
| 1260 " debugBreak(); \n" | 1212 " debugBreak(); \n" |
| 1261 " } \n"; | 1213 " } \n"; |
| 1262 | 1214 |
| 1263 LoadScript(kScriptChars); | 1215 LoadScript(kScriptChars); |
| 1264 Dart_SetPausedEventHandler(&InspectStaticFieldHandler); | 1216 Dart_SetPausedEventHandler(&InspectStaticFieldHandler); |
| 1265 SetBreakpointAtEntry("", "debugBreak"); | 1217 SetBreakpointAtEntry("", "debugBreak"); |
| 1266 | 1218 |
| 1267 breakpoint_hit_counter = 0; | 1219 breakpoint_hit_counter = 0; |
| 1268 Dart_Handle retval = Invoke("main"); | 1220 Dart_Handle retval = Invoke("main"); |
| 1269 EXPECT_VALID(retval); | 1221 EXPECT_VALID(retval); |
| 1270 } | 1222 } |
| 1271 | 1223 |
| 1272 | |
| 1273 TEST_CASE(Debug_InspectObject) { | 1224 TEST_CASE(Debug_InspectObject) { |
| 1274 const char* kScriptChars = | 1225 const char* kScriptChars = |
| 1275 " class A { \n" | 1226 " class A { \n" |
| 1276 " var a_field = 'a'; \n" | 1227 " var a_field = 'a'; \n" |
| 1277 " static var bla = 'yada yada yada'; \n" | 1228 " static var bla = 'yada yada yada'; \n" |
| 1278 " static var error = unresolvedName(); \n" | 1229 " static var error = unresolvedName(); \n" |
| 1279 " var d = 42.1; \n" | 1230 " var d = 42.1; \n" |
| 1280 " } \n" | 1231 " } \n" |
| 1281 " class B extends A { \n" | 1232 " class B extends A { \n" |
| 1282 " var oneDay = const Duration(hours: 24); \n" | 1233 " var oneDay = const Duration(hours: 24); \n" |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1384 // The static field "error" should result in a compile error. | 1335 // The static field "error" should result in a compile error. |
| 1385 name_handle = Dart_ListGetAt(fields, 2); | 1336 name_handle = Dart_ListGetAt(fields, 2); |
| 1386 EXPECT_VALID(name_handle); | 1337 EXPECT_VALID(name_handle); |
| 1387 EXPECT(Dart_IsString(name_handle)); | 1338 EXPECT(Dart_IsString(name_handle)); |
| 1388 Dart_StringToCString(name_handle, &name); | 1339 Dart_StringToCString(name_handle, &name); |
| 1389 EXPECT_STREQ("error", name); | 1340 EXPECT_STREQ("error", name); |
| 1390 value_handle = Dart_ListGetAt(fields, 3); | 1341 value_handle = Dart_ListGetAt(fields, 3); |
| 1391 EXPECT(Dart_IsError(value_handle)); | 1342 EXPECT(Dart_IsError(value_handle)); |
| 1392 } | 1343 } |
| 1393 | 1344 |
| 1394 | |
| 1395 static Dart_IsolateId test_isolate_id = ILLEGAL_ISOLATE_ID; | 1345 static Dart_IsolateId test_isolate_id = ILLEGAL_ISOLATE_ID; |
| 1396 static int verify_callback = 0; | 1346 static int verify_callback = 0; |
| 1397 static void TestIsolateID(Dart_IsolateId isolate_id, Dart_IsolateEvent kind) { | 1347 static void TestIsolateID(Dart_IsolateId isolate_id, Dart_IsolateEvent kind) { |
| 1398 if (kind == kCreated) { | 1348 if (kind == kCreated) { |
| 1399 EXPECT(test_isolate_id == ILLEGAL_ISOLATE_ID); | 1349 EXPECT(test_isolate_id == ILLEGAL_ISOLATE_ID); |
| 1400 test_isolate_id = isolate_id; | 1350 test_isolate_id = isolate_id; |
| 1401 Dart_Isolate isolate = Dart_GetIsolate(isolate_id); | 1351 Dart_Isolate isolate = Dart_GetIsolate(isolate_id); |
| 1402 EXPECT(isolate == Dart_CurrentIsolate()); | 1352 EXPECT(isolate == Dart_CurrentIsolate()); |
| 1403 verify_callback |= 0x1; // Register create callback. | 1353 verify_callback |= 0x1; // Register create callback. |
| 1404 } else if (kind == kInterrupted) { | 1354 } else if (kind == kInterrupted) { |
| 1405 EXPECT(test_isolate_id == isolate_id); | 1355 EXPECT(test_isolate_id == isolate_id); |
| 1406 Dart_Isolate isolate = Dart_GetIsolate(isolate_id); | 1356 Dart_Isolate isolate = Dart_GetIsolate(isolate_id); |
| 1407 EXPECT(isolate == Dart_CurrentIsolate()); | 1357 EXPECT(isolate == Dart_CurrentIsolate()); |
| 1408 verify_callback |= 0x2; // Register interrupt callback. | 1358 verify_callback |= 0x2; // Register interrupt callback. |
| 1409 } else if (kind == kShutdown) { | 1359 } else if (kind == kShutdown) { |
| 1410 EXPECT(test_isolate_id == isolate_id); | 1360 EXPECT(test_isolate_id == isolate_id); |
| 1411 Dart_Isolate isolate = Dart_GetIsolate(isolate_id); | 1361 Dart_Isolate isolate = Dart_GetIsolate(isolate_id); |
| 1412 EXPECT(isolate == Dart_CurrentIsolate()); | 1362 EXPECT(isolate == Dart_CurrentIsolate()); |
| 1413 verify_callback |= 0x4; // Register shutdown callback. | 1363 verify_callback |= 0x4; // Register shutdown callback. |
| 1414 } | 1364 } |
| 1415 } | 1365 } |
| 1416 | 1366 |
| 1417 | |
| 1418 VM_UNIT_TEST_CASE(Debug_IsolateID) { | 1367 VM_UNIT_TEST_CASE(Debug_IsolateID) { |
| 1419 const char* kScriptChars = | 1368 const char* kScriptChars = |
| 1420 "void moo(s) { } \n" | 1369 "void moo(s) { } \n" |
| 1421 "class A { \n" | 1370 "class A { \n" |
| 1422 " static void foo() { \n" | 1371 " static void foo() { \n" |
| 1423 " moo('good news'); \n" | 1372 " moo('good news'); \n" |
| 1424 " } \n" | 1373 " } \n" |
| 1425 "} \n" | 1374 "} \n" |
| 1426 "void main() { \n" | 1375 "void main() { \n" |
| 1427 " A.foo(); \n" | 1376 " A.foo(); \n" |
| 1428 "} \n"; | 1377 "} \n"; |
| 1429 | 1378 |
| 1430 Dart_SetIsolateEventHandler(&TestIsolateID); | 1379 Dart_SetIsolateEventHandler(&TestIsolateID); |
| 1431 Dart_Isolate isolate = TestCase::CreateTestIsolate(); | 1380 Dart_Isolate isolate = TestCase::CreateTestIsolate(); |
| 1432 ASSERT(isolate != NULL); | 1381 ASSERT(isolate != NULL); |
| 1433 Dart_EnterScope(); | 1382 Dart_EnterScope(); |
| 1434 LoadScript(kScriptChars); | 1383 LoadScript(kScriptChars); |
| 1435 Dart_Handle retval = Invoke("main"); | 1384 Dart_Handle retval = Invoke("main"); |
| 1436 EXPECT_VALID(retval); | 1385 EXPECT_VALID(retval); |
| 1437 EXPECT(test_isolate_id != ILLEGAL_ISOLATE_ID); | 1386 EXPECT(test_isolate_id != ILLEGAL_ISOLATE_ID); |
| 1438 EXPECT(Dart_GetIsolate(test_isolate_id) == isolate); | 1387 EXPECT(Dart_GetIsolate(test_isolate_id) == isolate); |
| 1439 EXPECT(Dart_GetIsolateId(isolate) == test_isolate_id); | 1388 EXPECT(Dart_GetIsolateId(isolate) == test_isolate_id); |
| 1440 Dart_ExitScope(); | 1389 Dart_ExitScope(); |
| 1441 Dart_ShutdownIsolate(); | 1390 Dart_ShutdownIsolate(); |
| 1442 Dart_SetIsolateEventHandler(NULL); | 1391 Dart_SetIsolateEventHandler(NULL); |
| 1443 EXPECT(verify_callback == 0x5); // Only created and shutdown events. | 1392 EXPECT(verify_callback == 0x5); // Only created and shutdown events. |
| 1444 } | 1393 } |
| 1445 | 1394 |
| 1446 | |
| 1447 static Monitor* sync = NULL; | 1395 static Monitor* sync = NULL; |
| 1448 static bool isolate_interrupted = false; | 1396 static bool isolate_interrupted = false; |
| 1449 static bool pause_event_handled = false; | 1397 static bool pause_event_handled = false; |
| 1450 static bool interrupt_thread_stopped = false; | 1398 static bool interrupt_thread_stopped = false; |
| 1451 static Dart_IsolateId interrupt_isolate_id = ILLEGAL_ISOLATE_ID; | 1399 static Dart_IsolateId interrupt_isolate_id = ILLEGAL_ISOLATE_ID; |
| 1452 static volatile bool continue_isolate_loop = true; | 1400 static volatile bool continue_isolate_loop = true; |
| 1453 | 1401 |
| 1454 | |
| 1455 static void InterruptIsolateHandler(Dart_IsolateId isolateId, | 1402 static void InterruptIsolateHandler(Dart_IsolateId isolateId, |
| 1456 intptr_t breakpointId, | 1403 intptr_t breakpointId, |
| 1457 const Dart_CodeLocation& location) { | 1404 const Dart_CodeLocation& location) { |
| 1458 MonitorLocker ml(sync); | 1405 MonitorLocker ml(sync); |
| 1459 pause_event_handled = true; | 1406 pause_event_handled = true; |
| 1460 ml.Notify(); | 1407 ml.Notify(); |
| 1461 } | 1408 } |
| 1462 | 1409 |
| 1463 static void TestInterruptIsolate(Dart_IsolateId isolate_id, | 1410 static void TestInterruptIsolate(Dart_IsolateId isolate_id, |
| 1464 Dart_IsolateEvent kind) { | 1411 Dart_IsolateEvent kind) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1480 } | 1427 } |
| 1481 } else if (kind == kShutdown) { | 1428 } else if (kind == kShutdown) { |
| 1482 if (interrupt_isolate_id == isolate_id) { | 1429 if (interrupt_isolate_id == isolate_id) { |
| 1483 MonitorLocker ml(sync); | 1430 MonitorLocker ml(sync); |
| 1484 interrupt_isolate_id = ILLEGAL_ISOLATE_ID; | 1431 interrupt_isolate_id = ILLEGAL_ISOLATE_ID; |
| 1485 ml.Notify(); | 1432 ml.Notify(); |
| 1486 } | 1433 } |
| 1487 } | 1434 } |
| 1488 } | 1435 } |
| 1489 | 1436 |
| 1490 | |
| 1491 static void InterruptNativeFunction(Dart_NativeArguments args) { | 1437 static void InterruptNativeFunction(Dart_NativeArguments args) { |
| 1492 Dart_EnterScope(); | 1438 Dart_EnterScope(); |
| 1493 Dart_Handle val = Dart_NewBoolean(continue_isolate_loop); | 1439 Dart_Handle val = Dart_NewBoolean(continue_isolate_loop); |
| 1494 Dart_SetReturnValue(args, val); | 1440 Dart_SetReturnValue(args, val); |
| 1495 Dart_ExitScope(); | 1441 Dart_ExitScope(); |
| 1496 } | 1442 } |
| 1497 | 1443 |
| 1498 | |
| 1499 static Dart_NativeFunction InterruptNativeResolver(Dart_Handle name, | 1444 static Dart_NativeFunction InterruptNativeResolver(Dart_Handle name, |
| 1500 int arg_count, | 1445 int arg_count, |
| 1501 bool* auto_setup_scope) { | 1446 bool* auto_setup_scope) { |
| 1502 ASSERT(auto_setup_scope != NULL); | 1447 ASSERT(auto_setup_scope != NULL); |
| 1503 *auto_setup_scope = false; | 1448 *auto_setup_scope = false; |
| 1504 return &InterruptNativeFunction; | 1449 return &InterruptNativeFunction; |
| 1505 } | 1450 } |
| 1506 | 1451 |
| 1507 | |
| 1508 static void InterruptIsolateRun(uword unused) { | 1452 static void InterruptIsolateRun(uword unused) { |
| 1509 const char* kScriptChars = | 1453 const char* kScriptChars = |
| 1510 "void moo(s) { } \n" | 1454 "void moo(s) { } \n" |
| 1511 "class A { \n" | 1455 "class A { \n" |
| 1512 " static check() native 'a'; \n" | 1456 " static check() native 'a'; \n" |
| 1513 " static void foo() { \n" | 1457 " static void foo() { \n" |
| 1514 " var loop = true; \n" | 1458 " var loop = true; \n" |
| 1515 " while (loop) { \n" | 1459 " while (loop) { \n" |
| 1516 " moo('good news'); \n" | 1460 " moo('good news'); \n" |
| 1517 " loop = check(); \n" | 1461 " loop = check(); \n" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1536 Dart_ExitScope(); | 1480 Dart_ExitScope(); |
| 1537 Dart_ShutdownIsolate(); | 1481 Dart_ShutdownIsolate(); |
| 1538 { | 1482 { |
| 1539 // Notify the waiting thread that we are done. | 1483 // Notify the waiting thread that we are done. |
| 1540 MonitorLocker ml(sync); | 1484 MonitorLocker ml(sync); |
| 1541 interrupt_thread_stopped = true; | 1485 interrupt_thread_stopped = true; |
| 1542 ml.Notify(); | 1486 ml.Notify(); |
| 1543 } | 1487 } |
| 1544 } | 1488 } |
| 1545 | 1489 |
| 1546 | |
| 1547 TEST_CASE(Debug_InterruptIsolate) { | 1490 TEST_CASE(Debug_InterruptIsolate) { |
| 1548 bool saved_flag = FLAG_trace_shutdown; | 1491 bool saved_flag = FLAG_trace_shutdown; |
| 1549 FLAG_trace_shutdown = true; | 1492 FLAG_trace_shutdown = true; |
| 1550 sync = new Monitor(); | 1493 sync = new Monitor(); |
| 1551 Dart_SetIsolateEventHandler(&TestInterruptIsolate); | 1494 Dart_SetIsolateEventHandler(&TestInterruptIsolate); |
| 1552 EXPECT(interrupt_isolate_id == ILLEGAL_ISOLATE_ID); | 1495 EXPECT(interrupt_isolate_id == ILLEGAL_ISOLATE_ID); |
| 1553 Dart_SetPausedEventHandler(InterruptIsolateHandler); | 1496 Dart_SetPausedEventHandler(InterruptIsolateHandler); |
| 1554 { | 1497 { |
| 1555 MonitorLocker ml(sync); | 1498 MonitorLocker ml(sync); |
| 1556 interrupt_thread_stopped = false; | 1499 interrupt_thread_stopped = false; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1600 { | 1543 { |
| 1601 MonitorLocker ml(sync); | 1544 MonitorLocker ml(sync); |
| 1602 while (!interrupt_thread_stopped) { | 1545 while (!interrupt_thread_stopped) { |
| 1603 ml.Wait(); | 1546 ml.Wait(); |
| 1604 } | 1547 } |
| 1605 } | 1548 } |
| 1606 OS::PrintErr("Complete\n"); | 1549 OS::PrintErr("Complete\n"); |
| 1607 FLAG_trace_shutdown = saved_flag; | 1550 FLAG_trace_shutdown = saved_flag; |
| 1608 } | 1551 } |
| 1609 | 1552 |
| 1610 | |
| 1611 static void StackTraceDump1BreakpointHandler( | 1553 static void StackTraceDump1BreakpointHandler( |
| 1612 Dart_IsolateId isolate_id, | 1554 Dart_IsolateId isolate_id, |
| 1613 intptr_t bp_id, | 1555 intptr_t bp_id, |
| 1614 const Dart_CodeLocation& location) { | 1556 const Dart_CodeLocation& location) { |
| 1615 Dart_StackTrace trace; | 1557 Dart_StackTrace trace; |
| 1616 Dart_GetStackTrace(&trace); | 1558 Dart_GetStackTrace(&trace); |
| 1617 const int kStackTraceLen = 4; | 1559 const int kStackTraceLen = 4; |
| 1618 static const char* expected_trace[kStackTraceLen] = { | 1560 static const char* expected_trace[kStackTraceLen] = { |
| 1619 "local_to_main", "Test.local1_to_func1", "Test.func1", "main"}; | 1561 "local_to_main", "Test.local1_to_func1", "Test.func1", "main"}; |
| 1620 | 1562 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1687 Dart_ListSetAt(frame3_locals, 12, NewString("main_local")); | 1629 Dart_ListSetAt(frame3_locals, 12, NewString("main_local")); |
| 1688 Dart_ListSetAt(frame3_locals, 13, Dart_Null()); | 1630 Dart_ListSetAt(frame3_locals, 13, Dart_Null()); |
| 1689 | 1631 |
| 1690 Dart_Handle expected_locals[] = {frame0_locals, frame1_locals, frame2_locals, | 1632 Dart_Handle expected_locals[] = {frame0_locals, frame1_locals, frame2_locals, |
| 1691 frame3_locals}; | 1633 frame3_locals}; |
| 1692 breakpoint_hit_counter++; | 1634 breakpoint_hit_counter++; |
| 1693 VerifyStackTrace(trace, expected_trace, expected_locals, kStackTraceLen, | 1635 VerifyStackTrace(trace, expected_trace, expected_locals, kStackTraceLen, |
| 1694 true); | 1636 true); |
| 1695 } | 1637 } |
| 1696 | 1638 |
| 1697 | |
| 1698 TEST_CASE(Debug_StackTraceDump1) { | 1639 TEST_CASE(Debug_StackTraceDump1) { |
| 1699 const char* kScriptChars = | 1640 const char* kScriptChars = |
| 1700 "class Test {\n" | 1641 "class Test {\n" |
| 1701 " Test(int local);\n" | 1642 " Test(int local);\n" |
| 1702 "\n" | 1643 "\n" |
| 1703 " int func1(int func(int i, int j)) {\n" | 1644 " int func1(int func(int i, int j)) {\n" |
| 1704 " var i = 0;\n" | 1645 " var i = 0;\n" |
| 1705 " var j = 0;\n" | 1646 " var j = 0;\n" |
| 1706 " var k = 0;\n" | 1647 " var k = 0;\n" |
| 1707 " var l = 0;\n" | 1648 " var l = 0;\n" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1749 EXPECT(Dart_IsInteger(res)); | 1690 EXPECT(Dart_IsInteger(res)); |
| 1750 | 1691 |
| 1751 breakpoint_hit_counter = 0; | 1692 breakpoint_hit_counter = 0; |
| 1752 Dart_Handle retval = Invoke("main"); | 1693 Dart_Handle retval = Invoke("main"); |
| 1753 EXPECT_VALID(retval); | 1694 EXPECT_VALID(retval); |
| 1754 int64_t int_value = ToInt64(retval); | 1695 int64_t int_value = ToInt64(retval); |
| 1755 EXPECT_EQ(195, int_value); | 1696 EXPECT_EQ(195, int_value); |
| 1756 EXPECT_EQ(1, breakpoint_hit_counter); | 1697 EXPECT_EQ(1, breakpoint_hit_counter); |
| 1757 } | 1698 } |
| 1758 | 1699 |
| 1759 | |
| 1760 static void StackTraceDump2ExceptionHandler(Dart_IsolateId isolate_id, | 1700 static void StackTraceDump2ExceptionHandler(Dart_IsolateId isolate_id, |
| 1761 Dart_Handle exception_object, | 1701 Dart_Handle exception_object, |
| 1762 Dart_StackTrace trace) { | 1702 Dart_StackTrace trace) { |
| 1763 const int kStackTraceLen = 5; | 1703 const int kStackTraceLen = 5; |
| 1764 static const char* expected_trace[kStackTraceLen] = { | 1704 static const char* expected_trace[kStackTraceLen] = { |
| 1765 "Object._noSuchMethod", "Object.noSuchMethod", "Test.local1_to_func1", | 1705 "Object._noSuchMethod", "Object.noSuchMethod", "Test.local1_to_func1", |
| 1766 "Test.func1", "main"}; | 1706 "Test.func1", "main"}; |
| 1767 | 1707 |
| 1768 intptr_t trace_len; | 1708 intptr_t trace_len; |
| 1769 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 1709 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1845 Dart_ListSetAt(frame4_locals, 10, NewString("func1")); | 1785 Dart_ListSetAt(frame4_locals, 10, NewString("func1")); |
| 1846 Dart_ListSetAt(frame4_locals, 11, Dart_Null()); | 1786 Dart_ListSetAt(frame4_locals, 11, Dart_Null()); |
| 1847 | 1787 |
| 1848 Dart_Handle expected_locals[] = {frame0_locals, frame1_locals, frame2_locals, | 1788 Dart_Handle expected_locals[] = {frame0_locals, frame1_locals, frame2_locals, |
| 1849 frame3_locals, frame4_locals}; | 1789 frame3_locals, frame4_locals}; |
| 1850 breakpoint_hit_counter++; | 1790 breakpoint_hit_counter++; |
| 1851 VerifyStackTrace(trace, expected_trace, expected_locals, kStackTraceLen, | 1791 VerifyStackTrace(trace, expected_trace, expected_locals, kStackTraceLen, |
| 1852 true); | 1792 true); |
| 1853 } | 1793 } |
| 1854 | 1794 |
| 1855 | |
| 1856 TEST_CASE(Debug_StackTraceDump2) { | 1795 TEST_CASE(Debug_StackTraceDump2) { |
| 1857 const char* kScriptChars = | 1796 const char* kScriptChars = |
| 1858 "class Test {\n" | 1797 "class Test {\n" |
| 1859 " Test(int local);\n" | 1798 " Test(int local);\n" |
| 1860 "\n" | 1799 "\n" |
| 1861 " int func1(int func(int i, int j)) {\n" | 1800 " int func1(int func(int i, int j)) {\n" |
| 1862 " var i = 0;\n" | 1801 " var i = 0;\n" |
| 1863 " var j = 0;\n" | 1802 " var j = 0;\n" |
| 1864 " var k = 0;\n" | 1803 " var k = 0;\n" |
| 1865 " var l = 0;\n" | 1804 " var l = 0;\n" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 Dart_SetExceptionThrownHandler(&StackTraceDump2ExceptionHandler); | 1837 Dart_SetExceptionThrownHandler(&StackTraceDump2ExceptionHandler); |
| 1899 breakpoint_hit_counter = 0; | 1838 breakpoint_hit_counter = 0; |
| 1900 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); | 1839 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); |
| 1901 | 1840 |
| 1902 Dart_Handle retval = Invoke("main"); | 1841 Dart_Handle retval = Invoke("main"); |
| 1903 EXPECT(Dart_IsError(retval)); | 1842 EXPECT(Dart_IsError(retval)); |
| 1904 EXPECT(Dart_IsUnhandledExceptionError(retval)); | 1843 EXPECT(Dart_IsUnhandledExceptionError(retval)); |
| 1905 EXPECT_EQ(1, breakpoint_hit_counter); | 1844 EXPECT_EQ(1, breakpoint_hit_counter); |
| 1906 } | 1845 } |
| 1907 | 1846 |
| 1908 | |
| 1909 void TestEvaluateHandler(Dart_IsolateId isolate_id, | 1847 void TestEvaluateHandler(Dart_IsolateId isolate_id, |
| 1910 intptr_t bp_id, | 1848 intptr_t bp_id, |
| 1911 const Dart_CodeLocation& location) { | 1849 const Dart_CodeLocation& location) { |
| 1912 Dart_StackTrace trace; | 1850 Dart_StackTrace trace; |
| 1913 Dart_GetStackTrace(&trace); | 1851 Dart_GetStackTrace(&trace); |
| 1914 intptr_t trace_len; | 1852 intptr_t trace_len; |
| 1915 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); | 1853 Dart_Handle res = Dart_StackTraceLength(trace, &trace_len); |
| 1916 EXPECT_VALID(res); | 1854 EXPECT_VALID(res); |
| 1917 EXPECT_EQ(1, trace_len); | 1855 EXPECT_EQ(1, trace_len); |
| 1918 Dart_ActivationFrame frame; | 1856 Dart_ActivationFrame frame; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1940 // persistent. | 1878 // persistent. |
| 1941 h = Dart_EvaluateExpr(p, NewString("_factor")); | 1879 h = Dart_EvaluateExpr(p, NewString("_factor")); |
| 1942 EXPECT_VALID(h); | 1880 EXPECT_VALID(h); |
| 1943 EXPECT(Dart_IsInteger(h)); | 1881 EXPECT(Dart_IsInteger(h)); |
| 1944 EXPECT_EQ(10, ToInt64(h)); | 1882 EXPECT_EQ(10, ToInt64(h)); |
| 1945 | 1883 |
| 1946 breakpoint_hit = true; | 1884 breakpoint_hit = true; |
| 1947 breakpoint_hit_counter++; | 1885 breakpoint_hit_counter++; |
| 1948 } | 1886 } |
| 1949 | 1887 |
| 1950 | |
| 1951 TEST_CASE(Debug_EvaluateExpr) { | 1888 TEST_CASE(Debug_EvaluateExpr) { |
| 1952 const char* kScriptChars = | 1889 const char* kScriptChars = |
| 1953 "import 'dart:math'; \n" | 1890 "import 'dart:math'; \n" |
| 1954 "main() { \n" | 1891 "main() { \n" |
| 1955 " var p = new Point(3, 4); \n" | 1892 " var p = new Point(3, 4); \n" |
| 1956 " l = [1, 2, 3]; /*BP*/ \n" | 1893 " l = [1, 2, 3]; /*BP*/ \n" |
| 1957 " m = {'\"': 'quote' , \n" | 1894 " m = {'\"': 'quote' , \n" |
| 1958 " \"\t\": 'tab' }; \n" | 1895 " \"\t\": 'tab' }; \n" |
| 1959 " return p; \n" | 1896 " return p; \n" |
| 1960 "} \n" | 1897 "} \n" |
| 1961 "var _factor = 2; \n" | 1898 "var _factor = 2; \n" |
| 1962 "var l; \n" | 1899 "var l; \n" |
| 1963 "var m; \n" | 1900 "var m; \n" |
| 1964 "class Point { \n" | 1901 "class Point { \n" |
| 1965 " var x, y; \n" | 1902 " var x, y; \n" |
| 1966 " Point(this.x, this.y); \n" | 1903 " Point(this.x, this.y); \n" |
| 1967 "} \n"; | 1904 "} \n"; |
| 1968 | 1905 |
| 1969 LoadScript(kScriptChars); | 1906 LoadScript(kScriptChars); |
| 1970 Dart_SetPausedEventHandler(&TestEvaluateHandler); | 1907 Dart_SetPausedEventHandler(&TestEvaluateHandler); |
| 1971 | 1908 |
| 1972 | |
| 1973 Dart_Handle script_url = NewString(TestCase::url()); | 1909 Dart_Handle script_url = NewString(TestCase::url()); |
| 1974 intptr_t line_no = 4; | 1910 intptr_t line_no = 4; |
| 1975 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); | 1911 Dart_Handle res = Dart_SetBreakpoint(script_url, line_no); |
| 1976 EXPECT_VALID(res); | 1912 EXPECT_VALID(res); |
| 1977 | 1913 |
| 1978 breakpoint_hit = false; | 1914 breakpoint_hit = false; |
| 1979 Dart_Handle point = Invoke("main"); | 1915 Dart_Handle point = Invoke("main"); |
| 1980 EXPECT_VALID(point); | 1916 EXPECT_VALID(point); |
| 1981 EXPECT(breakpoint_hit == true); | 1917 EXPECT(breakpoint_hit == true); |
| 1982 | 1918 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2039 len = Dart_EvaluateExpr(script_lib, NewString("((x) => l.length + x)(1)")); | 1975 len = Dart_EvaluateExpr(script_lib, NewString("((x) => l.length + x)(1)")); |
| 2040 EXPECT_VALID(len); | 1976 EXPECT_VALID(len); |
| 2041 EXPECT(Dart_IsNumber(len)); | 1977 EXPECT(Dart_IsNumber(len)); |
| 2042 EXPECT_EQ(6, ToInt64(len)); | 1978 EXPECT_EQ(6, ToInt64(len)); |
| 2043 | 1979 |
| 2044 Dart_Handle error = | 1980 Dart_Handle error = |
| 2045 Dart_EvaluateExpr(script_lib, NewString("new NonexistingType()")); | 1981 Dart_EvaluateExpr(script_lib, NewString("new NonexistingType()")); |
| 2046 EXPECT(Dart_IsError(error)); | 1982 EXPECT(Dart_IsError(error)); |
| 2047 } | 1983 } |
| 2048 | 1984 |
| 2049 | |
| 2050 static void EvaluateInActivationOfEvaluateHandler(Dart_IsolateId isolate_id, | 1985 static void EvaluateInActivationOfEvaluateHandler(Dart_IsolateId isolate_id, |
| 2051 Dart_Handle exception_object, | 1986 Dart_Handle exception_object, |
| 2052 Dart_StackTrace trace) { | 1987 Dart_StackTrace trace) { |
| 2053 breakpoint_hit_counter++; | 1988 breakpoint_hit_counter++; |
| 2054 Dart_ActivationFrame top_frame = 0; | 1989 Dart_ActivationFrame top_frame = 0; |
| 2055 Dart_Handle result = Dart_GetActivationFrame(trace, 0, &top_frame); | 1990 Dart_Handle result = Dart_GetActivationFrame(trace, 0, &top_frame); |
| 2056 EXPECT_VALID(result); | 1991 EXPECT_VALID(result); |
| 2057 | 1992 |
| 2058 result = Dart_ActivationFrameEvaluate(top_frame, NewString("p.r")); | 1993 result = Dart_ActivationFrameEvaluate(top_frame, NewString("p.r")); |
| 2059 EXPECT_VALID(result); | 1994 EXPECT_VALID(result); |
| 2060 EXPECT_EQ(5.0, ToDouble(result)); | 1995 EXPECT_EQ(5.0, ToDouble(result)); |
| 2061 } | 1996 } |
| 2062 | 1997 |
| 2063 | |
| 2064 TEST_CASE(Debug_EvaluateInActivationOfEvaluate) { | 1998 TEST_CASE(Debug_EvaluateInActivationOfEvaluate) { |
| 2065 // This library deliberately declares no top-level variables or methods. This | 1999 // This library deliberately declares no top-level variables or methods. This |
| 2066 // exercises a path in eval where a library may have no top-level anonymous | 2000 // exercises a path in eval where a library may have no top-level anonymous |
| 2067 // classes. | 2001 // classes. |
| 2068 const char* kScriptChars = | 2002 const char* kScriptChars = |
| 2069 "import 'dart:math'; \n" | 2003 "import 'dart:math'; \n" |
| 2070 "class Point { \n" | 2004 "class Point { \n" |
| 2071 " var x, y; \n" | 2005 " var x, y; \n" |
| 2072 " Point(this.x, this.y); \n" | 2006 " Point(this.x, this.y); \n" |
| 2073 " get r => sqrt(x*x + y*y); \n" | 2007 " get r => sqrt(x*x + y*y); \n" |
| 2074 "} \n"; | 2008 "} \n"; |
| 2075 LoadScript(kScriptChars); | 2009 LoadScript(kScriptChars); |
| 2076 Dart_FinalizeLoading(false); | 2010 Dart_FinalizeLoading(false); |
| 2077 | 2011 |
| 2078 Dart_SetExceptionThrownHandler(&EvaluateInActivationOfEvaluateHandler); | 2012 Dart_SetExceptionThrownHandler(&EvaluateInActivationOfEvaluateHandler); |
| 2079 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); | 2013 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); |
| 2080 breakpoint_hit_counter = 0; | 2014 breakpoint_hit_counter = 0; |
| 2081 | 2015 |
| 2082 Dart_Handle result = Dart_EvaluateExpr( | 2016 Dart_Handle result = Dart_EvaluateExpr( |
| 2083 script_lib, NewString("() { var p = new Point(3, 4); throw p; } ())")); | 2017 script_lib, NewString("() { var p = new Point(3, 4); throw p; } ())")); |
| 2084 EXPECT(Dart_IsError(result)); | 2018 EXPECT(Dart_IsError(result)); |
| 2085 EXPECT_EQ(1, breakpoint_hit_counter); | 2019 EXPECT_EQ(1, breakpoint_hit_counter); |
| 2086 } | 2020 } |
| 2087 | 2021 |
| 2088 | |
| 2089 static void UnhandledExceptionHandler(Dart_IsolateId isolate_id, | 2022 static void UnhandledExceptionHandler(Dart_IsolateId isolate_id, |
| 2090 Dart_Handle exception_object, | 2023 Dart_Handle exception_object, |
| 2091 Dart_StackTrace trace) { | 2024 Dart_StackTrace trace) { |
| 2092 breakpoint_hit_counter++; | 2025 breakpoint_hit_counter++; |
| 2093 } | 2026 } |
| 2094 | 2027 |
| 2095 | |
| 2096 // Check that the debugger is not called when an exception is | 2028 // Check that the debugger is not called when an exception is |
| 2097 // caught by Dart code. | 2029 // caught by Dart code. |
| 2098 TEST_CASE(Debug_BreakOnUnhandledException) { | 2030 TEST_CASE(Debug_BreakOnUnhandledException) { |
| 2099 const char* kScriptChars = | 2031 const char* kScriptChars = |
| 2100 "main() { \n" | 2032 "main() { \n" |
| 2101 " try { \n" | 2033 " try { \n" |
| 2102 " throw 'broccoli'; \n" | 2034 " throw 'broccoli'; \n" |
| 2103 " } catch (e) { \n" | 2035 " } catch (e) { \n" |
| 2104 " return 'carrots'; \n" | 2036 " return 'carrots'; \n" |
| 2105 " } \n" | 2037 " } \n" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2123 // Check that the debugger is called when "break on all | 2055 // Check that the debugger is called when "break on all |
| 2124 // exceptions" is turned on. | 2056 // exceptions" is turned on. |
| 2125 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); | 2057 Dart_SetExceptionPauseInfo(kPauseOnAllExceptions); |
| 2126 Dart_Handle res2 = Invoke("main"); | 2058 Dart_Handle res2 = Invoke("main"); |
| 2127 EXPECT_VALID(res2); | 2059 EXPECT_VALID(res2); |
| 2128 EXPECT(Dart_IsString(res2)); | 2060 EXPECT(Dart_IsString(res2)); |
| 2129 EXPECT_STREQ("carrots", ToCString(res2)); | 2061 EXPECT_STREQ("carrots", ToCString(res2)); |
| 2130 EXPECT_EQ(1, breakpoint_hit_counter); | 2062 EXPECT_EQ(1, breakpoint_hit_counter); |
| 2131 } | 2063 } |
| 2132 | 2064 |
| 2133 | |
| 2134 TEST_CASE(Debug_GetClosureInfo) { | 2065 TEST_CASE(Debug_GetClosureInfo) { |
| 2135 const char* kScriptChars = | 2066 const char* kScriptChars = |
| 2136 "void foo() { return 43; } \n" | 2067 "void foo() { return 43; } \n" |
| 2137 " \n" | 2068 " \n" |
| 2138 "main() { \n" | 2069 "main() { \n" |
| 2139 " return foo; \n" | 2070 " return foo; \n" |
| 2140 "} \n"; | 2071 "} \n"; |
| 2141 | 2072 |
| 2142 LoadScript(kScriptChars); | 2073 LoadScript(kScriptChars); |
| 2143 Dart_Handle clo = Invoke("main"); | 2074 Dart_Handle clo = Invoke("main"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2155 EXPECT(Dart_IsString(name)); | 2086 EXPECT(Dart_IsString(name)); |
| 2156 EXPECT_STREQ("foo", ToCString(name)); | 2087 EXPECT_STREQ("foo", ToCString(name)); |
| 2157 EXPECT(Dart_IsString(sig)); | 2088 EXPECT(Dart_IsString(sig)); |
| 2158 EXPECT_STREQ("() => void", ToCString(sig)); | 2089 EXPECT_STREQ("() => void", ToCString(sig)); |
| 2159 EXPECT(Dart_IsString(loc.script_url)); | 2090 EXPECT(Dart_IsString(loc.script_url)); |
| 2160 EXPECT_STREQ("test-lib", ToCString(loc.script_url)); | 2091 EXPECT_STREQ("test-lib", ToCString(loc.script_url)); |
| 2161 EXPECT_EQ(0, loc.token_pos); | 2092 EXPECT_EQ(0, loc.token_pos); |
| 2162 EXPECT(loc.library_id > 0); | 2093 EXPECT(loc.library_id > 0); |
| 2163 } | 2094 } |
| 2164 | 2095 |
| 2165 | |
| 2166 TEST_CASE(Debug_GetSupertype) { | 2096 TEST_CASE(Debug_GetSupertype) { |
| 2167 const char* kScriptChars = | 2097 const char* kScriptChars = |
| 2168 "class Test {\n" | 2098 "class Test {\n" |
| 2169 "}\n" | 2099 "}\n" |
| 2170 "class Test1 extends Test {\n" | 2100 "class Test1 extends Test {\n" |
| 2171 "}\n" | 2101 "}\n" |
| 2172 "class Test2<T> {\n" | 2102 "class Test2<T> {\n" |
| 2173 "}\n" | 2103 "}\n" |
| 2174 "class Test3 extends Test2<int> {\n" | 2104 "class Test3 extends Test2<int> {\n" |
| 2175 "}\n" | 2105 "}\n" |
| 2176 "class Test4<A, B> extends Test2<A> {\n" | 2106 "class Test4<A, B> extends Test2<A> {\n" |
| 2177 "}\n" | 2107 "}\n" |
| 2178 "class Test5<A, B, C> extends Test4<A, B> {\n" | 2108 "class Test5<A, B, C> extends Test4<A, B> {\n" |
| 2179 "}\n" | 2109 "}\n" |
| 2180 "var s = new Set();\n" | 2110 "var s = new Set();\n" |
| 2181 "var l = new List();\n" | 2111 "var l = new List();\n" |
| 2182 "int main() {\n" | 2112 "int main() {\n" |
| 2183 "}\n"; | 2113 "}\n"; |
| 2184 | 2114 |
| 2185 | |
| 2186 Zone* zone = thread->zone(); | 2115 Zone* zone = thread->zone(); |
| 2187 LoadScript(kScriptChars); | 2116 LoadScript(kScriptChars); |
| 2188 ASSERT(script_lib != NULL); | 2117 ASSERT(script_lib != NULL); |
| 2189 ASSERT(Dart_IsLibrary(script_lib)); | 2118 ASSERT(Dart_IsLibrary(script_lib)); |
| 2190 Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core")); | 2119 Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core")); |
| 2191 | 2120 |
| 2192 Dart_Handle Test_name = Dart_NewStringFromCString("Test"); | 2121 Dart_Handle Test_name = Dart_NewStringFromCString("Test"); |
| 2193 Dart_Handle Test1_name = Dart_NewStringFromCString("Test1"); | 2122 Dart_Handle Test1_name = Dart_NewStringFromCString("Test1"); |
| 2194 Dart_Handle Test2_name = Dart_NewStringFromCString("Test2"); | 2123 Dart_Handle Test2_name = Dart_NewStringFromCString("Test2"); |
| 2195 Dart_Handle Test3_name = Dart_NewStringFromCString("Test3"); | 2124 Dart_Handle Test3_name = Dart_NewStringFromCString("Test3"); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2262 { | 2191 { |
| 2263 Dart_Handle list_type = Dart_GetType(core_lib, list_name, 0, NULL); | 2192 Dart_Handle list_type = Dart_GetType(core_lib, list_name, 0, NULL); |
| 2264 Dart_Handle super_type = Dart_GetSupertype(list_type); | 2193 Dart_Handle super_type = Dart_GetSupertype(list_type); |
| 2265 EXPECT(!Dart_IsError(super_type)); | 2194 EXPECT(!Dart_IsError(super_type)); |
| 2266 super_type = Dart_GetSupertype(super_type); | 2195 super_type = Dart_GetSupertype(super_type); |
| 2267 EXPECT(!Dart_IsError(super_type)); | 2196 EXPECT(!Dart_IsError(super_type)); |
| 2268 EXPECT(super_type == Dart_Null()); | 2197 EXPECT(super_type == Dart_Null()); |
| 2269 } | 2198 } |
| 2270 } | 2199 } |
| 2271 | 2200 |
| 2272 | |
| 2273 TEST_CASE(Debug_ListSuperType) { | 2201 TEST_CASE(Debug_ListSuperType) { |
| 2274 const char* kScriptChars = | 2202 const char* kScriptChars = |
| 2275 "List testMain() {" | 2203 "List testMain() {" |
| 2276 " List a = new List();" | 2204 " List a = new List();" |
| 2277 " a.add(10);" | 2205 " a.add(10);" |
| 2278 " a.add(20);" | 2206 " a.add(20);" |
| 2279 " a.add(30);" | 2207 " a.add(30);" |
| 2280 " return a;" | 2208 " return a;" |
| 2281 "}" | 2209 "}" |
| 2282 "" | 2210 "" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2357 " null, 5, 17, 5, 18, 9, 19, 12," | 2285 " null, 5, 17, 5, 18, 9, 19, 12," |
| 2358 " null, 6, 21, 1," | 2286 " null, 6, 21, 1," |
| 2359 " null, 8, 24, 1, 25, 5, 26, 6, 27, 8," | 2287 " null, 8, 24, 1, 25, 5, 26, 6, 27, 8," |
| 2360 " null, 9, 29, 1]", | 2288 " null, 9, 29, 1]", |
| 2361 tokens_cstr); | 2289 tokens_cstr); |
| 2362 } | 2290 } |
| 2363 | 2291 |
| 2364 #endif | 2292 #endif |
| 2365 | 2293 |
| 2366 } // namespace dart | 2294 } // namespace dart |
| OLD | NEW |