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

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

Issue 1155463005: dart2js cps: Remove dart2dart from cps pipeline and clean up. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Skip tests specific to the dart backend 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart » ('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) 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 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 final List<JumpCollector> continueCollectors = <JumpCollector>[]; 388 final List<JumpCollector> continueCollectors = <JumpCollector>[];
389 389
390 final List<ConstDeclaration> localConstants = <ConstDeclaration>[]; 390 final List<ConstDeclaration> localConstants = <ConstDeclaration>[];
391 391
392 final ExecutableElement currentElement; 392 final ExecutableElement currentElement;
393 393
394 final ir.Continuation returnContinuation = new ir.Continuation.retrn(); 394 final ir.Continuation returnContinuation = new ir.Continuation.retrn();
395 ir.Parameter _thisParameter; 395 ir.Parameter _thisParameter;
396 ir.Parameter enclosingMethodThisParameter; 396 ir.Parameter enclosingMethodThisParameter;
397 397
398 final List<ir.Definition> functionParameters = <ir.Definition>[]; 398 final List<ir.Parameter> functionParameters = <ir.Parameter>[];
399 399
400 IrBuilderSharedState(this.constantSystem, this.currentElement); 400 IrBuilderSharedState(this.constantSystem, this.currentElement);
401 401
402 ir.Parameter get thisParameter => _thisParameter; 402 ir.Parameter get thisParameter => _thisParameter;
403 void set thisParameter(ir.Parameter value) { 403 void set thisParameter(ir.Parameter value) {
404 assert(_thisParameter == null); 404 assert(_thisParameter == null);
405 _thisParameter = value; 405 _thisParameter = value;
406 } 406 }
407 } 407 }
408 408
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 /// variables to their values. If an optional environment argument is 558 /// variables to their values. If an optional environment argument is
559 /// supplied, it is used as the builder's initial environment. Otherwise 559 /// supplied, it is used as the builder's initial environment. Otherwise
560 /// the environment is initially a copy of the parent builder's environment. 560 /// the environment is initially a copy of the parent builder's environment.
561 IrBuilder makeDelimitedBuilder([Environment env = null]) { 561 IrBuilder makeDelimitedBuilder([Environment env = null]) {
562 return _makeInstance() 562 return _makeInstance()
563 ..state = state 563 ..state = state
564 ..environment = env != null ? env : new Environment.from(environment) 564 ..environment = env != null ? env : new Environment.from(environment)
565 ..mutableVariables = mutableVariables; 565 ..mutableVariables = mutableVariables;
566 } 566 }
567 567
568 /// Construct a builder for making constructor field initializers.
569 IrBuilder makeInitializerBuilder() {
570 return _makeInstance()
571 ..state = new IrBuilderSharedState(state.constantSystem,
572 state.currentElement)
573 ..environment = new Environment.from(environment)
574 ..mutableVariables = mutableVariables;
575 }
576
577 /// Construct a builder for an inner function.
578 IrBuilder makeInnerFunctionBuilder(ExecutableElement currentElement) {
579 IrBuilderSharedState innerState =
580 new IrBuilderSharedState(state.constantSystem, currentElement)
581 ..enclosingMethodThisParameter = state.enclosingMethodThisParameter;
582 return _makeInstance()
583 ..state = innerState
584 ..environment = new Environment.empty()
585 ..mutableVariables =
586 new Map<Local, ir.MutableVariable>.from(mutableVariables);
587 }
588
589 bool get isOpen => _root == null || _current != null; 568 bool get isOpen => _root == null || _current != null;
590 569
591
592 void buildFieldInitializerHeader({ClosureScope closureScope}) {
593 _enterScope(closureScope);
594 }
595
596 List<ir.Primitive> buildFunctionHeader(Iterable<Local> parameters, 570 List<ir.Primitive> buildFunctionHeader(Iterable<Local> parameters,
597 {ClosureScope closureScope, 571 {ClosureScope closureScope,
598 ClosureEnvironment env}) { 572 ClosureEnvironment env}) {
599 _createThisParameter(); 573 _createThisParameter();
600 _enterClosureEnvironment(env); 574 _enterClosureEnvironment(env);
601 _enterScope(closureScope); 575 _enterScope(closureScope);
602 parameters.forEach(_createFunctionParameter); 576 parameters.forEach(_createFunctionParameter);
603 return _parameters; 577 return _parameters;
604 } 578 }
605 579
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 * statement on each branch. This includes functions with an empty body, 799 * statement on each branch. This includes functions with an empty body,
826 * such as `foo(){ }`. 800 * such as `foo(){ }`.
827 */ 801 */
828 void _ensureReturn() { 802 void _ensureReturn() {
829 if (!isOpen) return; 803 if (!isOpen) return;
830 ir.Constant constant = buildNullConstant(); 804 ir.Constant constant = buildNullConstant();
831 add(new ir.InvokeContinuation(state.returnContinuation, [constant])); 805 add(new ir.InvokeContinuation(state.returnContinuation, [constant]));
832 _current = null; 806 _current = null;
833 } 807 }
834 808
835 ir.SuperInitializer makeSuperInitializer(ConstructorElement target, 809 /// Create a [ir.FunctionDefinition] using [_root] as the body.
836 List<ir.Body> arguments,
837 Selector selector) {
838 return new ir.SuperInitializer(target, arguments, selector);
839 }
840
841 ir.FieldInitializer makeFieldInitializer(FieldElement element,
842 ir.Body body) {
843 return new ir.FieldInitializer(element, body);
844 }
845
846 /// Create a [ir.FieldDefinition] for the current [Element] using [_root] as
847 /// the body using [initializer] as the initial value.
848 ir.FieldDefinition makeFieldDefinition(ir.Primitive initializer) {
849 if (initializer == null) {
850 return new ir.FieldDefinition.withoutInitializer(state.currentElement);
851 } else {
852 ir.Body body = makeBody(initializer);
853 return new ir.FieldDefinition(state.currentElement, body);
854 }
855 }
856
857 ir.Body makeBody([ir.Primitive value]) {
858 if (value == null) {
859 _ensureReturn();
860 } else {
861 buildReturn(value);
862 }
863 return new ir.Body(_root, state.returnContinuation);
864 }
865
866 /// Create a [ir.FunctionDefinition] for [element] using [_root] as the body.
867 /// 810 ///
868 /// Parameters must be created before the construction of the body using 811 /// The protocol for building a function is:
869 /// [createFunctionParameter]. 812 /// 1. Call [buildFunctionHeader].
870 ir.FunctionDefinition makeFunctionDefinition( 813 /// 2. Call `buildXXX` methods to build the body.
871 List<ConstantExpression> defaults) { 814 /// 3. Call [makeFunctionDefinition] to finish.
872 FunctionElement element = state.currentElement; 815 ir.FunctionDefinition makeFunctionDefinition() {
873 if (element.isAbstract || element.isExternal) { 816 _ensureReturn();
874 assert(invariant(element, _root == null, 817 return new ir.FunctionDefinition(
875 message: "Non-empty body for abstract method $element: $_root")); 818 state.currentElement,
876 assert(invariant(element, state.localConstants.isEmpty, 819 state.thisParameter,
877 message: "Local constants for abstract method $element: " 820 state.functionParameters,
878 "${state.localConstants}")); 821 state.returnContinuation,
879 return new ir.FunctionDefinition.abstract( 822 _root);
880 element, state.functionParameters, defaults);
881 } else {
882 ir.Body body = makeBody();
883 return new ir.FunctionDefinition(
884 element, state.thisParameter, state.functionParameters, body,
885 state.localConstants, defaults);
886 }
887 }
888
889 /// Create a constructor definition without a body, for representing
890 /// external constructors declarations.
891 ir.ConstructorDefinition makeAbstractConstructorDefinition(
892 List<ConstantExpression> defaults) {
893 FunctionElement element = state.currentElement;
894 assert(invariant(element, _root == null,
895 message: "Non-empty body for external constructor $element: $_root"));
896 assert(invariant(element, state.localConstants.isEmpty,
897 message: "Local constants for external constructor $element: "
898 "${state.localConstants}"));
899 return new ir.ConstructorDefinition.abstract(
900 element, state.functionParameters, defaults);
901 }
902
903 ir.ConstructorDefinition makeConstructorDefinition(
904 List<ConstantExpression> defaults, List<ir.Initializer> initializers) {
905 FunctionElement element = state.currentElement;
906 ir.Body body = makeBody();
907 return new ir.ConstructorDefinition(
908 element, state.thisParameter, state.functionParameters, body, initialize rs,
909 state.localConstants, defaults);
910 }
911
912 ir.FunctionDefinition makeLazyFieldInitializer() {
913 ir.Body body = makeBody();
914 FieldElement element = state.currentElement;
915 return new ir.FunctionDefinition(element, null, [], body, [], []);
916 } 823 }
917 824
918 /// Create a invocation of the [method] on the super class where the call 825 /// Create a invocation of the [method] on the super class where the call
919 /// structure is defined [callStructure] and the argument values are defined 826 /// structure is defined [callStructure] and the argument values are defined
920 /// by [arguments]. 827 /// by [arguments].
921 ir.Primitive buildSuperMethodInvocation(MethodElement method, 828 ir.Primitive buildSuperMethodInvocation(MethodElement method,
922 CallStructure callStructure, 829 CallStructure callStructure,
923 List<ir.Primitive> arguments) { 830 List<ir.Primitive> arguments) {
924 // TODO(johnniwinther): This shouldn't be necessary. 831 // TODO(johnniwinther): This shouldn't be necessary.
925 SelectorKind kind = Elements.isOperatorName(method.name) 832 SelectorKind kind = Elements.isOperatorName(method.name)
(...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after
2096 leftTrueContinuation, 2003 leftTrueContinuation,
2097 leftFalseContinuation)))); 2004 leftFalseContinuation))));
2098 environment = join.environment; 2005 environment = join.environment;
2099 environment.discard(1); 2006 environment.discard(1);
2100 // There is always a join parameter for the result value, because it 2007 // There is always a join parameter for the result value, because it
2101 // is different on at least two paths. 2008 // is different on at least two paths.
2102 return join.continuation.parameters.last; 2009 return join.continuation.parameters.last;
2103 } 2010 }
2104 } 2011 }
2105 2012
2106 /// Shared state between DartIrBuilders within the same method.
2107 class DartIrBuilderSharedState {
2108 /// [MutableVariable]s that should temporarily be treated as registers.
2109 final Set<Local> registerizedMutableVariables = new Set<Local>();
2110 }
2111
2112 /// Dart-specific subclass of [IrBuilder].
2113 ///
2114 /// Inner functions are represented by a [FunctionDefinition] with the
2115 /// IR for the inner function nested inside.
2116 ///
2117 /// Captured variables are translated to ref cells (see [MutableVariable])
2118 /// using [GetMutableVariable] and [SetMutableVariable].
2119 class DartIrBuilder extends IrBuilder {
2120 final DartIrBuilderSharedState dartState;
2121
2122 IrBuilder _makeInstance() => new DartIrBuilder._blank(dartState);
2123 DartIrBuilder._blank(this.dartState);
2124
2125 DartIrBuilder(ConstantSystem constantSystem,
2126 ExecutableElement currentElement,
2127 Set<Local> capturedVariables)
2128 : dartState = new DartIrBuilderSharedState() {
2129 _init(constantSystem, currentElement);
2130 capturedVariables.forEach(makeMutableVariable);
2131 }
2132
2133 @override
2134 bool isInMutableVariable(Local local) {
2135 return mutableVariables.containsKey(local) &&
2136 !dartState.registerizedMutableVariables.contains(local);
2137 }
2138
2139 void _enterScope(ClosureScope scope) {
2140 assert(scope == null);
2141 }
2142
2143 void _enterClosureEnvironment(ClosureEnvironment env) {
2144 assert(env == null);
2145 }
2146
2147 void _enterForLoopInitializer(ClosureScope scope,
2148 List<LocalElement> loopVariables) {
2149 assert(scope == null);
2150 for (LocalElement loopVariable in loopVariables) {
2151 if (mutableVariables.containsKey(loopVariable)) {
2152 // Temporarily keep the loop variable in a primitive.
2153 // The loop variable will be added to environment when
2154 // [declareLocalVariable] is called.
2155 dartState.registerizedMutableVariables.add(loopVariable);
2156 }
2157 }
2158 }
2159
2160 void _enterForLoopBody(ClosureScope scope,
2161 List<LocalElement> loopVariables) {
2162 assert(scope == null);
2163 for (LocalElement loopVariable in loopVariables) {
2164 if (mutableVariables.containsKey(loopVariable)) {
2165 // Move from [Primitive] into [MutableVariable].
2166 dartState.registerizedMutableVariables.remove(loopVariable);
2167 add(new ir.LetMutable(getMutableVariable(loopVariable),
2168 environment.lookup(loopVariable)));
2169 }
2170 }
2171 }
2172
2173 void _enterForLoopUpdate(ClosureScope scope,
2174 List<LocalElement> loopVariables) {
2175 assert(scope == null);
2176 // Move captured loop variables back into the local environment.
2177 // The update expression will use the values we put in the environment,
2178 // and then the environments for the initializer and update will be
2179 // joined at the head of the body.
2180 for (LocalElement loopVariable in loopVariables) {
2181 if (isInMutableVariable(loopVariable)) {
2182 ir.MutableVariable mutableVariable = getMutableVariable(loopVariable);
2183 ir.Primitive value =
2184 addPrimitive(new ir.GetMutableVariable(mutableVariable));
2185 environment.update(loopVariable, value);
2186 dartState.registerizedMutableVariables.add(loopVariable);
2187 }
2188 }
2189 }
2190
2191 void _createFunctionParameter(Local parameterElement) {
2192 ir.Parameter parameter = new ir.Parameter(parameterElement);
2193 _parameters.add(parameter);
2194 if (isInMutableVariable(parameterElement)) {
2195 state.functionParameters.add(getMutableVariable(parameterElement));
2196 } else {
2197 state.functionParameters.add(parameter);
2198 environment.extend(parameterElement, parameter);
2199 }
2200 }
2201
2202 void _createThisParameter() {
2203 void create() {
2204 ir.Parameter thisParameter =
2205 new ir.Parameter(new ThisParameterLocal(state.currentElement));
2206 state.thisParameter = thisParameter;
2207 state.enclosingMethodThisParameter = thisParameter;
2208 }
2209 if (state.currentElement.isLocal) return;
2210 if (state.currentElement.isStatic) return;
2211 if (state.currentElement.isGenerativeConstructor) {
2212 create();
2213 return;
2214 }
2215 if (state.currentElement.isStatic) return;
2216 if (state.currentElement.isInstanceMember) {
2217 create();
2218 return;
2219 }
2220 }
2221
2222 void declareLocalVariable(LocalVariableElement variableElement,
2223 {ir.Primitive initialValue}) {
2224 assert(isOpen);
2225 if (initialValue == null) {
2226 initialValue = buildNullConstant();
2227 }
2228 if (isInMutableVariable(variableElement)) {
2229 add(new ir.LetMutable(getMutableVariable(variableElement),
2230 initialValue));
2231 } else {
2232 initialValue.useElementAsHint(variableElement);
2233 environment.extend(variableElement, initialValue);
2234 }
2235 }
2236
2237 /// Add [functionElement] to the environment with provided [definition].
2238 void declareLocalFunction(LocalFunctionElement functionElement,
2239 ir.FunctionDefinition definition) {
2240 assert(isOpen);
2241 if (isInMutableVariable(functionElement)) {
2242 ir.MutableVariable variable = getMutableVariable(functionElement);
2243 add(new ir.DeclareFunction(variable, definition));
2244 } else {
2245 ir.CreateFunction prim = addPrimitive(new ir.CreateFunction(definition));
2246 environment.extend(functionElement, prim);
2247 prim.useElementAsHint(functionElement);
2248 }
2249 }
2250
2251 /// Create a function expression from [definition].
2252 ir.Primitive buildFunctionExpression(ir.FunctionDefinition definition) {
2253 return addPrimitive(new ir.CreateFunction(definition));
2254 }
2255
2256 /// Create a read access of [local].
2257 @override
2258 ir.Primitive _buildLocalGet(LocalElement local) {
2259 assert(isOpen);
2260 if (isInMutableVariable(local)) {
2261 // Do not use [local] as a hint on [result]. The variable should always
2262 // be inlined, but the hint prevents it.
2263 return addPrimitive(new ir.GetMutableVariable(getMutableVariable(local)));
2264 } else {
2265 return environment.lookup(local);
2266 }
2267 }
2268
2269 /// Create a write access to [local] with the provided [value].
2270 @override
2271 ir.Primitive buildLocalVariableSet(LocalElement local, ir.Primitive value) {
2272 assert(isOpen);
2273 if (isInMutableVariable(local)) {
2274 add(new ir.SetMutableVariable(getMutableVariable(local), value));
2275 } else {
2276 value.useElementAsHint(local);
2277 environment.update(local, value);
2278 }
2279 return value;
2280 }
2281
2282 ir.Primitive buildThis() {
2283 return state.enclosingMethodThisParameter;
2284 }
2285
2286 @override
2287 ir.Primitive buildConstructorInvocation(ConstructorElement element,
2288 CallStructure callStructure,
2289 DartType type,
2290 List<ir.Primitive> arguments) {
2291 assert(isOpen);
2292 Selector selector =
2293 new Selector(SelectorKind.CALL, element.memberName, callStructure);
2294 return _continueWithExpression(
2295 (k) => new ir.InvokeConstructor(type, element, selector,
2296 arguments, k));
2297 }
2298
2299 @override
2300 ir.Primitive buildReifyTypeVariable(TypeVariableType variable) {
2301 return addPrimitive(new ir.ReifyTypeVar(variable.element));
2302 }
2303
2304 @override
2305 ir.Primitive buildTypeOperator(ir.Primitive value,
2306 DartType type,
2307 {bool isTypeTest}) {
2308 assert(isOpen);
2309 assert(isTypeTest != null);
2310 ir.Primitive check = _continueWithExpression(
2311 (k) => new ir.TypeOperator(value, type,
2312 const <ir.Primitive>[], k, isTypeTest: isTypeTest));
2313 return check;
2314 }
2315 }
2316
2317 /// State shared between JsIrBuilders within the same function. 2013 /// State shared between JsIrBuilders within the same function.
2318 /// 2014 ///
2319 /// Note that this is not shared between builders of nested functions. 2015 /// Note that this is not shared between builders of nested functions.
2320 class JsIrBuilderSharedState { 2016 class JsIrBuilderSharedState {
2321 /// Maps boxed locals to their location. These locals are not part of 2017 /// Maps boxed locals to their location. These locals are not part of
2322 /// the environment. 2018 /// the environment.
2323 final Map<Local, ClosureLocation> boxedVariables = {}; 2019 final Map<Local, ClosureLocation> boxedVariables = {};
2324 2020
2325 /// If non-null, this refers to the receiver (`this`) in the enclosing method. 2021 /// If non-null, this refers to the receiver (`this`) in the enclosing method.
2326 ir.Primitive receiver; 2022 ir.Primitive receiver;
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
2765 final DartType type; 2461 final DartType type;
2766 final LocalVariableElement exceptionVariable; 2462 final LocalVariableElement exceptionVariable;
2767 final LocalVariableElement stackTraceVariable; 2463 final LocalVariableElement stackTraceVariable;
2768 final SubbuildFunction buildCatchBlock; 2464 final SubbuildFunction buildCatchBlock;
2769 2465
2770 CatchClauseInfo({this.type, 2466 CatchClauseInfo({this.type,
2771 this.exceptionVariable, 2467 this.exceptionVariable,
2772 this.stackTraceVariable, 2468 this.stackTraceVariable,
2773 this.buildCatchBlock}); 2469 this.buildCatchBlock});
2774 } 2470 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698