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

Side by Side Diff: pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart

Issue 1158693003: dart2js cps: Change how type variables are accessed in constructors. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 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
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 library dart2js.ir_builder; 5 library dart2js.ir_builder;
6 6
7 import '../constants/constant_system.dart'; 7 import '../constants/constant_system.dart';
8 import '../constants/expressions.dart'; 8 import '../constants/expressions.dart';
9 import '../constants/values.dart' show PrimitiveConstantValue; 9 import '../constants/values.dart' show PrimitiveConstantValue;
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 if (variable != other.index2variable[i]) return false; 104 if (variable != other.index2variable[i]) return false;
105 105
106 // The variable maps to the same index in both environments. 106 // The variable maps to the same index in both environments.
107 int index = variable2index[variable]; 107 int index = variable2index[variable];
108 if (index == null || index != other.variable2index[variable]) { 108 if (index == null || index != other.variable2index[variable]) {
109 return false; 109 return false;
110 } 110 }
111 } 111 }
112 return true; 112 return true;
113 } 113 }
114
115 bool contains(Local local) => variable2index.containsKey(local);
114 } 116 }
115 117
116 /// The abstract base class of objects that emit jumps to a continuation and 118 /// The abstract base class of objects that emit jumps to a continuation and
117 /// give a handle to the continuation and its environment. 119 /// give a handle to the continuation and its environment.
118 abstract class JumpCollector { 120 abstract class JumpCollector {
119 final JumpTarget target; 121 final JumpTarget target;
120 122
121 ir.Continuation _continuation = null; 123 ir.Continuation _continuation = null;
122 final Environment _continuationEnvironment; 124 final Environment _continuationEnvironment;
123 125
(...skipping 2503 matching lines...) Expand 10 before | Expand all | Expand 10 after
2627 } 2629 }
2628 } 2630 }
2629 2631
2630 /// Obtains the internal type representation of the type held in [variable]. 2632 /// Obtains the internal type representation of the type held in [variable].
2631 /// 2633 ///
2632 /// The value of [variable] is taken from the current receiver object, or 2634 /// The value of [variable] is taken from the current receiver object, or
2633 /// if we are currently building a constructor field initializer, from the 2635 /// if we are currently building a constructor field initializer, from the
2634 /// corresponding type argument (field initializers are evaluated before the 2636 /// corresponding type argument (field initializers are evaluated before the
2635 /// receiver object is created). 2637 /// receiver object is created).
2636 ir.Primitive buildTypeVariableAccess(TypeVariableType variable) { 2638 ir.Primitive buildTypeVariableAccess(TypeVariableType variable) {
2637 ir.Parameter accessTypeArgumentParameter() { 2639 // If the local exists in the environment, use that.
2638 for (int i = 0; i < environment.length; i++) { 2640 // This is put here when we are inside a constructor or field initializer,
2639 Local local = environment.index2variable[i]; 2641 // (or possibly a closure inside one of these).
2640 if (local is TypeInformationParameter && 2642 Local local = new TypeVariableLocal(variable, state.currentElement);
2641 local.variable == variable.element) { 2643 if (environment.contains(local)) {
2642 return environment.index2value[i]; 2644 return environment.lookup(local);
2643 }
2644 }
2645 throw 'unable to find constructor parameter for type variable $variable.';
2646 } 2645 }
2647 2646
2648 if (jsState.inInitializers) { 2647 // If the type variable is not in a local, access it one the receiver.
karlklose 2015/05/28 08:12:19 'access it one the receiver' -> 'read the value fr
asgerf 2015/05/28 09:34:21 Done.
2649 return accessTypeArgumentParameter(); 2648 ir.Primitive target = buildThis();
2650 } else { 2649 return addPrimitive(new ir.ReadTypeVariable(variable, target));
2651 ir.Primitive target = buildThis(); 2650 }
2652 return addPrimitive(new ir.ReadTypeVariable(variable, target)); 2651
2653 } 2652 /// Make the given type variable accessible through the local environment
2653 /// with the value of [binding].
2654 void declareTypeVariable(TypeVariableType variable, DartType binding) {
2655 environment.extend(
2656 new TypeVariableLocal(variable, state.currentElement),
2657 buildTypeExpression(binding));
2654 } 2658 }
2655 2659
2656 @override 2660 @override
2657 ir.Primitive buildReifyTypeVariable(TypeVariableType variable) { 2661 ir.Primitive buildReifyTypeVariable(TypeVariableType variable) {
2658 ir.Primitive typeArgument = buildTypeVariableAccess(variable); 2662 ir.Primitive typeArgument = buildTypeVariableAccess(variable);
2659 return addPrimitive(new ir.ReifyRuntimeType(typeArgument)); 2663 return addPrimitive(new ir.ReifyRuntimeType(typeArgument));
2660 } 2664 }
2661 2665
2662 ir.Primitive buildInvocationMirror(Selector selector, 2666 ir.Primitive buildInvocationMirror(Selector selector,
2663 List<ir.Primitive> arguments) { 2667 List<ir.Primitive> arguments) {
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
2757 final DartType type; 2761 final DartType type;
2758 final LocalVariableElement exceptionVariable; 2762 final LocalVariableElement exceptionVariable;
2759 final LocalVariableElement stackTraceVariable; 2763 final LocalVariableElement stackTraceVariable;
2760 final SubbuildFunction buildCatchBlock; 2764 final SubbuildFunction buildCatchBlock;
2761 2765
2762 CatchClauseInfo({this.type, 2766 CatchClauseInfo({this.type,
2763 this.exceptionVariable, 2767 this.exceptionVariable,
2764 this.stackTraceVariable, 2768 this.stackTraceVariable,
2765 this.buildCatchBlock}); 2769 this.buildCatchBlock});
2766 } 2770 }
2767
2768 /// Synthetic parameter to a JavaScript factory method that takes the type
2769 /// argument given for the type variable [variable].
2770 class TypeInformationParameter implements Local {
2771 final TypeVariableElement variable;
2772 final ExecutableElement executableContext;
2773 TypeInformationParameter(this.variable, this.executableContext);
2774 String get name => variable.name;
2775 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698