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 import 'common/names.dart' show Identifiers; | 5 import 'common/names.dart' show Identifiers; |
6 import 'common/resolution.dart' show ParsingContext, Resolution; | 6 import 'common/resolution.dart' show ParsingContext, Resolution; |
7 import 'common/tasks.dart' show CompilerTask, Measurer; | 7 import 'common/tasks.dart' show CompilerTask, Measurer; |
8 import 'common.dart'; | 8 import 'common.dart'; |
9 import 'compiler.dart' show Compiler; | 9 import 'compiler.dart' show Compiler; |
10 import 'constants/expressions.dart'; | 10 import 'constants/expressions.dart'; |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 | 492 |
493 accept(ElementVisitor visitor, arg) { | 493 accept(ElementVisitor visitor, arg) { |
494 return visitor.visitClosureClassElement(this, arg); | 494 return visitor.visitClosureClassElement(this, arg); |
495 } | 495 } |
496 } | 496 } |
497 | 497 |
498 /// A local variable that contains the box object holding the [BoxFieldElement] | 498 /// A local variable that contains the box object holding the [BoxFieldElement] |
499 /// fields. | 499 /// fields. |
500 class BoxLocal extends Local { | 500 class BoxLocal extends Local { |
501 final String name; | 501 final String name; |
502 final ExecutableElement executableContext; | 502 final Entity executableContext; |
| 503 final MemberEntity memberContext; |
503 | 504 |
504 final int hashCode = _nextHashCode = (_nextHashCode + 10007).toUnsigned(30); | 505 final int hashCode = _nextHashCode = (_nextHashCode + 10007).toUnsigned(30); |
505 static int _nextHashCode = 0; | 506 static int _nextHashCode = 0; |
506 | 507 |
507 BoxLocal(this.name, this.executableContext); | 508 BoxLocal(this.name, this.executableContext, this.memberContext); |
508 | |
509 @override | |
510 MemberElement get memberContext => executableContext.memberContext; | |
511 | 509 |
512 String toString() => 'BoxLocal($name)'; | 510 String toString() => 'BoxLocal($name)'; |
513 } | 511 } |
514 | 512 |
515 // TODO(ngeoffray, ahe): These classes continuously cause problems. We need to | 513 // TODO(ngeoffray, ahe): These classes continuously cause problems. We need to |
516 // find a more general solution. | 514 // find a more general solution. |
517 class BoxFieldElement extends ElementX | 515 class BoxFieldElement extends ElementX |
518 implements TypedElement, FieldElement, PrivatelyNamedJSEntity { | 516 implements TypedElement, FieldElement, PrivatelyNamedJSEntity { |
519 final LocalVariableElement variableElement; | 517 final LocalVariableElement variableElement; |
520 final BoxLocal box; | 518 final BoxLocal box; |
(...skipping 21 matching lines...) Expand all Loading... |
542 | 540 |
543 @override | 541 @override |
544 bool get hasResolvedAst => false; | 542 bool get hasResolvedAst => false; |
545 | 543 |
546 @override | 544 @override |
547 Expression get initializer { | 545 Expression get initializer { |
548 throw new UnsupportedError("BoxFieldElement.initializer"); | 546 throw new UnsupportedError("BoxFieldElement.initializer"); |
549 } | 547 } |
550 | 548 |
551 @override | 549 @override |
552 MemberElement get memberContext => box.executableContext.memberContext; | 550 MemberElement get memberContext => box.memberContext; |
553 | 551 |
554 @override | 552 @override |
555 List<FunctionElement> get nestedClosures => const <FunctionElement>[]; | 553 List<FunctionElement> get nestedClosures => const <FunctionElement>[]; |
556 | 554 |
557 @override | 555 @override |
558 VariableDefinitions get node { | 556 VariableDefinitions get node { |
559 throw new UnsupportedError("BoxFieldElement.node"); | 557 throw new UnsupportedError("BoxFieldElement.node"); |
560 } | 558 } |
561 | 559 |
562 @override | 560 @override |
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1221 void attachCapturedScopeVariables(Node node) { | 1219 void attachCapturedScopeVariables(Node node) { |
1222 BoxLocal box = null; | 1220 BoxLocal box = null; |
1223 Map<LocalVariableElement, BoxFieldElement> scopeMapping = | 1221 Map<LocalVariableElement, BoxFieldElement> scopeMapping = |
1224 new Map<LocalVariableElement, BoxFieldElement>(); | 1222 new Map<LocalVariableElement, BoxFieldElement>(); |
1225 | 1223 |
1226 void boxCapturedVariable(LocalVariableElement variable) { | 1224 void boxCapturedVariable(LocalVariableElement variable) { |
1227 if (isCapturedVariable(variable)) { | 1225 if (isCapturedVariable(variable)) { |
1228 if (box == null) { | 1226 if (box == null) { |
1229 // TODO(floitsch): construct better box names. | 1227 // TODO(floitsch): construct better box names. |
1230 String boxName = getBoxFieldName(closureFieldCounter++); | 1228 String boxName = getBoxFieldName(closureFieldCounter++); |
1231 box = new BoxLocal(boxName, executableContext); | 1229 box = new BoxLocal( |
| 1230 boxName, executableContext, executableContext.memberContext); |
1232 } | 1231 } |
1233 String elementName = variable.name; | 1232 String elementName = variable.name; |
1234 String boxedName = | 1233 String boxedName = |
1235 getClosureVariableName(elementName, boxedFieldCounter++); | 1234 getClosureVariableName(elementName, boxedFieldCounter++); |
1236 // TODO(kasperl): Should this be a FieldElement instead? | 1235 // TODO(kasperl): Should this be a FieldElement instead? |
1237 BoxFieldElement boxed = new BoxFieldElement(boxedName, variable, box); | 1236 BoxFieldElement boxed = new BoxFieldElement(boxedName, variable, box); |
1238 scopeMapping[variable] = boxed; | 1237 scopeMapping[variable] = boxed; |
1239 setCapturedVariableBoxField(variable, boxed); | 1238 setCapturedVariableBoxField(variable, boxed); |
1240 } | 1239 } |
1241 } | 1240 } |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1525 /// | 1524 /// |
1526 /// Move the below classes to a JS model eventually. | 1525 /// Move the below classes to a JS model eventually. |
1527 /// | 1526 /// |
1528 abstract class JSEntity implements MemberEntity { | 1527 abstract class JSEntity implements MemberEntity { |
1529 Local get declaredEntity; | 1528 Local get declaredEntity; |
1530 } | 1529 } |
1531 | 1530 |
1532 abstract class PrivatelyNamedJSEntity implements JSEntity { | 1531 abstract class PrivatelyNamedJSEntity implements JSEntity { |
1533 Entity get rootOfScope; | 1532 Entity get rootOfScope; |
1534 } | 1533 } |
OLD | NEW |