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

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

Issue 1424923004: Add StaticUse for more precise registration of statically known element use. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month 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 | « pkg/compiler/lib/src/resolution/resolution.dart ('k') | pkg/compiler/lib/src/ssa/codegen.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 part of ssa; 5 part of ssa;
6 6
7 class SsaFunctionCompiler implements FunctionCompiler { 7 class SsaFunctionCompiler implements FunctionCompiler {
8 final SsaCodeGeneratorTask generator; 8 final SsaCodeGeneratorTask generator;
9 final SsaBuilderTask builder; 9 final SsaBuilderTask builder;
10 final SsaOptimizerTask optimizer; 10 final SsaOptimizerTask optimizer;
(...skipping 3218 matching lines...) Expand 10 before | Expand all | Expand 10 after
3229 ClosureClassMap nestedClosureData = 3229 ClosureClassMap nestedClosureData =
3230 compiler.closureToClassMapper.getMappingForNestedFunction(node); 3230 compiler.closureToClassMapper.getMappingForNestedFunction(node);
3231 assert(nestedClosureData != null); 3231 assert(nestedClosureData != null);
3232 assert(nestedClosureData.closureClassElement != null); 3232 assert(nestedClosureData.closureClassElement != null);
3233 ClosureClassElement closureClassElement = 3233 ClosureClassElement closureClassElement =
3234 nestedClosureData.closureClassElement; 3234 nestedClosureData.closureClassElement;
3235 FunctionElement callElement = nestedClosureData.callElement; 3235 FunctionElement callElement = nestedClosureData.callElement;
3236 // TODO(ahe): This should be registered in codegen, not here. 3236 // TODO(ahe): This should be registered in codegen, not here.
3237 // TODO(johnniwinther): Is [registerStaticUse] equivalent to 3237 // TODO(johnniwinther): Is [registerStaticUse] equivalent to
3238 // [addToWorkList]? 3238 // [addToWorkList]?
3239 registry?.registerStaticUse(callElement); 3239 registry?.registerStaticUse(new StaticUse.foreignUse(callElement));
3240 3240
3241 List<HInstruction> capturedVariables = <HInstruction>[]; 3241 List<HInstruction> capturedVariables = <HInstruction>[];
3242 closureClassElement.closureFields.forEach((ClosureFieldElement field) { 3242 closureClassElement.closureFields.forEach((ClosureFieldElement field) {
3243 Local capturedLocal = 3243 Local capturedLocal =
3244 nestedClosureData.getLocalVariableForClosureField(field); 3244 nestedClosureData.getLocalVariableForClosureField(field);
3245 assert(capturedLocal != null); 3245 assert(capturedLocal != null);
3246 capturedVariables.add(localsHandler.readLocal(capturedLocal)); 3246 capturedVariables.add(localsHandler.readLocal(capturedLocal));
3247 }); 3247 });
3248 3248
3249 TypeMask type = 3249 TypeMask type =
(...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after
4437 // TODO(johnniwinther): Try to eliminate the need to distinguish declaration 4437 // TODO(johnniwinther): Try to eliminate the need to distinguish declaration
4438 // and implementation signatures. Currently it is need because the 4438 // and implementation signatures. Currently it is need because the
4439 // signatures have different elements for parameters. 4439 // signatures have different elements for parameters.
4440 FunctionElement implementation = function.implementation; 4440 FunctionElement implementation = function.implementation;
4441 FunctionSignature params = implementation.functionSignature; 4441 FunctionSignature params = implementation.functionSignature;
4442 if (params.optionalParameterCount != 0) { 4442 if (params.optionalParameterCount != 0) {
4443 reporter.internalError(closure, 4443 reporter.internalError(closure,
4444 '"$name" does not handle closure with optional parameters.'); 4444 '"$name" does not handle closure with optional parameters.');
4445 } 4445 }
4446 4446
4447 registry?.registerStaticUse(element); 4447 registry?.registerStaticUse(
4448 new StaticUse.foreignUse(function));
4448 push(new HForeignCode( 4449 push(new HForeignCode(
4449 js.js.expressionTemplateYielding( 4450 js.js.expressionTemplateYielding(
4450 backend.emitter.staticFunctionAccess(element)), 4451 backend.emitter.staticFunctionAccess(function)),
4451 backend.dynamicType, 4452 backend.dynamicType,
4452 <HInstruction>[], 4453 <HInstruction>[],
4453 nativeBehavior: native.NativeBehavior.PURE)); 4454 nativeBehavior: native.NativeBehavior.PURE));
4454 return params; 4455 return params;
4455 } 4456 }
4456 4457
4457 void handleForeignDartClosureToJs(ast.Send node, String name) { 4458 void handleForeignDartClosureToJs(ast.Send node, String name) {
4458 // TODO(ahe): This implements DART_CLOSURE_TO_JS and should probably take 4459 // TODO(ahe): This implements DART_CLOSURE_TO_JS and should probably take
4459 // care to wrap the closure in another closure that saves the current 4460 // care to wrap the closure in another closure that saves the current
4460 // isolate. 4461 // isolate.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
4543 List<HInstruction> arguments) { 4544 List<HInstruction> arguments) {
4544 String name = selector.name; 4545 String name = selector.name;
4545 4546
4546 ClassElement cls = currentNonClosureClass; 4547 ClassElement cls = currentNonClosureClass;
4547 Element element = cls.lookupSuperMember(Identifiers.noSuchMethod_); 4548 Element element = cls.lookupSuperMember(Identifiers.noSuchMethod_);
4548 if (compiler.enabledInvokeOn && !element.enclosingClass.isObject) { 4549 if (compiler.enabledInvokeOn && !element.enclosingClass.isObject) {
4549 // Register the call as dynamic if [noSuchMethod] on the super 4550 // Register the call as dynamic if [noSuchMethod] on the super
4550 // class is _not_ the default implementation from [Object], in 4551 // class is _not_ the default implementation from [Object], in
4551 // case the [noSuchMethod] implementation calls 4552 // case the [noSuchMethod] implementation calls
4552 // [JSInvocationMirror._invokeOn]. 4553 // [JSInvocationMirror._invokeOn].
4553 registry?.registerSelectorUse(selector); 4554 // TODO(johnniwinther): Register this more precisely.
4555 registry?.registerDynamicUse(new UniverseSelector(selector, null));
4554 } 4556 }
4555 String publicName = name; 4557 String publicName = name;
4556 if (selector.isSetter) publicName += '='; 4558 if (selector.isSetter) publicName += '=';
4557 4559
4558 ConstantValue nameConstant = constantSystem.createString( 4560 ConstantValue nameConstant = constantSystem.createString(
4559 new ast.DartString.literal(publicName)); 4561 new ast.DartString.literal(publicName));
4560 4562
4561 js.Name internalName = backend.namer.invocationName(selector); 4563 js.Name internalName = backend.namer.invocationName(selector);
4562 4564
4563 Element createInvocationMirror = helpers.createInvocationMirror; 4565 Element createInvocationMirror = helpers.createInvocationMirror;
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
4982 HInstruction newObject) { 4984 HInstruction newObject) {
4983 if (!backend.classNeedsRti(type.element) || type.treatAsRaw) { 4985 if (!backend.classNeedsRti(type.element) || type.treatAsRaw) {
4984 return newObject; 4986 return newObject;
4985 } 4987 }
4986 List<HInstruction> inputs = <HInstruction>[]; 4988 List<HInstruction> inputs = <HInstruction>[];
4987 type = localsHandler.substInContext(type); 4989 type = localsHandler.substInContext(type);
4988 type.typeArguments.forEach((DartType argument) { 4990 type.typeArguments.forEach((DartType argument) {
4989 inputs.add(analyzeTypeArgument(argument)); 4991 inputs.add(analyzeTypeArgument(argument));
4990 }); 4992 });
4991 // TODO(15489): Register at codegen. 4993 // TODO(15489): Register at codegen.
4992 registry?.registerInstantiatedType(type); 4994 registry?.registerInstantiation(type);
4993 return callSetRuntimeTypeInfo(type.element, inputs, newObject); 4995 return callSetRuntimeTypeInfo(type.element, inputs, newObject);
4994 } 4996 }
4995 4997
4996 void copyRuntimeTypeInfo(HInstruction source, HInstruction target) { 4998 void copyRuntimeTypeInfo(HInstruction source, HInstruction target) {
4997 Element copyHelper = helpers.copyTypeArguments; 4999 Element copyHelper = helpers.copyTypeArguments;
4998 pushInvokeStatic(null, copyHelper, [source, target], 5000 pushInvokeStatic(null, copyHelper, [source, target],
4999 sourceInformation: target.sourceInformation); 5001 sourceInformation: target.sourceInformation);
5000 pop(); 5002 pop();
5001 } 5003 }
5002 5004
(...skipping 2236 matching lines...) Expand 10 before | Expand all | Expand 10 after
7239 HInstruction setRtiIfNeeded(HInstruction object, ast.Node node) { 7241 HInstruction setRtiIfNeeded(HInstruction object, ast.Node node) {
7240 InterfaceType type = localsHandler.substInContext(elements.getType(node)); 7242 InterfaceType type = localsHandler.substInContext(elements.getType(node));
7241 if (!backend.classNeedsRti(type.element) || type.treatAsRaw) { 7243 if (!backend.classNeedsRti(type.element) || type.treatAsRaw) {
7242 return object; 7244 return object;
7243 } 7245 }
7244 List<HInstruction> arguments = <HInstruction>[]; 7246 List<HInstruction> arguments = <HInstruction>[];
7245 for (DartType argument in type.typeArguments) { 7247 for (DartType argument in type.typeArguments) {
7246 arguments.add(analyzeTypeArgument(argument)); 7248 arguments.add(analyzeTypeArgument(argument));
7247 } 7249 }
7248 // TODO(15489): Register at codegen. 7250 // TODO(15489): Register at codegen.
7249 registry?.registerInstantiatedType(type); 7251 registry?.registerInstantiation(type);
7250 return callSetRuntimeTypeInfo(type.element, arguments, object); 7252 return callSetRuntimeTypeInfo(type.element, arguments, object);
7251 } 7253 }
7252 7254
7253 visitLiteralList(ast.LiteralList node) { 7255 visitLiteralList(ast.LiteralList node) {
7254 HInstruction instruction; 7256 HInstruction instruction;
7255 7257
7256 if (node.isConst) { 7258 if (node.isConst) {
7257 instruction = addConstant(node); 7259 instruction = addConstant(node);
7258 } else { 7260 } else {
7259 List<HInstruction> inputs = <HInstruction>[]; 7261 List<HInstruction> inputs = <HInstruction>[];
(...skipping 1882 matching lines...) Expand 10 before | Expand all | Expand 10 after
9142 if (unaliased is TypedefType) throw 'unable to unalias $type'; 9144 if (unaliased is TypedefType) throw 'unable to unalias $type';
9143 unaliased.accept(this, builder); 9145 unaliased.accept(this, builder);
9144 } 9146 }
9145 9147
9146 void visitDynamicType(DynamicType type, SsaBuilder builder) { 9148 void visitDynamicType(DynamicType type, SsaBuilder builder) {
9147 JavaScriptBackend backend = builder.compiler.backend; 9149 JavaScriptBackend backend = builder.compiler.backend;
9148 ClassElement cls = backend.helpers.DynamicRuntimeType; 9150 ClassElement cls = backend.helpers.DynamicRuntimeType;
9149 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld))); 9151 builder.push(new HDynamicType(type, new TypeMask.exact(cls, classWorld)));
9150 } 9152 }
9151 } 9153 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/resolution.dart ('k') | pkg/compiler/lib/src/ssa/codegen.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698