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

Side by Side Diff: pkg/compiler/lib/src/ssa/builder.dart

Issue 2812633002: Decouple LocalsHandler from Compiler and JavaScriptBackend (Closed)
Patch Set: dartfmt Created 3 years, 8 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/ssa/builder_kernel.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) 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 'dart:collection'; 5 import 'dart:collection';
6 6
7 import 'package:js_runtime/shared/embedded_names.dart'; 7 import 'package:js_runtime/shared/embedded_names.dart';
8 8
9 import '../closure.dart'; 9 import '../closure.dart';
10 import '../common.dart'; 10 import '../common.dart';
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 /// Registry used to enqueue work during codegen, may be null to avoid 138 /// Registry used to enqueue work during codegen, may be null to avoid
139 /// enqueing any work. 139 /// enqueing any work.
140 // TODO(sigmund,johnniwinther): get rid of registry entirely. We should be 140 // TODO(sigmund,johnniwinther): get rid of registry entirely. We should be
141 // able to return the impact as a result after building and avoid enqueing 141 // able to return the impact as a result after building and avoid enqueing
142 // things here. Later the codegen task can decide whether to enqueue 142 // things here. Later the codegen task can decide whether to enqueue
143 // something. In the past this didn't matter as much because the SSA graph was 143 // something. In the past this didn't matter as much because the SSA graph was
144 // used only for codegen, but currently we want to experiment using it for 144 // used only for codegen, but currently we want to experiment using it for
145 // code-analysis too. 145 // code-analysis too.
146 final CodegenRegistry registry; 146 final CodegenRegistry registry;
147 147
148 /// All results from the global type-inference analysis.
149 final GlobalTypeInferenceResults inferenceResults;
150
151 /// Results from the global type-inference analysis corresponding to the 148 /// Results from the global type-inference analysis corresponding to the
152 /// current element being visited. 149 /// current element being visited.
153 /// 150 ///
154 /// Invariant: this property is updated together with [resolvedAst]. 151 /// Invariant: this property is updated together with [resolvedAst].
155 GlobalTypeInferenceElementResult elementInferenceResults; 152 GlobalTypeInferenceElementResult elementInferenceResults;
156 153
157 final JavaScriptBackend backend; 154 final JavaScriptBackend backend;
158 final ConstantSystem constantSystem; 155 final ConstantSystem constantSystem;
159 final RuntimeTypesSubstitutions rtiSubstitutions; 156 final RuntimeTypesSubstitutions rtiSubstitutions;
160 157
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 this.target, 195 this.target,
199 this.resolvedAst, 196 this.resolvedAst,
200 this.registry, 197 this.registry,
201 JavaScriptBackend backend, 198 JavaScriptBackend backend,
202 this.closedWorld, 199 this.closedWorld,
203 this.nativeEmitter, 200 this.nativeEmitter,
204 SourceInformationStrategy sourceInformationFactory) 201 SourceInformationStrategy sourceInformationFactory)
205 : this.infoReporter = backend.compiler.dumpInfoTask, 202 : this.infoReporter = backend.compiler.dumpInfoTask,
206 this.backend = backend, 203 this.backend = backend,
207 this.constantSystem = backend.constantSystem, 204 this.constantSystem = backend.constantSystem,
208 this.rtiSubstitutions = backend.rtiSubstitutions, 205 this.rtiSubstitutions = backend.rtiSubstitutions {
209 this.inferenceResults = backend.compiler.globalInference.results {
210 assert(target.isImplementation); 206 assert(target.isImplementation);
211 compiler = backend.compiler; 207 compiler = backend.compiler;
212 elementInferenceResults = _resultOf(target); 208 elementInferenceResults = _resultOf(target);
213 assert(elementInferenceResults != null); 209 assert(elementInferenceResults != null);
214 graph.element = target; 210 graph.element = target;
215 sourceElementStack.add(target); 211 sourceElementStack.add(target);
216 sourceInformationBuilder = 212 sourceInformationBuilder =
217 sourceInformationFactory.createBuilderForContext(resolvedAst); 213 sourceInformationFactory.createBuilderForContext(resolvedAst);
218 graph.sourceInformation = 214 graph.sourceInformation =
219 sourceInformationBuilder.buildVariableDeclaration(); 215 sourceInformationBuilder.buildVariableDeclaration();
220 localsHandler = new LocalsHandler(this, target, null, compiler); 216 localsHandler = new LocalsHandler(
217 this, target, null, backend.nativeData, backend.interceptorData);
221 loopHandler = new SsaLoopHandler(this); 218 loopHandler = new SsaLoopHandler(this);
222 typeBuilder = new TypeBuilder(this); 219 typeBuilder = new TypeBuilder(this);
223 } 220 }
224 221
225 BackendHelpers get helpers => backend.helpers; 222 BackendHelpers get helpers => backend.helpers;
226 223
227 RuntimeTypesEncoder get rtiEncoder => backend.rtiEncoder; 224 RuntimeTypesEncoder get rtiEncoder => backend.rtiEncoder;
228 225
229 Element get targetElement => target; 226 Element get targetElement => target;
230 227
(...skipping 22 matching lines...) Expand all
253 MemberElement get sourceElement => sourceElementStack.last; 250 MemberElement get sourceElement => sourceElementStack.last;
254 251
255 /// Helper to retrieve global inference results for [element] with special 252 /// Helper to retrieve global inference results for [element] with special
256 /// care for `ConstructorBodyElement`s which don't exist at the time the 253 /// care for `ConstructorBodyElement`s which don't exist at the time the
257 /// global analysis run. 254 /// global analysis run.
258 /// 255 ///
259 /// Note: this helper is used selectively. When we know that we are in a 256 /// Note: this helper is used selectively. When we know that we are in a
260 /// context were we don't expect to see a constructor body element, we 257 /// context were we don't expect to see a constructor body element, we
261 /// directly fetch the data from the global inference results. 258 /// directly fetch the data from the global inference results.
262 GlobalTypeInferenceElementResult _resultOf(MemberElement element) => 259 GlobalTypeInferenceElementResult _resultOf(MemberElement element) =>
263 inferenceResults.resultOfMember( 260 globalInferenceResults.resultOfMember(
264 element is ConstructorBodyElementX ? element.constructor : element); 261 element is ConstructorBodyElementX ? element.constructor : element);
265 262
266 /// Build the graph for [target]. 263 /// Build the graph for [target].
267 HGraph build() { 264 HGraph build() {
268 assert(invariant(target, target.isImplementation)); 265 assert(invariant(target, target.isImplementation));
269 HInstruction.idCounter = 0; 266 HInstruction.idCounter = 0;
270 // TODO(sigmund): remove `result` and return graph directly, need to ensure 267 // TODO(sigmund): remove `result` and return graph directly, need to ensure
271 // that it can never be null (see result in buildFactory for instance). 268 // that it can never be null (see result in buildFactory for instance).
272 var result; 269 var result;
273 if (target.isGenerativeConstructor) { 270 if (target.isGenerativeConstructor) {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 // Generative constructors of native classes should not be called directly 447 // Generative constructors of native classes should not be called directly
451 // and have an extra argument that causes problems with inlining. 448 // and have an extra argument that causes problems with inlining.
452 if (function.isGenerativeConstructor && 449 if (function.isGenerativeConstructor &&
453 backend.nativeData.isNativeOrExtendsNative(function.enclosingClass)) { 450 backend.nativeData.isNativeOrExtendsNative(function.enclosingClass)) {
454 return false; 451 return false;
455 } 452 }
456 453
457 // A generative constructor body is not seen by global analysis, 454 // A generative constructor body is not seen by global analysis,
458 // so we should not query for its type. 455 // so we should not query for its type.
459 if (!function.isGenerativeConstructorBody) { 456 if (!function.isGenerativeConstructorBody) {
460 if (inferenceResults.resultOfMember(function).throwsAlways) { 457 if (globalInferenceResults.resultOfMember(function).throwsAlways) {
461 isReachable = false; 458 isReachable = false;
462 return false; 459 return false;
463 } 460 }
464 } 461 }
465 462
466 return true; 463 return true;
467 } 464 }
468 465
469 bool doesNotContainCode() { 466 bool doesNotContainCode() {
470 // A function with size 1 does not contain any code. 467 // A function with size 1 does not contain any code.
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 return false; 581 return false;
585 } 582 }
586 583
587 bool get allInlinedFunctionsCalledOnce { 584 bool get allInlinedFunctionsCalledOnce {
588 return inliningStack.isEmpty || inliningStack.last.allFunctionsCalledOnce; 585 return inliningStack.isEmpty || inliningStack.last.allFunctionsCalledOnce;
589 } 586 }
590 587
591 bool isFunctionCalledOnce(MethodElement element) { 588 bool isFunctionCalledOnce(MethodElement element) {
592 // ConstructorBodyElements are not in the type inference graph. 589 // ConstructorBodyElements are not in the type inference graph.
593 if (element is ConstructorBodyElement) return false; 590 if (element is ConstructorBodyElement) return false;
594 return inferenceResults.resultOfMember(element).isCalledOnce; 591 return globalInferenceResults.resultOfMember(element).isCalledOnce;
595 } 592 }
596 593
597 bool isCalledOnce(MethodElement element) { 594 bool isCalledOnce(MethodElement element) {
598 return allInlinedFunctionsCalledOnce && isFunctionCalledOnce(element); 595 return allInlinedFunctionsCalledOnce && isFunctionCalledOnce(element);
599 } 596 }
600 597
601 inlinedFrom(ResolvedAst resolvedAst, f()) { 598 inlinedFrom(ResolvedAst resolvedAst, f()) {
602 MemberElement element = resolvedAst.element; 599 MemberElement element = resolvedAst.element;
603 assert(element is FunctionElement || element is VariableElement); 600 assert(element is FunctionElement || element is VariableElement);
604 return reporter.withCurrentElement(element.implementation, () { 601 return reporter.withCurrentElement(element.implementation, () {
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 * When inlining a function, [:return:] statements are not emitted as 788 * When inlining a function, [:return:] statements are not emitted as
792 * [HReturn] instructions. Instead, the value of a synthetic element is 789 * [HReturn] instructions. Instead, the value of a synthetic element is
793 * updated in the [localsHandler]. This function creates such an element and 790 * updated in the [localsHandler]. This function creates such an element and
794 * stores it in the [returnLocal] field. 791 * stores it in the [returnLocal] field.
795 */ 792 */
796 void setupStateForInlining( 793 void setupStateForInlining(
797 FunctionElement function, List<HInstruction> compiledArguments, 794 FunctionElement function, List<HInstruction> compiledArguments,
798 {ResolutionInterfaceType instanceType}) { 795 {ResolutionInterfaceType instanceType}) {
799 ResolvedAst resolvedAst = function.resolvedAst; 796 ResolvedAst resolvedAst = function.resolvedAst;
800 assert(resolvedAst != null); 797 assert(resolvedAst != null);
801 localsHandler = new LocalsHandler(this, function, instanceType, compiler); 798 localsHandler = new LocalsHandler(this, function, instanceType,
799 backend.nativeData, backend.interceptorData);
802 localsHandler.closureData = 800 localsHandler.closureData =
803 compiler.closureToClassMapper.getClosureToClassMapping(resolvedAst); 801 closureToClassMapper.getClosureToClassMapping(resolvedAst);
804 returnLocal = new SyntheticLocal("result", function); 802 returnLocal = new SyntheticLocal("result", function);
805 localsHandler.updateLocal(returnLocal, graph.addConstantNull(closedWorld)); 803 localsHandler.updateLocal(returnLocal, graph.addConstantNull(closedWorld));
806 804
807 inTryStatement = false; // TODO(lry): why? Document. 805 inTryStatement = false; // TODO(lry): why? Document.
808 806
809 int argumentIndex = 0; 807 int argumentIndex = 0;
810 if (function.isInstanceMember) { 808 if (function.isInstanceMember) {
811 localsHandler.updateLocal(localsHandler.closureData.thisLocal, 809 localsHandler.updateLocal(localsHandler.closureData.thisLocal,
812 compiledArguments[argumentIndex++]); 810 compiledArguments[argumentIndex++]);
813 } 811 }
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 if (parameter.isInitializingFormal) { 955 if (parameter.isInitializingFormal) {
958 InitializingFormalElement fieldParameterElement = parameter; 956 InitializingFormalElement fieldParameterElement = parameter;
959 fieldValues[fieldParameterElement.fieldElement] = argument; 957 fieldValues[fieldParameterElement.fieldElement] = argument;
960 } 958 }
961 }); 959 });
962 960
963 // Build the initializers in the context of the new constructor. 961 // Build the initializers in the context of the new constructor.
964 ResolvedAst oldResolvedAst = resolvedAst; 962 ResolvedAst oldResolvedAst = resolvedAst;
965 resolvedAst = callee.resolvedAst; 963 resolvedAst = callee.resolvedAst;
966 final oldElementInferenceResults = elementInferenceResults; 964 final oldElementInferenceResults = elementInferenceResults;
967 elementInferenceResults = inferenceResults.resultOfMember(callee); 965 elementInferenceResults = globalInferenceResults.resultOfMember(callee);
968 ClosureClassMap oldClosureData = localsHandler.closureData; 966 ClosureClassMap oldClosureData = localsHandler.closureData;
969 ClosureClassMap newClosureData = 967 ClosureClassMap newClosureData =
970 compiler.closureToClassMapper.getClosureToClassMapping(resolvedAst); 968 closureToClassMapper.getClosureToClassMapping(resolvedAst);
971 localsHandler.closureData = newClosureData; 969 localsHandler.closureData = newClosureData;
972 if (resolvedAst.kind == ResolvedAstKind.PARSED) { 970 if (resolvedAst.kind == ResolvedAstKind.PARSED) {
973 localsHandler.enterScope(resolvedAst.node, callee); 971 localsHandler.enterScope(resolvedAst.node, callee);
974 } 972 }
975 buildInitializers(callee, constructorResolvedAsts, fieldValues); 973 buildInitializers(callee, constructorResolvedAsts, fieldValues);
976 localsHandler.closureData = oldClosureData; 974 localsHandler.closureData = oldClosureData;
977 resolvedAst = oldResolvedAst; 975 resolvedAst = oldResolvedAst;
978 elementInferenceResults = oldElementInferenceResults; 976 elementInferenceResults = oldElementInferenceResults;
979 }); 977 });
980 } 978 }
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 // Unassigned fields of native classes are not initialized to 1130 // Unassigned fields of native classes are not initialized to
1133 // prevent overwriting pre-initialized native properties. 1131 // prevent overwriting pre-initialized native properties.
1134 if (!backend.nativeData.isNativeOrExtendsNative(classElement)) { 1132 if (!backend.nativeData.isNativeOrExtendsNative(classElement)) {
1135 fieldValues[member] = graph.addConstantNull(closedWorld); 1133 fieldValues[member] = graph.addConstantNull(closedWorld);
1136 } 1134 }
1137 } else { 1135 } else {
1138 ast.Node right = initializer; 1136 ast.Node right = initializer;
1139 ResolvedAst savedResolvedAst = resolvedAst; 1137 ResolvedAst savedResolvedAst = resolvedAst;
1140 resolvedAst = fieldResolvedAst; 1138 resolvedAst = fieldResolvedAst;
1141 final oldElementInferenceResults = elementInferenceResults; 1139 final oldElementInferenceResults = elementInferenceResults;
1142 elementInferenceResults = inferenceResults.resultOfMember(member); 1140 elementInferenceResults =
1141 globalInferenceResults.resultOfMember(member);
1143 // In case the field initializer uses closures, run the 1142 // In case the field initializer uses closures, run the
1144 // closure to class mapper. 1143 // closure to class mapper.
1145 compiler.closureToClassMapper.getClosureToClassMapping(resolvedAst); 1144 closureToClassMapper.getClosureToClassMapping(resolvedAst);
1146 inlinedFrom(fieldResolvedAst, () => right.accept(this)); 1145 inlinedFrom(fieldResolvedAst, () => right.accept(this));
1147 resolvedAst = savedResolvedAst; 1146 resolvedAst = savedResolvedAst;
1148 elementInferenceResults = oldElementInferenceResults; 1147 elementInferenceResults = oldElementInferenceResults;
1149 fieldValues[member] = pop(); 1148 fieldValues[member] = pop();
1150 } 1149 }
1151 }); 1150 });
1152 }); 1151 });
1153 } 1152 }
1154 1153
1155 /** 1154 /**
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 List bodyCallInputs = <HInstruction>[]; 1296 List bodyCallInputs = <HInstruction>[];
1298 if (isNativeUpgradeFactory) { 1297 if (isNativeUpgradeFactory) {
1299 if (interceptor == null) { 1298 if (interceptor == null) {
1300 ConstantValue constant = new InterceptorConstantValue(classElement); 1299 ConstantValue constant = new InterceptorConstantValue(classElement);
1301 interceptor = graph.addConstant(constant, closedWorld); 1300 interceptor = graph.addConstant(constant, closedWorld);
1302 } 1301 }
1303 bodyCallInputs.add(interceptor); 1302 bodyCallInputs.add(interceptor);
1304 } 1303 }
1305 bodyCallInputs.add(newObject); 1304 bodyCallInputs.add(newObject);
1306 ast.Node node = constructorResolvedAst.node; 1305 ast.Node node = constructorResolvedAst.node;
1307 ClosureClassMap parameterClosureData = compiler.closureToClassMapper 1306 ClosureClassMap parameterClosureData =
1308 .getClosureToClassMapping(constructorResolvedAst); 1307 closureToClassMapper.getClosureToClassMapping(constructorResolvedAst);
1309 1308
1310 FunctionSignature functionSignature = body.functionSignature; 1309 FunctionSignature functionSignature = body.functionSignature;
1311 // Provide the parameters to the generative constructor body. 1310 // Provide the parameters to the generative constructor body.
1312 functionSignature.orderedForEachParameter((ParameterElement parameter) { 1311 functionSignature.orderedForEachParameter((ParameterElement parameter) {
1313 // If [parameter] is boxed, it will be a field in the box passed as the 1312 // If [parameter] is boxed, it will be a field in the box passed as the
1314 // last parameter. So no need to directly pass it. 1313 // last parameter. So no need to directly pass it.
1315 if (!localsHandler.isBoxed(parameter)) { 1314 if (!localsHandler.isBoxed(parameter)) {
1316 bodyCallInputs.add(localsHandler.readLocal(parameter)); 1315 bodyCallInputs.add(localsHandler.readLocal(parameter));
1317 } 1316 }
1318 }); 1317 });
(...skipping 1669 matching lines...) Expand 10 before | Expand all | Expand 10 after
2988 // Until now we only handle these as getters. 2987 // Until now we only handle these as getters.
2989 invariant(node, deferredLoader.isDeferredLoaderGetter); 2988 invariant(node, deferredLoader.isDeferredLoaderGetter);
2990 FunctionEntity loadFunction = helpers.loadLibraryWrapper; 2989 FunctionEntity loadFunction = helpers.loadLibraryWrapper;
2991 PrefixElement prefixElement = deferredLoader.enclosingElement; 2990 PrefixElement prefixElement = deferredLoader.enclosingElement;
2992 String loadId = 2991 String loadId =
2993 compiler.deferredLoadTask.getImportDeferName(node, prefixElement); 2992 compiler.deferredLoadTask.getImportDeferName(node, prefixElement);
2994 var inputs = [ 2993 var inputs = [
2995 graph.addConstantString(new ast.DartString.literal(loadId), closedWorld) 2994 graph.addConstantString(new ast.DartString.literal(loadId), closedWorld)
2996 ]; 2995 ];
2997 push(new HInvokeStatic(loadFunction, inputs, commonMasks.nonNullType, 2996 push(new HInvokeStatic(loadFunction, inputs, commonMasks.nonNullType,
2998 targetCanThrow: false)..sourceInformation = sourceInformation); 2997 targetCanThrow: false)
2998 ..sourceInformation = sourceInformation);
2999 } 2999 }
3000 3000
3001 generateSuperNoSuchMethodSend( 3001 generateSuperNoSuchMethodSend(
3002 ast.Send node, Selector selector, List<HInstruction> arguments) { 3002 ast.Send node, Selector selector, List<HInstruction> arguments) {
3003 String name = selector.name; 3003 String name = selector.name;
3004 3004
3005 ClassElement cls = currentNonClosureClass; 3005 ClassElement cls = currentNonClosureClass;
3006 MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_); 3006 MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_);
3007 if (!Selectors.noSuchMethod_.signatureApplies(element)) { 3007 if (!Selectors.noSuchMethod_.signatureApplies(element)) {
3008 ClassElement objectClass = commonElements.objectClass; 3008 ClassElement objectClass = commonElements.objectClass;
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
3424 var constant = inputs[0]; 3424 var constant = inputs[0];
3425 int value = constant.constant.primitiveValue; 3425 int value = constant.constant.primitiveValue;
3426 if (0 <= value && value < 0x100000000) canThrow = false; 3426 if (0 <= value && value < 0x100000000) canThrow = false;
3427 } 3427 }
3428 HForeignCode foreign = new HForeignCode(code, elementType, inputs, 3428 HForeignCode foreign = new HForeignCode(code, elementType, inputs,
3429 nativeBehavior: behavior, 3429 nativeBehavior: behavior,
3430 throwBehavior: canThrow 3430 throwBehavior: canThrow
3431 ? native.NativeThrowBehavior.MAY 3431 ? native.NativeThrowBehavior.MAY
3432 : native.NativeThrowBehavior.NEVER); 3432 : native.NativeThrowBehavior.NEVER);
3433 push(foreign); 3433 push(foreign);
3434 if (inferenceResults.isFixedArrayCheckedForGrowable(send)) { 3434 if (globalInferenceResults.isFixedArrayCheckedForGrowable(send)) {
3435 js.Template code = js.js.parseForeignJS(r'#.fixed$length = Array'); 3435 js.Template code = js.js.parseForeignJS(r'#.fixed$length = Array');
3436 // We set the instruction as [canThrow] to avoid it being dead code. 3436 // We set the instruction as [canThrow] to avoid it being dead code.
3437 // We need a finer grained side effect. 3437 // We need a finer grained side effect.
3438 add(new HForeignCode(code, commonMasks.nullType, [stack.last], 3438 add(new HForeignCode(code, commonMasks.nullType, [stack.last],
3439 throwBehavior: native.NativeThrowBehavior.MAY)); 3439 throwBehavior: native.NativeThrowBehavior.MAY));
3440 } 3440 }
3441 } else if (isGrowableListConstructorCall) { 3441 } else if (isGrowableListConstructorCall) {
3442 push(buildLiteralList(<HInstruction>[])); 3442 push(buildLiteralList(<HInstruction>[]));
3443 stack.last.instructionType = elementType; 3443 stack.last.instructionType = elementType;
3444 } else { 3444 } else {
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
4089 } else if (element.isSetter) { 4089 } else if (element.isSetter) {
4090 code = "# = #"; 4090 code = "# = #";
4091 } else { 4091 } else {
4092 var args = new List.filled(arguments.length, '#').join(','); 4092 var args = new List.filled(arguments.length, '#').join(',');
4093 code = element.isConstructor ? "new #($args)" : "#($args)"; 4093 code = element.isConstructor ? "new #($args)" : "#($args)";
4094 } 4094 }
4095 js.Template codeTemplate = js.js.parseForeignJS(code); 4095 js.Template codeTemplate = js.js.parseForeignJS(code);
4096 nativeBehavior.codeTemplate = codeTemplate; 4096 nativeBehavior.codeTemplate = codeTemplate;
4097 4097
4098 return new HForeignCode(codeTemplate, commonMasks.dynamicType, inputs, 4098 return new HForeignCode(codeTemplate, commonMasks.dynamicType, inputs,
4099 nativeBehavior: nativeBehavior)..sourceInformation = sourceInformation; 4099 nativeBehavior: nativeBehavior)
4100 ..sourceInformation = sourceInformation;
4100 } 4101 }
4101 4102
4102 void pushInvokeStatic( 4103 void pushInvokeStatic(
4103 ast.Node location, MethodElement element, List<HInstruction> arguments, 4104 ast.Node location, MethodElement element, List<HInstruction> arguments,
4104 {TypeMask typeMask, 4105 {TypeMask typeMask,
4105 ResolutionInterfaceType instanceType, 4106 ResolutionInterfaceType instanceType,
4106 SourceInformation sourceInformation}) { 4107 SourceInformation sourceInformation}) {
4107 assert(element.isDeclaration); 4108 assert(element.isDeclaration);
4108 // TODO(johnniwinther): Use [sourceInformation] instead of [location]. 4109 // TODO(johnniwinther): Use [sourceInformation] instead of [location].
4109 if (tryInlineMethod(element, null, null, arguments, location, 4110 if (tryInlineMethod(element, null, null, arguments, location,
(...skipping 2644 matching lines...) Expand 10 before | Expand all | Expand 10 after
6754 this.oldReturnLocal, 6755 this.oldReturnLocal,
6755 this.oldReturnType, 6756 this.oldReturnType,
6756 this.oldResolvedAst, 6757 this.oldResolvedAst,
6757 this.oldStack, 6758 this.oldStack,
6758 this.oldLocalsHandler, 6759 this.oldLocalsHandler,
6759 this.inTryStatement, 6760 this.inTryStatement,
6760 this.allFunctionsCalledOnce, 6761 this.allFunctionsCalledOnce,
6761 this.oldElementInferenceResults) 6762 this.oldElementInferenceResults)
6762 : super(function); 6763 : super(function);
6763 } 6764 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/builder_kernel.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698