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

Side by Side Diff: tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart

Issue 756383004: Refactored treatment of closure variables in dart2js CPS. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Comments Created 6 years 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 | Annotate | Revision Log
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart ('k') | no next file » | 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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 // SExpressionUnstringifier implements the inverse operation to 5 // SExpressionUnstringifier implements the inverse operation to
6 // [SExpressionStringifier]. 6 // [SExpressionStringifier].
7 7
8 library sexpr_unstringifier; 8 library sexpr_unstringifier;
9 9
10 import 'package:compiler/src/constants/expressions.dart' 10 import 'package:compiler/src/constants/expressions.dart'
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 return new Selector(kind, name, null, argumentCount); 177 return new Selector(kind, name, null, argumentCount);
178 } 178 }
179 179
180 /// Returns the tokens in s. Note that string literals are not necessarily 180 /// Returns the tokens in s. Note that string literals are not necessarily
181 /// preserved; for instance, "(literalString)" is transformed to 181 /// preserved; for instance, "(literalString)" is transformed to
182 /// " ( literalString ) ". 182 /// " ( literalString ) ".
183 Tokens tokenize(String s) => 183 Tokens tokenize(String s) =>
184 new Tokens( 184 new Tokens(
185 s.replaceAll("(", " ( ") 185 s.replaceAll("(", " ( ")
186 .replaceAll(")", " ) ") 186 .replaceAll(")", " ) ")
187 .replaceAll("{", " { ")
188 .replaceAll("}", " } ")
187 .replaceAll(new RegExp(r"[ \t\n]+"), " ") 189 .replaceAll(new RegExp(r"[ \t\n]+"), " ")
188 .trim() 190 .trim()
189 .split(" ") 191 .split(" ")
190 .map(canonicalizeOperators) 192 .map(canonicalizeOperators)
191 .toList()); 193 .toList());
192 194
193 /// Canonicalizes strings containing operator names. 195 /// Canonicalizes strings containing operator names.
194 String canonicalizeOperators(String token) { 196 String canonicalizeOperators(String token) {
195 String opname = OPERATORS.lookup(token); 197 String opname = OPERATORS.lookup(token);
196 if (opname != null) { 198 if (opname != null) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 tokens.consumeEnd(); 264 tokens.consumeEnd();
263 return prims; 265 return prims;
264 } 266 }
265 267
266 /// (FunctionDefinition name (args cont) body) 268 /// (FunctionDefinition name (args cont) body)
267 FunctionDefinition parseFunctionDefinition() { 269 FunctionDefinition parseFunctionDefinition() {
268 tokens.consumeStart(FUNCTION_DEFINITION); 270 tokens.consumeStart(FUNCTION_DEFINITION);
269 271
270 // name 272 // name
271 Element element = new DummyElement(""); 273 Element element = new DummyElement("");
272 if (tokens.current != "(") { 274 if (tokens.current != '(' && tokens.current != '{') {
273 // This is a named function. 275 // This is a named function.
274 element = new DummyElement(tokens.read()); 276 element = new DummyElement(tokens.read());
275 } 277 }
276 278
279 // [closure-vars]
280 List<ClosureVariable> closureVariables = <ClosureVariable>[];
281 if (tokens.current == '{') {
282 tokens.read('{');
283 while (tokens.current != '}') {
284 String varName = tokens.read();
285 ClosureVariable variable =
286 new ClosureVariable(element, new DummyElement(varName));
287 closureVariables.add(variable);
288 name2variable[varName] = variable;
289 }
290 tokens.read('}');
291 }
292
277 // (args cont) 293 // (args cont)
278 List<Parameter> parameters = <Parameter>[]; 294 List<Definition> parameters = <Definition>[];
279 tokens.consumeStart(); 295 tokens.consumeStart();
280 while (tokens.next != ")") { 296 while (tokens.next != ")") {
281 String paramName = tokens.read(); 297 String paramName = tokens.read();
282 Parameter param = new Parameter(new DummyElement(paramName)); 298 if (name2variable.containsKey(paramName)) {
283 name2variable[paramName] = param; 299 parameters.add(name2variable[paramName]);
284 parameters.add(param); 300 } else {
301 Parameter param = new Parameter(new DummyElement(paramName));
302 name2variable[paramName] = param;
303 parameters.add(param);
304 }
285 } 305 }
286 306
287 String contName = tokens.read("return"); 307 String contName = tokens.read("return");
288 Continuation cont = name2variable[contName]; 308 Continuation cont = name2variable[contName];
289 assert(cont != null); 309 assert(cont != null);
290 tokens.consumeEnd(); 310 tokens.consumeEnd();
291 311
292 // body 312 // body
293 Expression body = parseExpression(); 313 Expression body = parseExpression();
294 314
295 tokens.consumeEnd(); 315 tokens.consumeEnd();
296 return new FunctionDefinition(element, cont, parameters, body, null, null); 316 return new FunctionDefinition(element, cont, parameters, body, null, null,
317 closureVariables);
297 } 318 }
298 319
299 /// (IsTrue arg) 320 /// (IsTrue arg)
300 Condition parseCondition() { 321 Condition parseCondition() {
301 // Handles IsTrue only for now. 322 // Handles IsTrue only for now.
302 tokens.consumeStart(IS_TRUE); 323 tokens.consumeStart(IS_TRUE);
303 324
304 Definition value = name2variable[tokens.read()]; 325 Definition value = name2variable[tokens.read()];
305 assert(value != null); 326 assert(value != null);
306 327
(...skipping 25 matching lines...) Expand all
332 353
333 tokens.consumeEnd(); 354 tokens.consumeEnd();
334 return new ConcatenateStrings(cont, args); 355 return new ConcatenateStrings(cont, args);
335 } 356 }
336 357
337 /// (DeclareFunction name = function in body) 358 /// (DeclareFunction name = function in body)
338 DeclareFunction parseDeclareFunction() { 359 DeclareFunction parseDeclareFunction() {
339 tokens.consumeStart(DECLARE_FUNCTION); 360 tokens.consumeStart(DECLARE_FUNCTION);
340 361
341 // name = 362 // name =
342 Local local = new DummyLocal(tokens.read()); 363 ClosureVariable local = name2variable[tokens.read()];
343 tokens.read("="); 364 tokens.read("=");
344 365
345 // function in 366 // function in
346 FunctionDefinition def = parseFunctionDefinition(); 367 FunctionDefinition def = parseFunctionDefinition();
347 tokens.read("in"); 368 tokens.read("in");
348 369
349 // body 370 // body
350 Expression body = parseExpression(); 371 Expression body = parseExpression();
351 372
352 tokens.consumeEnd(); 373 tokens.consumeEnd();
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 // body 494 // body
474 Expression body = parseExpression(); 495 Expression body = parseExpression();
475 496
476 return new LetCont(cont, body); 497 return new LetCont(cont, body);
477 } 498 }
478 499
479 /// (SetClosureVariable name value body) 500 /// (SetClosureVariable name value body)
480 SetClosureVariable parseSetClosureVariable() { 501 SetClosureVariable parseSetClosureVariable() {
481 tokens.consumeStart(SET_CLOSURE_VARIABLE); 502 tokens.consumeStart(SET_CLOSURE_VARIABLE);
482 503
483 Local local = new DummyLocal(tokens.read()); 504 ClosureVariable local = name2variable[tokens.read()];
484 Primitive value = name2variable[tokens.read()]; 505 Primitive value = name2variable[tokens.read()];
485 assert(value != null); 506 assert(value != null);
486 507
487 Expression body = parseExpression(); 508 Expression body = parseExpression();
488 509
489 tokens.consumeEnd(); 510 tokens.consumeEnd();
490 return new SetClosureVariable(local, value) 511 return new SetClosureVariable(local, value)
491 ..plug(body); 512 ..plug(body);
492 } 513 }
493 514
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 tokens.consumeStart(CREATE_FUNCTION); 656 tokens.consumeStart(CREATE_FUNCTION);
636 FunctionDefinition def = parseFunctionDefinition(); 657 FunctionDefinition def = parseFunctionDefinition();
637 tokens.consumeEnd(); 658 tokens.consumeEnd();
638 return new CreateFunction(def); 659 return new CreateFunction(def);
639 } 660 }
640 661
641 /// (GetClosureVariable name) 662 /// (GetClosureVariable name)
642 GetClosureVariable parseGetClosureVariable() { 663 GetClosureVariable parseGetClosureVariable() {
643 tokens.consumeStart(GET_CLOSURE_VARIABLE); 664 tokens.consumeStart(GET_CLOSURE_VARIABLE);
644 665
645 Local local = new DummyLocal(tokens.read()); 666 ClosureVariable local = name2variable[tokens.read()];
646 tokens.consumeEnd(); 667 tokens.consumeEnd();
647 668
648 return new GetClosureVariable(local); 669 return new GetClosureVariable(local);
649 } 670 }
650 671
651 /// (LiteralList values) 672 /// (LiteralList values)
652 LiteralList parseLiteralList() { 673 LiteralList parseLiteralList() {
653 tokens.consumeStart(LITERAL_LIST); 674 tokens.consumeStart(LITERAL_LIST);
654 List<Primitive> values = parsePrimitiveList(); 675 List<Primitive> values = parsePrimitiveList();
655 tokens.consumeEnd(); 676 tokens.consumeEnd();
(...skipping 26 matching lines...) Expand all
682 return new ReifyTypeVar(type); 703 return new ReifyTypeVar(type);
683 } 704 }
684 705
685 /// (This) 706 /// (This)
686 This parseThis() { 707 This parseThis() {
687 tokens.consumeStart(THIS); 708 tokens.consumeStart(THIS);
688 tokens.consumeEnd(); 709 tokens.consumeEnd();
689 return new This(); 710 return new This();
690 } 711 }
691 } 712 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698