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/kernel_impact.dart

Issue 2651803003: Introduce KernelWorldBuilder (Closed)
Patch Set: dartfmt Created 3 years, 11 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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/names.dart'; 8 import '../common/names.dart';
9 import '../compiler.dart'; 9 import '../compiler.dart';
10 import '../constants/expressions.dart'; 10 import '../constants/expressions.dart';
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 }); 61 });
62 } 62 }
63 63
64 class KernelImpactBuilder extends ir.Visitor { 64 class KernelImpactBuilder extends ir.Visitor {
65 final ResolvedAst resolvedAst; 65 final ResolvedAst resolvedAst;
66 final Compiler compiler; 66 final Compiler compiler;
67 67
68 JavaScriptBackend get backend => compiler.backend; 68 JavaScriptBackend get backend => compiler.backend;
69 69
70 ResolutionWorldImpactBuilder impactBuilder; 70 ResolutionWorldImpactBuilder impactBuilder;
71 KernelAstAdapter astAdapter; 71 KernelWorldBuilder astAdapter;
72 72
73 KernelImpactBuilder(this.resolvedAst, this.compiler, Kernel kernel) { 73 KernelImpactBuilder(this.resolvedAst, this.compiler, Kernel kernel) {
74 this.impactBuilder = 74 this.impactBuilder =
75 new ResolutionWorldImpactBuilder('${resolvedAst.element}'); 75 new ResolutionWorldImpactBuilder('${resolvedAst.element}');
76 this.astAdapter = new KernelAstAdapter(kernel, compiler.backend, 76 this.astAdapter = new KernelAstAdapter(kernel, compiler.backend,
77 resolvedAst, kernel.nodeToAst, kernel.nodeToElement); 77 resolvedAst, kernel.nodeToAst, kernel.nodeToElement);
78 } 78 }
79 79
80 /// Add a checked-mode type use of [type] if it is not `dynamic`. 80 /// Add a checked-mode type use of [type] if it is not `dynamic`.
81 DartType checkType(ir.DartType irType) { 81 DartType checkType(ir.DartType irType) {
(...skipping 24 matching lines...) Expand all
106 ResolutionImpact buildField(ir.Field field) { 106 ResolutionImpact buildField(ir.Field field) {
107 checkType(field.type); 107 checkType(field.type);
108 if (field.initializer != null) { 108 if (field.initializer != null) {
109 visitNode(field.initializer); 109 visitNode(field.initializer);
110 if (!field.isInstanceMember && 110 if (!field.isInstanceMember &&
111 !field.isConst && 111 !field.isConst &&
112 field.initializer is! ir.NullLiteral) { 112 field.initializer is! ir.NullLiteral) {
113 impactBuilder.registerFeature(Feature.LAZY_FIELD); 113 impactBuilder.registerFeature(Feature.LAZY_FIELD);
114 } 114 }
115 } 115 }
116 if (field.isInstanceMember && astAdapter.isNative(field.enclosingClass)) { 116 if (field.isInstanceMember &&
117 astAdapter.isNativeClass(field.enclosingClass)) {
117 impactBuilder 118 impactBuilder
118 .registerNativeData(astAdapter.getNativeBehaviorForFieldLoad(field)); 119 .registerNativeData(astAdapter.getNativeBehaviorForFieldLoad(field));
119 impactBuilder 120 impactBuilder
120 .registerNativeData(astAdapter.getNativeBehaviorForFieldStore(field)); 121 .registerNativeData(astAdapter.getNativeBehaviorForFieldStore(field));
121 } 122 }
122 return impactBuilder; 123 return impactBuilder;
123 } 124 }
124 125
125 ResolutionImpact buildConstructor(ir.Constructor constructor) { 126 ResolutionImpact buildConstructor(ir.Constructor constructor) {
126 handleSignature(constructor.function, checkReturnType: false); 127 handleSignature(constructor.function, checkReturnType: false);
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 251
251 @override 252 @override
252 void visitConstructorInvocation(ir.ConstructorInvocation node) { 253 void visitConstructorInvocation(ir.ConstructorInvocation node) {
253 handleNew(node, node.target, isConst: node.isConst); 254 handleNew(node, node.target, isConst: node.isConst);
254 } 255 }
255 256
256 void handleNew(ir.InvocationExpression node, ir.Member target, 257 void handleNew(ir.InvocationExpression node, ir.Member target,
257 {bool isConst: false}) { 258 {bool isConst: false}) {
258 _visitArguments(node.arguments); 259 _visitArguments(node.arguments);
259 FunctionEntity constructor = astAdapter.getConstructor(target); 260 FunctionEntity constructor = astAdapter.getConstructor(target);
260 ClassEntity cls = astAdapter.getClass(target.enclosingClass); 261 InterfaceType type = astAdapter.createInterfaceType(
261 List<DartType> typeArguments = 262 target.enclosingClass, node.arguments.types);
262 astAdapter.getDartTypes(node.arguments.types);
263 InterfaceType type = astAdapter.createInterfaceType(cls, typeArguments);
264 CallStructure callStructure = astAdapter.getCallStructure(node.arguments); 263 CallStructure callStructure = astAdapter.getCallStructure(node.arguments);
265 impactBuilder.registerStaticUse(isConst 264 impactBuilder.registerStaticUse(isConst
266 ? new StaticUse.constConstructorInvoke(constructor, callStructure, type) 265 ? new StaticUse.constConstructorInvoke(constructor, callStructure, type)
267 : new StaticUse.typedConstructorInvoke( 266 : new StaticUse.typedConstructorInvoke(
268 constructor, callStructure, type)); 267 constructor, callStructure, type));
269 if (typeArguments.any((DartType type) => !type.isDynamic)) { 268 if (type.typeArguments.any((DartType type) => !type.isDynamic)) {
270 impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); 269 impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK);
271 } 270 }
272 } 271 }
273 272
274 @override 273 @override
275 void visitSuperInitializer(ir.SuperInitializer node) { 274 void visitSuperInitializer(ir.SuperInitializer node) {
276 FunctionEntity target = astAdapter.getConstructor(node.target); 275 FunctionEntity target = astAdapter.getConstructor(node.target);
277 _visitArguments(node.arguments); 276 _visitArguments(node.arguments);
278 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( 277 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
279 target, astAdapter.getCallStructure(node.arguments))); 278 target, astAdapter.getCallStructure(node.arguments)));
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 break; 317 break;
319 case ForeignKind.JS_BUILTIN: 318 case ForeignKind.JS_BUILTIN:
320 impactBuilder.registerNativeData( 319 impactBuilder.registerNativeData(
321 astAdapter.getNativeBehaviorForJsBuiltinCall(node)); 320 astAdapter.getNativeBehaviorForJsBuiltinCall(node));
322 break; 321 break;
323 case ForeignKind.JS_EMBEDDED_GLOBAL: 322 case ForeignKind.JS_EMBEDDED_GLOBAL:
324 impactBuilder.registerNativeData( 323 impactBuilder.registerNativeData(
325 astAdapter.getNativeBehaviorForJsEmbeddedGlobalCall(node)); 324 astAdapter.getNativeBehaviorForJsEmbeddedGlobalCall(node));
326 break; 325 break;
327 case ForeignKind.JS_INTERCEPTOR_CONSTANT: 326 case ForeignKind.JS_INTERCEPTOR_CONSTANT:
328 if (node.arguments.positional.length != 1 || 327 InterfaceType type =
329 node.arguments.named.isNotEmpty) { 328 astAdapter.getInterfaceTypeForJsInterceptorCall(node);
330 astAdapter.reporter.reportErrorMessage(CURRENT_ELEMENT_SPANNABLE, 329 if (type != null) {
331 MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
332 }
333 ir.Node argument = node.arguments.positional.first;
334 if (argument is ir.TypeLiteral && argument.type is ir.InterfaceType) {
335 InterfaceType type = astAdapter.getInterfaceType(argument.type);
336 impactBuilder.registerTypeUse(new TypeUse.instantiation(type)); 330 impactBuilder.registerTypeUse(new TypeUse.instantiation(type));
337 } 331 }
338 break; 332 break;
339 case ForeignKind.NONE: 333 case ForeignKind.NONE:
340 break; 334 break;
341 } 335 }
342 } 336 }
343 337
344 @override 338 @override
345 void visitStaticGet(ir.StaticGet node) { 339 void visitStaticGet(ir.StaticGet node) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 454
461 @override 455 @override
462 void visitStringConcatenation(ir.StringConcatenation node) { 456 void visitStringConcatenation(ir.StringConcatenation node) {
463 impactBuilder.registerFeature(Feature.STRING_INTERPOLATION); 457 impactBuilder.registerFeature(Feature.STRING_INTERPOLATION);
464 impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION); 458 impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION);
465 visitNodes(node.expressions); 459 visitNodes(node.expressions);
466 } 460 }
467 461
468 @override 462 @override
469 void visitFunctionDeclaration(ir.FunctionDeclaration node) { 463 void visitFunctionDeclaration(ir.FunctionDeclaration node) {
470 impactBuilder 464 impactBuilder.registerStaticUse(
471 .registerStaticUse(new StaticUse.closure(astAdapter.getElement(node))); 465 new StaticUse.closure(astAdapter.getLocalFunction(node)));
472 handleSignature(node.function); 466 handleSignature(node.function);
473 visitNode(node.function.body); 467 visitNode(node.function.body);
474 } 468 }
475 469
476 @override 470 @override
477 void visitFunctionExpression(ir.FunctionExpression node) { 471 void visitFunctionExpression(ir.FunctionExpression node) {
478 impactBuilder 472 impactBuilder.registerStaticUse(
479 .registerStaticUse(new StaticUse.closure(astAdapter.getElement(node))); 473 new StaticUse.closure(astAdapter.getLocalFunction(node)));
480 handleSignature(node.function); 474 handleSignature(node.function);
481 visitNode(node.function.body); 475 visitNode(node.function.body);
482 } 476 }
483 477
484 @override 478 @override
485 void visitVariableDeclaration(ir.VariableDeclaration node) { 479 void visitVariableDeclaration(ir.VariableDeclaration node) {
486 checkType(node.type); 480 checkType(node.type);
487 if (node.initializer != null) { 481 if (node.initializer != null) {
488 visitNode(node.initializer); 482 visitNode(node.initializer);
489 } else { 483 } else {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
571 FunctionEntity target = astAdapter.getConstructor(node.target); 565 FunctionEntity target = astAdapter.getConstructor(node.target);
572 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( 566 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
573 target, astAdapter.getCallStructure(node.arguments))); 567 target, astAdapter.getCallStructure(node.arguments)));
574 } 568 }
575 569
576 // TODO(johnniwinther): Make this throw and visit child nodes explicitly 570 // TODO(johnniwinther): Make this throw and visit child nodes explicitly
577 // instead to ensure that we don't visit unwanted parts of the ir. 571 // instead to ensure that we don't visit unwanted parts of the ir.
578 @override 572 @override
579 void defaultNode(ir.Node node) => node.visitChildren(this); 573 void defaultNode(ir.Node node) => node.visitChildren(this);
580 } 574 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698