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

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

Issue 2466353002: Revert "More functionality in kernel_impact." and "Compute NativeBehavior for foreign functions." (Closed)
Patch Set: Created 4 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
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';
11 import '../dart_types.dart'; 11 import '../dart_types.dart';
12 import '../elements/elements.dart'; 12 import '../elements/elements.dart';
13 import '../js_backend/backend.dart' show JavaScriptBackend; 13 import '../js_backend/backend.dart' show JavaScriptBackend;
14 import '../kernel/kernel.dart'; 14 import '../kernel/kernel.dart';
15 import '../kernel/kernel_debug.dart'; 15 import '../kernel/kernel_debug.dart';
16 import '../kernel/kernel_visitor.dart'; 16 import '../kernel/kernel_visitor.dart';
17 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder; 17 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder;
18 import '../universe/call_structure.dart'; 18 import '../universe/call_structure.dart';
19 import '../universe/feature.dart'; 19 import '../universe/feature.dart';
20 import '../universe/selector.dart'; 20 import '../universe/selector.dart';
21 import '../universe/use.dart'; 21 import '../universe/use.dart';
22 22
23 import 'kernel_ast_adapter.dart'; 23 import 'kernel_ast_adapter.dart';
24 import '../common/resolution.dart'; 24 import '../common/resolution.dart';
25 25
26 /// Computes the [ResolutionImpact] for [resolvedAst] through kernel. 26 /// Computes the [ResolutionImpact] for [resolvedAst] through kernel.
27 ResolutionImpact build(Compiler compiler, ResolvedAst resolvedAst) { 27 ResolutionImpact build(Compiler compiler, ResolvedAst resolvedAst) {
28 AstElement element = resolvedAst.element; 28 AstElement element = resolvedAst.element;
29 return compiler.reporter.withCurrentElement(element.implementation, () { 29 JavaScriptBackend backend = compiler.backend;
30 JavaScriptBackend backend = compiler.backend; 30 Kernel kernel = backend.kernelTask.kernel;
31 Kernel kernel = backend.kernelTask.kernel; 31 KernelImpactBuilder builder =
32 KernelImpactBuilder builder = 32 new KernelImpactBuilder(resolvedAst, compiler, kernel);
33 new KernelImpactBuilder(resolvedAst, compiler, kernel); 33 if (element.isFunction ||
34 if (element.isFunction || 34 element.isGetter ||
35 element.isGetter || 35 element.isSetter ||
36 element.isSetter || 36 element.isFactoryConstructor) {
37 element.isFactoryConstructor) { 37 ir.Procedure function = kernel.functions[element];
38 ir.Procedure function = kernel.functions[element]; 38 if (function == null) {
39 if (function == null) { 39 throw "FOUND NULL FUNCTION: $element";
40 throw "FOUND NULL FUNCTION: $element";
41 } else {
42 return builder.buildProcedure(function);
43 }
44 } else if (element.isGenerativeConstructor) {
45 ir.Constructor constructor = kernel.functions[element];
46 if (constructor == null) {
47 throw "FOUND NULL CONSTRUCTOR: $element";
48 } else {
49 return builder.buildConstructor(constructor);
50 }
51 } else if (element.isField) {
52 ir.Field field = kernel.fields[element];
53 if (field == null) {
54 throw "FOUND NULL FIELD: $element";
55 } else {
56 return builder.buildField(field);
57 }
58 } else { 40 } else {
59 throw new UnsupportedError("Unsupported element: $element"); 41 return builder.buildProcedure(function);
60 } 42 }
61 }); 43 } else if (element.isGenerativeConstructor) {
44 ir.Constructor constructor = kernel.functions[element];
45 if (constructor == null) {
46 throw "FOUND NULL CONSTRUCTOR: $element";
47 } else {
48 return builder.buildConstructor(constructor);
49 }
50 } else if (element.isField) {
51 ir.Field field = kernel.fields[element];
52 if (field == null) {
53 throw "FOUND NULL FIELD: $element";
54 } else {
55 return builder.buildField(field);
56 }
57 } else {
58 throw new UnsupportedError("Unsupported element: $element");
59 }
62 } 60 }
63 61
64 class KernelImpactBuilder extends ir.Visitor { 62 class KernelImpactBuilder extends ir.Visitor {
65 final ResolvedAst resolvedAst; 63 final ResolvedAst resolvedAst;
66 final Compiler compiler; 64 final Compiler compiler;
67 65
68 JavaScriptBackend get backend => compiler.backend; 66 JavaScriptBackend get backend => compiler.backend;
69 67
70 ResolutionWorldImpactBuilder impactBuilder; 68 ResolutionWorldImpactBuilder impactBuilder;
71 KernelAstAdapter astAdapter; 69 KernelAstAdapter astAdapter;
(...skipping 28 matching lines...) Expand all
100 checkType(node.returnType); 98 checkType(node.returnType);
101 } 99 }
102 node.positionalParameters.forEach(handleParameter); 100 node.positionalParameters.forEach(handleParameter);
103 node.namedParameters.forEach(handleParameter); 101 node.namedParameters.forEach(handleParameter);
104 } 102 }
105 103
106 ResolutionImpact buildField(ir.Field field) { 104 ResolutionImpact buildField(ir.Field field) {
107 checkType(field.type); 105 checkType(field.type);
108 if (field.initializer != null) { 106 if (field.initializer != null) {
109 visitNode(field.initializer); 107 visitNode(field.initializer);
110 if (!field.isInstanceMember && !field.isConst) { 108 if (!field.isConst) {
111 impactBuilder.registerFeature(Feature.LAZY_FIELD); 109 impactBuilder.registerFeature(Feature.LAZY_FIELD);
112 } 110 }
113 } else { 111 } else {
114 impactBuilder.registerFeature(Feature.FIELD_WITHOUT_INITIALIZER); 112 impactBuilder.registerFeature(Feature.FIELD_WITHOUT_INITIALIZER);
115 } 113 }
116 return impactBuilder; 114 return impactBuilder;
117 } 115 }
118 116
119 ResolutionImpact buildConstructor(ir.Constructor constructor) { 117 ResolutionImpact buildConstructor(ir.Constructor constructor) {
120 handleSignature(constructor.function, checkReturnType: false); 118 handleSignature(constructor.function, checkReturnType: false);
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 // main() { 284 // main() {
287 // print(new A<int>.regular() is B<int>); 285 // print(new A<int>.regular() is B<int>);
288 // print(new A<String>.redirect() is B<String>); 286 // print(new A<String>.redirect() is B<String>);
289 // } 287 // }
290 // 288 //
291 // To track that B is actually instantiated as B<int> and B<String> we 289 // To track that B is actually instantiated as B<int> and B<String> we
292 // need to follow the type arguments passed to A.regular and A.redirect 290 // need to follow the type arguments passed to A.regular and A.redirect
293 // to B. Currently, we only do this soundly if we register A<int> and 291 // to B. Currently, we only do this soundly if we register A<int> and
294 // A<String> as instantiated. We should instead register that A.T is 292 // A<String> as instantiated. We should instead register that A.T is
295 // instantiated as int and String. 293 // instantiated as int and String.
296 handleNew(node, node.target, isConst: node.isConst); 294 handleNew(node, node.target);
297 } else { 295 } else {
298 _visitArguments(node.arguments); 296 _visitArguments(node.arguments);
299 impactBuilder.registerStaticUse(new StaticUse.staticInvoke( 297 impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
300 target, astAdapter.getCallStructure(node.arguments))); 298 target, astAdapter.getCallStructure(node.arguments)));
301 } 299 }
302 switch (astAdapter.getForeignKind(node)) {
303 case ForeignKind.JS:
304 impactBuilder
305 .registerNativeData(astAdapter.getNativeBehaviorForJsCall(node));
306 break;
307 case ForeignKind.JS_BUILTIN:
308 impactBuilder.registerNativeData(
309 astAdapter.getNativeBehaviorForJsBuiltinCall(node));
310 break;
311 case ForeignKind.JS_EMBEDDED_GLOBAL:
312 impactBuilder.registerNativeData(
313 astAdapter.getNativeBehaviorForJsEmbeddedGlobalCall(node));
314 break;
315 case ForeignKind.JS_INTERCEPTOR_CONSTANT:
316 if (node.arguments.positional.length != 1 ||
317 node.arguments.named.isNotEmpty) {
318 astAdapter.reporter.reportErrorMessage(CURRENT_ELEMENT_SPANNABLE,
319 MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
320 }
321 ir.Node argument = node.arguments.positional.first;
322 if (argument is ir.TypeLiteral && argument.type is ir.InterfaceType) {
323 impactBuilder.registerTypeUse(
324 new TypeUse.instantiation(astAdapter.getDartType(argument.type)));
325 }
326 break;
327 case ForeignKind.NONE:
328 break;
329 }
330 } 300 }
331 301
332 @override 302 @override
333 void visitStaticGet(ir.StaticGet node) { 303 void visitStaticGet(ir.StaticGet node) {
334 ir.Member target = node.target; 304 ir.Member target = node.target;
335 Element element = astAdapter.getElement(target).declaration; 305 Element element = astAdapter.getElement(target).declaration;
336 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { 306 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
337 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(element)); 307 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(element));
338 } else { 308 } else {
339 impactBuilder.registerStaticUse(new StaticUse.staticGet(element)); 309 impactBuilder.registerStaticUse(new StaticUse.staticGet(element));
340 } 310 }
341 } 311 }
342 312
343 @override 313 @override
344 void visitStaticSet(ir.StaticSet node) { 314 void visitStaticSet(ir.StaticSet node) {
345 visitNode(node.value); 315 visitNode(node.value);
346 Element element = astAdapter.getElement(node.target).declaration; 316 Element element = astAdapter.getElement(node.target).declaration;
347 impactBuilder.registerStaticUse(new StaticUse.staticSet(element)); 317 impactBuilder.registerStaticUse(new StaticUse.staticSet(element));
348 } 318 }
349 319
350 void handleSuperInvocation(ir.Node target, ir.Node arguments) {
351 Element element = astAdapter.getElement(target).declaration;
352 _visitArguments(arguments);
353 impactBuilder.registerStaticUse(new StaticUse.superInvoke(
354 element, astAdapter.getCallStructure(arguments)));
355 }
356
357 @override
358 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
359 handleSuperInvocation(node.target, node.arguments);
360 }
361
362 @override
363 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
364 // TODO(johnniwinther): Should we support this or always use the
365 // [MixinFullResolution] transformer?
366 handleSuperInvocation(node.interfaceTarget, node.arguments);
367 }
368
369 void handleSuperGet(ir.Member target) {
370 Element element = astAdapter.getElement(target).declaration;
371 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
372 impactBuilder.registerStaticUse(new StaticUse.superTearOff(element));
373 } else {
374 impactBuilder.registerStaticUse(new StaticUse.superGet(element));
375 }
376 }
377
378 @override
379 void visitDirectGet(ir.StaticGet node) {
380 handleSuperGet(node.target);
381 }
382
383 @override
384 void visitSuperPropertyGet(ir.SuperPropertyGet node) {
385 handleSuperGet(node.interfaceTarget);
386 }
387
388 void handleSuperSet(ir.Node target, ir.Node value) {
389 visitNode(value);
390 Element element = astAdapter.getElement(target).declaration;
391 if (target is ir.Field) {
392 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(element));
393 } else {
394 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(element));
395 }
396 }
397
398 @override
399 void visitDirectPropertySet(ir.DirectPropertySet node) {
400 handleSuperSet(node.target, node.value);
401 }
402
403 @override
404 void visitSuperPropertySet(ir.SuperPropertySet node) {
405 handleSuperSet(node.interfaceTarget, node.value);
406 }
407
408 @override 320 @override
409 void visitMethodInvocation(ir.MethodInvocation invocation) { 321 void visitMethodInvocation(ir.MethodInvocation invocation) {
410 var receiver = invocation.receiver; 322 var receiver = invocation.receiver;
411 if (receiver is ir.VariableGet && 323 if (receiver is ir.VariableGet &&
412 receiver.variable.isFinal && 324 receiver.variable.isFinal &&
413 receiver.variable.parent is ir.FunctionDeclaration) { 325 receiver.variable.parent is ir.FunctionDeclaration) {
414 // Invocation of a local function. No need for dynamic use. 326 // Invocation of a local function. No need for dynamic use.
415 } else { 327 } else {
416 visitNode(invocation.receiver); 328 visitNode(invocation.receiver);
417 impactBuilder.registerDynamicUse( 329 impactBuilder.registerDynamicUse(
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 visitNode(node.initializer); 385 visitNode(node.initializer);
474 } else { 386 } else {
475 impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER); 387 impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER);
476 } 388 }
477 } 389 }
478 390
479 @override 391 @override
480 void visitIsExpression(ir.IsExpression node) { 392 void visitIsExpression(ir.IsExpression node) {
481 impactBuilder.registerTypeUse( 393 impactBuilder.registerTypeUse(
482 new TypeUse.isCheck(astAdapter.getDartType(node.type))); 394 new TypeUse.isCheck(astAdapter.getDartType(node.type)));
483 visitNode(node.operand);
484 } 395 }
485 396
486 @override 397 @override
487 void visitAsExpression(ir.AsExpression node) { 398 void visitAsExpression(ir.AsExpression node) {
488 impactBuilder 399 impactBuilder
489 .registerTypeUse(new TypeUse.asCast(astAdapter.getDartType(node.type))); 400 .registerTypeUse(new TypeUse.asCast(astAdapter.getDartType(node.type)));
490 visitNode(node.operand);
491 } 401 }
492 402
493 @override 403 @override
494 void visitThrow(ir.Throw node) { 404 void visitThrow(ir.Throw node) {
495 impactBuilder.registerFeature(Feature.THROW_EXPRESSION); 405 impactBuilder.registerFeature(Feature.THROW_EXPRESSION);
496 visitNode(node.expression); 406 visitNode(node.expression);
497 } 407 }
498 408
499 @override 409 @override
500 void visitForInStatement(ir.ForInStatement node) { 410 void visitForInStatement(ir.ForInStatement node) {
(...skipping 30 matching lines...) Expand all
531 } 441 }
532 visitNode(node.body); 442 visitNode(node.body);
533 } 443 }
534 444
535 @override 445 @override
536 void visitTryFinally(ir.TryFinally node) { 446 void visitTryFinally(ir.TryFinally node) {
537 visitNode(node.body); 447 visitNode(node.body);
538 visitNode(node.finalizer); 448 visitNode(node.finalizer);
539 } 449 }
540 450
541 @override
542 void visitTypeLiteral(ir.TypeLiteral node) {
543 impactBuilder.registerTypeUse(
544 new TypeUse.typeLiteral(astAdapter.getDartType(node.type)));
545 }
546
547 @override
548 void visitFieldInitializer(ir.FieldInitializer node) {
549 impactBuilder.registerStaticUse(
550 new StaticUse.fieldInit(astAdapter.getElement(node.field)));
551 visitNode(node.value);
552 }
553
554 @override
555 void visitRedirectingInitializer(ir.RedirectingInitializer node) {
556 _visitArguments(node.arguments);
557 Element target = astAdapter.getElement(node.target).declaration;
558 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
559 target, astAdapter.getCallStructure(node.arguments)));
560 }
561
562 // TODO(johnniwinther): Make this throw and visit child nodes explicitly 451 // TODO(johnniwinther): Make this throw and visit child nodes explicitly
563 // instead to ensure that we don't visit unwanted parts of the ir. 452 // instead to ensure that we don't visit unwanted parts of the ir.
564 @override 453 @override
565 void defaultNode(ir.Node node) => node.visitChildren(this); 454 void defaultNode(ir.Node node) => node.visitChildren(this);
566 } 455 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart ('k') | tests/compiler/dart2js/js_spec_string_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698