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

Side by Side Diff: runtime/vm/parser_test.cc

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/parser.cc ('k') | runtime/vm/port.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 5 #include "vm/parser.h"
6 #include "vm/ast_printer.h" 6 #include "vm/ast_printer.h"
7 #include "vm/class_finalizer.h" 7 #include "vm/class_finalizer.h"
8 #include "vm/debugger.h" 8 #include "vm/debugger.h"
9 #include "vm/longjump.h" 9 #include "vm/longjump.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
11 #include "vm/parser.h"
12 #include "vm/symbols.h" 11 #include "vm/symbols.h"
13 #include "vm/thread.h" 12 #include "vm/thread.h"
14 #include "vm/unit_test.h" 13 #include "vm/unit_test.h"
15 14
16 namespace dart { 15 namespace dart {
17 16
18 DECLARE_FLAG(bool, show_invisible_frames); 17 DECLARE_FLAG(bool, show_invisible_frames);
19 18
20
21 static void DumpFunction(const Library& lib, 19 static void DumpFunction(const Library& lib,
22 const char* cname, 20 const char* cname,
23 const char* fname) { 21 const char* fname) {
24 const String& classname = 22 const String& classname =
25 String::Handle(Symbols::New(Thread::Current(), cname)); 23 String::Handle(Symbols::New(Thread::Current(), cname));
26 String& funcname = String::Handle(String::New(fname)); 24 String& funcname = String::Handle(String::New(fname));
27 25
28 bool retval; 26 bool retval;
29 EXPECT(Isolate::Current() != NULL); 27 EXPECT(Isolate::Current() != NULL);
30 LongJumpScope jump; 28 LongJumpScope jump;
(...skipping 14 matching lines...) Expand all
45 } else { 43 } else {
46 OS::Print("AST printer not supported."); 44 OS::Print("AST printer not supported.");
47 } 45 }
48 retval = true; 46 retval = true;
49 } else { 47 } else {
50 retval = false; 48 retval = false;
51 } 49 }
52 EXPECT(retval); 50 EXPECT(retval);
53 } 51 }
54 52
55
56 void CheckField(const Library& lib, 53 void CheckField(const Library& lib,
57 const char* class_name, 54 const char* class_name,
58 const char* field_name, 55 const char* field_name,
59 bool expect_static, 56 bool expect_static,
60 bool is_final) { 57 bool is_final) {
61 const String& classname = 58 const String& classname =
62 String::Handle(Symbols::New(Thread::Current(), class_name)); 59 String::Handle(Symbols::New(Thread::Current(), class_name));
63 Class& cls = Class::Handle(lib.LookupClass(classname)); 60 Class& cls = Class::Handle(lib.LookupClass(classname));
64 EXPECT(!cls.IsNull()); 61 EXPECT(!cls.IsNull());
65 62
(...skipping 16 matching lines...) Expand all
82 EXPECT(!function.IsNull()); 79 EXPECT(!function.IsNull());
83 functionname ^= Field::SetterName(fieldname); 80 functionname ^= Field::SetterName(fieldname);
84 function ^= cls.LookupDynamicFunction(functionname); 81 function ^= cls.LookupDynamicFunction(functionname);
85 EXPECT(is_final ? function.IsNull() : !function.IsNull()); 82 EXPECT(is_final ? function.IsNull() : !function.IsNull());
86 } 83 }
87 EXPECT(!field.IsNull()); 84 EXPECT(!field.IsNull());
88 85
89 EXPECT_EQ(field.is_static(), expect_static); 86 EXPECT_EQ(field.is_static(), expect_static);
90 } 87 }
91 88
92
93 void CheckFunction(const Library& lib, 89 void CheckFunction(const Library& lib,
94 const char* class_name, 90 const char* class_name,
95 const char* function_name, 91 const char* function_name,
96 bool expect_static) { 92 bool expect_static) {
97 const String& classname = 93 const String& classname =
98 String::Handle(Symbols::New(Thread::Current(), class_name)); 94 String::Handle(Symbols::New(Thread::Current(), class_name));
99 Class& cls = Class::Handle(lib.LookupClass(classname)); 95 Class& cls = Class::Handle(lib.LookupClass(classname));
100 EXPECT(!cls.IsNull()); 96 EXPECT(!cls.IsNull());
101 97
102 String& functionname = String::Handle(String::New(function_name)); 98 String& functionname = String::Handle(String::New(function_name));
103 Function& function = Function::Handle(); 99 Function& function = Function::Handle();
104 if (expect_static) { 100 if (expect_static) {
105 function ^= cls.LookupStaticFunction(functionname); 101 function ^= cls.LookupStaticFunction(functionname);
106 } else { 102 } else {
107 function ^= cls.LookupDynamicFunction(functionname); 103 function ^= cls.LookupDynamicFunction(functionname);
108 } 104 }
109 EXPECT(!function.IsNull()); 105 EXPECT(!function.IsNull());
110 } 106 }
111 107
112
113 TEST_CASE(ParseClassDefinition) { 108 TEST_CASE(ParseClassDefinition) {
114 const char* script_chars = 109 const char* script_chars =
115 "class C { } \n" 110 "class C { } \n"
116 "class A { \n" 111 "class A { \n"
117 " var f0; \n" 112 " var f0; \n"
118 " int f1; \n" 113 " int f1; \n"
119 " final f2; \n" 114 " final f2; \n"
120 " final int f3, f4; \n" 115 " final int f3, f4; \n"
121 " static String s1, s2; \n" 116 " static String s1, s2; \n"
122 " static const int s3 = 8675309; \n" 117 " static const int s3 = 8675309; \n"
(...skipping 15 matching lines...) Expand all
138 CheckField(lib, "A", "f2", false, true); 133 CheckField(lib, "A", "f2", false, true);
139 CheckField(lib, "A", "f3", false, true); 134 CheckField(lib, "A", "f3", false, true);
140 CheckField(lib, "A", "f4", false, true); 135 CheckField(lib, "A", "f4", false, true);
141 CheckField(lib, "A", "s1", true, false); 136 CheckField(lib, "A", "s1", true, false);
142 CheckField(lib, "A", "s2", true, false); 137 CheckField(lib, "A", "s2", true, false);
143 CheckField(lib, "A", "s3", true, true); 138 CheckField(lib, "A", "s3", true, true);
144 CheckFunction(lib, "A", "bar", true); 139 CheckFunction(lib, "A", "bar", true);
145 CheckFunction(lib, "A", "foo", true); 140 CheckFunction(lib, "A", "foo", true);
146 } 141 }
147 142
148
149 TEST_CASE(Parser_TopLevel) { 143 TEST_CASE(Parser_TopLevel) {
150 const char* script_chars = 144 const char* script_chars =
151 "class A extends B { \n" 145 "class A extends B { \n"
152 " static bar(var i, [var d = 5]) { return 77; } \n" 146 " static bar(var i, [var d = 5]) { return 77; } \n"
153 " static foo() { return 42; } \n" 147 " static foo() { return 42; } \n"
154 " static baz(var i) { var q = 5; return i + q; } \n" 148 " static baz(var i) { var q = 5; return i + q; } \n"
155 "} \n" 149 "} \n"
156 " \n" 150 " \n"
157 "class B { \n" 151 "class B { \n"
158 " static bam(k) { return A.foo(); } \n" 152 " static bam(k) { return A.foo(); } \n"
159 "} \n"; 153 "} \n";
160 154
161 String& url = String::Handle(String::New("dart-test:Parser_TopLevel")); 155 String& url = String::Handle(String::New("dart-test:Parser_TopLevel"));
162 String& source = String::Handle(String::New(script_chars)); 156 String& source = String::Handle(String::New(script_chars));
163 Script& script = 157 Script& script =
164 Script::Handle(Script::New(url, source, RawScript::kScriptTag)); 158 Script::Handle(Script::New(url, source, RawScript::kScriptTag));
165 Library& lib = Library::ZoneHandle(Library::CoreLibrary()); 159 Library& lib = Library::ZoneHandle(Library::CoreLibrary());
166 160
167 script.Tokenize(String::Handle(String::New(""))); 161 script.Tokenize(String::Handle(String::New("")));
168 162
169 Parser::ParseCompilationUnit(lib, script); 163 Parser::ParseCompilationUnit(lib, script);
170 EXPECT(ClassFinalizer::ProcessPendingClasses()); 164 EXPECT(ClassFinalizer::ProcessPendingClasses());
171 165
172 DumpFunction(lib, "A", "foo"); 166 DumpFunction(lib, "A", "foo");
173 DumpFunction(lib, "A", "bar"); 167 DumpFunction(lib, "A", "bar");
174 DumpFunction(lib, "A", "baz"); 168 DumpFunction(lib, "A", "baz");
175 DumpFunction(lib, "B", "bam"); 169 DumpFunction(lib, "B", "bam");
176 } 170 }
177 171
178
179 #ifndef PRODUCT 172 #ifndef PRODUCT
180 173
181
182 static char* saved_vars = NULL; 174 static char* saved_vars = NULL;
183 175
184
185 static char* SkipIndex(const char* input) { 176 static char* SkipIndex(const char* input) {
186 char* output_buffer = new char[strlen(input)]; 177 char* output_buffer = new char[strlen(input)];
187 char* output = output_buffer; 178 char* output = output_buffer;
188 179
189 while (input[0] != '\0') { 180 while (input[0] != '\0') {
190 const char* index_pos = strstr(input, "index="); 181 const char* index_pos = strstr(input, "index=");
191 if (index_pos == NULL) { 182 if (index_pos == NULL) {
192 while (input[0] != '\0') { 183 while (input[0] != '\0') {
193 *output++ = *input++; 184 *output++ = *input++;
194 } 185 }
195 break; 186 break;
196 } 187 }
197 188
198 // Copy prefix until "index=" 189 // Copy prefix until "index="
199 while (input < index_pos) { 190 while (input < index_pos) {
200 *output++ = *input++; 191 *output++ = *input++;
201 } 192 }
202 193
203 // Skip until space. 194 // Skip until space.
204 input += strcspn(input, " "); 195 input += strcspn(input, " ");
205 // Skip until next non-space. 196 // Skip until next non-space.
206 input += strspn(input, " "); 197 input += strspn(input, " ");
207 } 198 }
208 199
209 output[0] = '\0'; 200 output[0] = '\0';
210 return output_buffer; 201 return output_buffer;
211 } 202 }
212 203
213
214 // Saves the var descriptors for all frames on the stack as a string. 204 // Saves the var descriptors for all frames on the stack as a string.
215 static void SaveVars(Dart_IsolateId isolate_id, 205 static void SaveVars(Dart_IsolateId isolate_id,
216 intptr_t bp_id, 206 intptr_t bp_id,
217 const Dart_CodeLocation& loc) { 207 const Dart_CodeLocation& loc) {
218 DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace(); 208 DebuggerStackTrace* stack = Isolate::Current()->debugger()->StackTrace();
219 intptr_t num_frames = stack->Length(); 209 intptr_t num_frames = stack->Length();
220 const int kBufferLen = 2048; 210 const int kBufferLen = 2048;
221 char* buffer = reinterpret_cast<char*>(malloc(kBufferLen)); 211 char* buffer = reinterpret_cast<char*>(malloc(kBufferLen));
222 char* pos = buffer; 212 char* pos = buffer;
223 LocalVarDescriptors& var_desc = LocalVarDescriptors::Handle(); 213 LocalVarDescriptors& var_desc = LocalVarDescriptors::Handle();
224 for (intptr_t i = 0; i < num_frames; i++) { 214 for (intptr_t i = 0; i < num_frames; i++) {
225 ActivationFrame* frame = stack->FrameAt(i); 215 ActivationFrame* frame = stack->FrameAt(i);
226 var_desc = frame->code().GetLocalVarDescriptors(); 216 var_desc = frame->code().GetLocalVarDescriptors();
227 const char* var_str = SkipIndex(var_desc.ToCString()); 217 const char* var_str = SkipIndex(var_desc.ToCString());
228 const char* function_str = 218 const char* function_str =
229 String::Handle(frame->function().QualifiedUserVisibleName()) 219 String::Handle(frame->function().QualifiedUserVisibleName())
230 .ToCString(); 220 .ToCString();
231 pos += OS::SNPrint(pos, (kBufferLen - (pos - buffer)), "%s\n%s", 221 pos += OS::SNPrint(pos, (kBufferLen - (pos - buffer)), "%s\n%s",
232 function_str, var_str); 222 function_str, var_str);
233 delete[] var_str; 223 delete[] var_str;
234 } 224 }
235 pos[0] = '\0'; 225 pos[0] = '\0';
236 if (saved_vars != NULL) { 226 if (saved_vars != NULL) {
237 free(saved_vars); 227 free(saved_vars);
238 } 228 }
239 saved_vars = buffer; 229 saved_vars = buffer;
240 } 230 }
241 231
242
243 // Uses the debugger to pause the program and capture the variable 232 // Uses the debugger to pause the program and capture the variable
244 // descriptors for all frames on the stack. 233 // descriptors for all frames on the stack.
245 static char* CaptureVarsAtLine(Dart_Handle lib, const char* entry, int line) { 234 static char* CaptureVarsAtLine(Dart_Handle lib, const char* entry, int line) {
246 EXPECT(ClassFinalizer::ProcessPendingClasses()); 235 EXPECT(ClassFinalizer::ProcessPendingClasses());
247 bool saved_flag = FLAG_show_invisible_frames; 236 bool saved_flag = FLAG_show_invisible_frames;
248 FLAG_show_invisible_frames = true; 237 FLAG_show_invisible_frames = true;
249 Dart_SetPausedEventHandler(SaveVars); 238 Dart_SetPausedEventHandler(SaveVars);
250 EXPECT_VALID(Dart_SetBreakpoint(NewString(TestCase::url()), line)); 239 EXPECT_VALID(Dart_SetBreakpoint(NewString(TestCase::url()), line));
251 saved_vars = NULL; 240 saved_vars = NULL;
252 EXPECT_VALID(Dart_Invoke(lib, NewString(entry), 0, NULL)); 241 EXPECT_VALID(Dart_Invoke(lib, NewString(entry), 0, NULL));
253 char* tmp = saved_vars; 242 char* tmp = saved_vars;
254 saved_vars = NULL; 243 saved_vars = NULL;
255 FLAG_show_invisible_frames = saved_flag; 244 FLAG_show_invisible_frames = saved_flag;
256 return tmp; 245 return tmp;
257 } 246 }
258 247
259
260 TEST_CASE(Parser_AllocateVariables_CapturedVar) { 248 TEST_CASE(Parser_AllocateVariables_CapturedVar) {
261 const char* kScriptChars = 249 const char* kScriptChars =
262 "int main() {\n" 250 "int main() {\n"
263 " var value = 11;\n" 251 " var value = 11;\n"
264 " int f(var param) {\n" 252 " int f(var param) {\n"
265 " return param + value;\n" // line 4 253 " return param + value;\n" // line 4
266 " }\n" 254 " }\n"
267 " return f(22);\n" 255 " return f(22);\n"
268 "}\n"; 256 "}\n";
269 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 257 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
(...skipping 17 matching lines...) Expand all
287 "main\n" 275 "main\n"
288 " 0 ContextLevel level=0 begin=0 end=6\n" 276 " 0 ContextLevel level=0 begin=0 end=6\n"
289 " 1 ContextLevel level=1 begin=8 end=16\n" 277 " 1 ContextLevel level=1 begin=8 end=16\n"
290 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n" 278 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
291 " 3 ContextVar level=1 begin=10 end=37 name=value\n" 279 " 3 ContextVar level=1 begin=10 end=37 name=value\n"
292 " 4 StackVar scope=2 begin=12 end=37 name=f\n", 280 " 4 StackVar scope=2 begin=12 end=37 name=f\n",
293 vars); 281 vars);
294 free(vars); 282 free(vars);
295 } 283 }
296 284
297
298 TEST_CASE(Parser_AllocateVariables_NestedCapturedVar) { 285 TEST_CASE(Parser_AllocateVariables_NestedCapturedVar) {
299 const char* kScriptChars = 286 const char* kScriptChars =
300 "int a() {\n" 287 "int a() {\n"
301 " int b() {\n" 288 " int b() {\n"
302 " var value = 11;\n" 289 " var value = 11;\n"
303 " int c() {\n" 290 " int c() {\n"
304 " return value;\n" // line 5 291 " return value;\n" // line 5
305 " }\n" 292 " }\n"
306 " return c();\n" 293 " return c();\n"
307 " }\n" 294 " }\n"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 // don't save the entry context if the function has no captured 330 // don't save the entry context if the function has no captured
344 // variables. 331 // variables.
345 "a\n" 332 "a\n"
346 " 0 ContextLevel level=0 begin=0 end=14\n" 333 " 0 ContextLevel level=0 begin=0 end=14\n"
347 " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n" 334 " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
348 " 2 StackVar scope=2 begin=6 end=46 name=b\n", 335 " 2 StackVar scope=2 begin=6 end=46 name=b\n",
349 vars); 336 vars);
350 free(vars); 337 free(vars);
351 } 338 }
352 339
353
354 TEST_CASE(Parser_AllocateVariables_TwoChains) { 340 TEST_CASE(Parser_AllocateVariables_TwoChains) {
355 const char* kScriptChars = 341 const char* kScriptChars =
356 "int a() {\n" 342 "int a() {\n"
357 " var value1 = 11;\n" 343 " var value1 = 11;\n"
358 " int b() {\n" 344 " int b() {\n"
359 " int aa() {\n" 345 " int aa() {\n"
360 " var value2 = 12;\n" 346 " var value2 = 12;\n"
361 " int bb() {\n" 347 " int bb() {\n"
362 " return value2;\n" // line 7 348 " return value2;\n" // line 7
363 " }\n" 349 " }\n"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 " 0 ContextLevel level=0 begin=0 end=6\n" 409 " 0 ContextLevel level=0 begin=0 end=6\n"
424 " 1 ContextLevel level=1 begin=8 end=16\n" 410 " 1 ContextLevel level=1 begin=8 end=16\n"
425 " 2 CurrentCtx scope=0 begin=0 end=0" 411 " 2 CurrentCtx scope=0 begin=0 end=0"
426 " name=:current_context_var\n" 412 " name=:current_context_var\n"
427 " 3 ContextVar level=1 begin=10 end=71 name=value1\n" 413 " 3 ContextVar level=1 begin=10 end=71 name=value1\n"
428 " 4 StackVar scope=2 begin=12 end=71 name=b\n", 414 " 4 StackVar scope=2 begin=12 end=71 name=b\n",
429 vars); 415 vars);
430 free(vars); 416 free(vars);
431 } 417 }
432 418
433
434 TEST_CASE(Parser_AllocateVariables_Issue7681) { 419 TEST_CASE(Parser_AllocateVariables_Issue7681) {
435 // This is a distilled version of the program from Issue 7681. 420 // This is a distilled version of the program from Issue 7681.
436 // 421 //
437 // When we create the closure at line 11, we need to make sure to 422 // When we create the closure at line 11, we need to make sure to
438 // save the entry context instead of chaining to the parent context. 423 // save the entry context instead of chaining to the parent context.
439 // 424 //
440 // This test is somewhat redundant with CapturedVarChain but 425 // This test is somewhat redundant with CapturedVarChain but
441 // included for good measure. 426 // included for good measure.
442 const char* kScriptChars = 427 const char* kScriptChars =
443 "class X {\n" 428 "class X {\n"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 466
482 // No context is saved here since no vars are captured. 467 // No context is saved here since no vars are captured.
483 "doIt\n" 468 "doIt\n"
484 " 0 ContextLevel level=0 begin=0 end=18\n" 469 " 0 ContextLevel level=0 begin=0 end=18\n"
485 " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n" 470 " 1 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
486 " 2 StackVar scope=2 begin=35 end=80 name=x\n", 471 " 2 StackVar scope=2 begin=35 end=80 name=x\n",
487 vars); 472 vars);
488 free(vars); 473 free(vars);
489 } 474 }
490 475
491
492 TEST_CASE(Parser_AllocateVariables_CaptureLoopVar) { 476 TEST_CASE(Parser_AllocateVariables_CaptureLoopVar) {
493 // This test verifies that... 477 // This test verifies that...
494 // 478 //
495 // https://code.google.com/p/dart/issues/detail?id=18561 479 // https://code.google.com/p/dart/issues/detail?id=18561
496 // 480 //
497 // ...stays fixed. 481 // ...stays fixed.
498 const char* kScriptChars = 482 const char* kScriptChars =
499 "int outer() {\n" 483 "int outer() {\n"
500 " for(int i = 0; i < 1; i++) {\n" 484 " for(int i = 0; i < 1; i++) {\n"
501 " var value = 11 + i;\n" 485 " var value = 11 + i;\n"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n" 572 " 2 CurrentCtx scope=0 begin=0 end=0 name=:current_context_var\n"
589 " 3 ContextVar level=1 begin=9 end=81 name=x\n" 573 " 3 ContextVar level=1 begin=9 end=81 name=x\n"
590 " 4 StackVar scope=2 begin=11 end=81 name=b\n", 574 " 4 StackVar scope=2 begin=11 end=81 name=b\n",
591 vars); 575 vars);
592 free(vars); 576 free(vars);
593 } 577 }
594 578
595 #endif // !PRODUCT 579 #endif // !PRODUCT
596 580
597 } // namespace dart 581 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/parser.cc ('k') | runtime/vm/port.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698