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

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

Issue 2265473004: Introduce "CommonElements" (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 4 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) 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 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 /// might not be in scope or from the current instance. 199 /// might not be in scope or from the current instance.
200 /// 200 ///
201 final InterfaceType instanceType; 201 final InterfaceType instanceType;
202 202
203 SourceInformationBuilder get sourceInformationBuilder { 203 SourceInformationBuilder get sourceInformationBuilder {
204 return builder.sourceInformationBuilder; 204 return builder.sourceInformationBuilder;
205 } 205 }
206 206
207 LocalsHandler( 207 LocalsHandler(
208 this.builder, this.executableContext, InterfaceType instanceType) 208 this.builder, this.executableContext, InterfaceType instanceType)
209 : this.instanceType = 209 : this.instanceType = instanceType == null ||
210 instanceType == null || instanceType.containsTypeVariables 210 instanceType.containsTypeVariables ? null : instanceType;
211 ? null
212 : instanceType;
213 211
214 /// Substituted type variables occurring in [type] into the context of 212 /// Substituted type variables occurring in [type] into the context of
215 /// [contextClass]. 213 /// [contextClass].
216 DartType substInContext(DartType type) { 214 DartType substInContext(DartType type) {
217 if (contextClass != null) { 215 if (contextClass != null) {
218 ClassElement typeContext = Types.getClassContext(type); 216 ClassElement typeContext = Types.getClassContext(type);
219 if (typeContext != null) { 217 if (typeContext != null) {
220 type = type.substByContext(contextClass.asInstanceOf(typeContext)); 218 type = type.substByContext(contextClass.asInstanceOf(typeContext));
221 } 219 }
222 } 220 }
(...skipping 4242 matching lines...) Expand 10 before | Expand all | Expand 10 after
4465 handleJsStringConcat(node); 4463 handleJsStringConcat(node);
4466 } else { 4464 } else {
4467 reporter.internalError(node, "Unknown foreign: ${element}"); 4465 reporter.internalError(node, "Unknown foreign: ${element}");
4468 } 4466 }
4469 } 4467 }
4470 4468
4471 generateDeferredLoaderGet(ast.Send node, FunctionElement deferredLoader, 4469 generateDeferredLoaderGet(ast.Send node, FunctionElement deferredLoader,
4472 SourceInformation sourceInformation) { 4470 SourceInformation sourceInformation) {
4473 // Until now we only handle these as getters. 4471 // Until now we only handle these as getters.
4474 invariant(node, deferredLoader.isDeferredLoaderGetter); 4472 invariant(node, deferredLoader.isDeferredLoaderGetter);
4475 Element loadFunction = compiler.loadLibraryFunction; 4473 Element loadFunction = helpers.loadLibraryWrapper;
4476 PrefixElement prefixElement = deferredLoader.enclosingElement; 4474 PrefixElement prefixElement = deferredLoader.enclosingElement;
4477 String loadId = 4475 String loadId =
4478 compiler.deferredLoadTask.getImportDeferName(node, prefixElement); 4476 compiler.deferredLoadTask.getImportDeferName(node, prefixElement);
4479 var inputs = [ 4477 var inputs = [
4480 graph.addConstantString(new ast.DartString.literal(loadId), compiler) 4478 graph.addConstantString(new ast.DartString.literal(loadId), compiler)
4481 ]; 4479 ];
4482 push(new HInvokeStatic(loadFunction, inputs, backend.nonNullType, 4480 push(new HInvokeStatic(loadFunction, inputs, backend.nonNullType,
4483 targetCanThrow: false)..sourceInformation = sourceInformation); 4481 targetCanThrow: false)..sourceInformation = sourceInformation);
4484 } 4482 }
4485 4483
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
4930 } 4928 }
4931 } 4929 }
4932 4930
4933 Element constructor = elements[send]; 4931 Element constructor = elements[send];
4934 CallStructure callStructure = elements.getSelector(send).callStructure; 4932 CallStructure callStructure = elements.getSelector(send).callStructure;
4935 ConstructorElement constructorDeclaration = constructor; 4933 ConstructorElement constructorDeclaration = constructor;
4936 ConstructorElement constructorImplementation = constructor.implementation; 4934 ConstructorElement constructorImplementation = constructor.implementation;
4937 constructor = constructorImplementation.effectiveTarget; 4935 constructor = constructorImplementation.effectiveTarget;
4938 4936
4939 final bool isSymbolConstructor = 4937 final bool isSymbolConstructor =
4940 constructorDeclaration == compiler.symbolConstructor; 4938 compiler.commonElements.isSymbolConstructor(constructorDeclaration);
4941 final bool isJSArrayTypedConstructor = 4939 final bool isJSArrayTypedConstructor =
4942 constructorDeclaration == helpers.jsArrayTypedConstructor; 4940 constructorDeclaration == helpers.jsArrayTypedConstructor;
4943 4941
4944 if (isSymbolConstructor) { 4942 if (isSymbolConstructor) {
4945 constructor = helpers.symbolValidatedConstructor; 4943 constructor = helpers.symbolValidatedConstructor;
4946 assert(invariant(send, constructor != null, 4944 assert(invariant(send, constructor != null,
4947 message: 'Constructor Symbol.validated is missing')); 4945 message: 'Constructor Symbol.validated is missing'));
4948 callStructure = helpers.symbolValidatedConstructorSelector.callStructure; 4946 callStructure = helpers.symbolValidatedConstructorSelector.callStructure;
4949 assert(invariant(send, callStructure != null, 4947 assert(invariant(send, callStructure != null,
4950 message: 'Constructor Symbol.validated is missing')); 4948 message: 'Constructor Symbol.validated is missing'));
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
5163 visitStaticSend(ast.Send node) { 5161 visitStaticSend(ast.Send node) {
5164 internalError(node, "Unexpected visitStaticSend"); 5162 internalError(node, "Unexpected visitStaticSend");
5165 } 5163 }
5166 5164
5167 /// Generate an invocation to the static or top level [function]. 5165 /// Generate an invocation to the static or top level [function].
5168 void generateStaticFunctionInvoke( 5166 void generateStaticFunctionInvoke(
5169 ast.Send node, FunctionElement function, CallStructure callStructure) { 5167 ast.Send node, FunctionElement function, CallStructure callStructure) {
5170 List<HInstruction> inputs = makeStaticArgumentList( 5168 List<HInstruction> inputs = makeStaticArgumentList(
5171 callStructure, node.arguments, function.implementation); 5169 callStructure, node.arguments, function.implementation);
5172 5170
5173 if (function == compiler.identicalFunction) { 5171 if (function == compiler.commonElements.identicalFunction) {
5174 pushWithPosition( 5172 pushWithPosition(
5175 new HIdentity(inputs[0], inputs[1], null, backend.boolType), node); 5173 new HIdentity(inputs[0], inputs[1], null, backend.boolType), node);
5176 return; 5174 return;
5177 } else { 5175 } else {
5178 pushInvokeStatic(node, function, inputs, 5176 pushInvokeStatic(node, function, inputs,
5179 sourceInformation: 5177 sourceInformation:
5180 sourceInformationBuilder.buildCall(node, node.selector)); 5178 sourceInformationBuilder.buildCall(node, node.selector));
5181 } 5179 }
5182 } 5180 }
5183 5181
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
5487 } 5485 }
5488 5486
5489 @override 5487 @override
5490 void bulkHandleNode(ast.Node node, String message, _) { 5488 void bulkHandleNode(ast.Node node, String message, _) {
5491 internalError(node, "Unexpected bulk handled node: $node"); 5489 internalError(node, "Unexpected bulk handled node: $node");
5492 } 5490 }
5493 5491
5494 @override 5492 @override
5495 void bulkHandleNew(ast.NewExpression node, [_]) { 5493 void bulkHandleNew(ast.NewExpression node, [_]) {
5496 Element element = elements[node.send]; 5494 Element element = elements[node.send];
5497 final bool isSymbolConstructor = element == compiler.symbolConstructor; 5495 final bool isSymbolConstructor =
5496 element == compiler.commonElements.symbolConstructor;
5498 if (!Elements.isMalformed(element)) { 5497 if (!Elements.isMalformed(element)) {
5499 ConstructorElement function = element; 5498 ConstructorElement function = element;
5500 element = function.effectiveTarget; 5499 element = function.effectiveTarget;
5501 } 5500 }
5502 if (Elements.isError(element)) { 5501 if (Elements.isError(element)) {
5503 ErroneousElement error = element; 5502 ErroneousElement error = element;
5504 if (error.messageKind == MessageKind.CANNOT_FIND_CONSTRUCTOR || 5503 if (error.messageKind == MessageKind.CANNOT_FIND_CONSTRUCTOR ||
5505 error.messageKind == MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR) { 5504 error.messageKind == MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR) {
5506 generateThrowNoSuchMethod( 5505 generateThrowNoSuchMethod(
5507 node.send, noSuchMethodTargetSymbolString(error, 'constructor'), 5506 node.send, noSuchMethodTargetSymbolString(error, 'constructor'),
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
5663 5662
5664 var nativeBehavior = new native.NativeBehavior() 5663 var nativeBehavior = new native.NativeBehavior()
5665 ..sideEffects.setAllSideEffects(); 5664 ..sideEffects.setAllSideEffects();
5666 5665
5667 DartType type = element.isConstructor 5666 DartType type = element.isConstructor
5668 ? element.enclosingClass.thisType 5667 ? element.enclosingClass.thisType
5669 : element.type.returnType; 5668 : element.type.returnType;
5670 // Native behavior effects here are similar to native/behavior.dart. 5669 // Native behavior effects here are similar to native/behavior.dart.
5671 // The return type is dynamic if we don't trust js-interop type 5670 // The return type is dynamic if we don't trust js-interop type
5672 // declarations. 5671 // declarations.
5673 nativeBehavior.typesReturned.add( 5672 nativeBehavior.typesReturned.add(compiler
5674 compiler.options.trustJSInteropTypeAnnotations 5673 .options.trustJSInteropTypeAnnotations ? type : const DynamicType());
5675 ? type
5676 : const DynamicType());
5677 5674
5678 // The allocation effects include the declared type if it is native (which 5675 // The allocation effects include the declared type if it is native (which
5679 // includes js interop types). 5676 // includes js interop types).
5680 if (type.element != null && backend.isNative(type.element)) { 5677 if (type.element != null && backend.isNative(type.element)) {
5681 nativeBehavior.typesInstantiated.add(type); 5678 nativeBehavior.typesInstantiated.add(type);
5682 } 5679 }
5683 5680
5684 // It also includes any other JS interop type if we don't trust the 5681 // It also includes any other JS interop type if we don't trust the
5685 // annotation or if is declared too broad. 5682 // annotation or if is declared too broad.
5686 if (!compiler.options.trustJSInteropTypeAnnotations || 5683 if (!compiler.options.trustJSInteropTypeAnnotations ||
(...skipping 2968 matching lines...) Expand 10 before | Expand all | Expand 10 after
8655 const _LoopTypeVisitor(); 8652 const _LoopTypeVisitor();
8656 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP; 8653 int visitNode(ast.Node node) => HLoopBlockInformation.NOT_A_LOOP;
8657 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP; 8654 int visitWhile(ast.While node) => HLoopBlockInformation.WHILE_LOOP;
8658 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP; 8655 int visitFor(ast.For node) => HLoopBlockInformation.FOR_LOOP;
8659 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP; 8656 int visitDoWhile(ast.DoWhile node) => HLoopBlockInformation.DO_WHILE_LOOP;
8660 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; 8657 int visitAsyncForIn(ast.AsyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP;
8661 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP; 8658 int visitSyncForIn(ast.SyncForIn node) => HLoopBlockInformation.FOR_IN_LOOP;
8662 int visitSwitchStatement(ast.SwitchStatement node) => 8659 int visitSwitchStatement(ast.SwitchStatement node) =>
8663 HLoopBlockInformation.SWITCH_CONTINUE_LOOP; 8660 HLoopBlockInformation.SWITCH_CONTINUE_LOOP;
8664 } 8661 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698