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

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

Issue 2890153002: Handle super accesses loaded from .dill (Closed)
Patch Set: Created 3 years, 7 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 throw "FOUND NULL FIELD: $element"; 57 throw "FOUND NULL FIELD: $element";
58 } 58 }
59 } else { 59 } else {
60 throw new UnsupportedError("Unsupported element: $element"); 60 throw new UnsupportedError("Unsupported element: $element");
61 } 61 }
62 return member; 62 return member;
63 } 63 }
64 64
65 ResolutionImpact buildKernelImpact( 65 ResolutionImpact buildKernelImpact(
66 ir.Member member, KernelToElementMap elementAdapter) { 66 ir.Member member, KernelToElementMap elementAdapter) {
67 KernelImpactBuilder builder = 67 KernelImpactBuilder builder = new KernelImpactBuilder(elementAdapter, member);
68 new KernelImpactBuilder('${member.name}', elementAdapter);
69 if (member is ir.Procedure) { 68 if (member is ir.Procedure) {
70 return builder.buildProcedure(member); 69 return builder.buildProcedure(member);
71 } else if (member is ir.Constructor) { 70 } else if (member is ir.Constructor) {
72 return builder.buildConstructor(member); 71 return builder.buildConstructor(member);
73 } else if (member is ir.Field) { 72 } else if (member is ir.Field) {
74 return builder.buildField(member); 73 return builder.buildField(member);
75 } 74 }
76 throw new UnsupportedError("Unsupported member: $member"); 75 throw new UnsupportedError("Unsupported member: $member");
77 } 76 }
78 77
79 class KernelImpactBuilder extends ir.Visitor { 78 class KernelImpactBuilder extends ir.Visitor {
80 final ResolutionWorldImpactBuilder impactBuilder; 79 final ResolutionWorldImpactBuilder impactBuilder;
81 final KernelToElementMap elementAdapter; 80 final KernelToElementMap elementAdapter;
81 final ir.Member currentMember;
82 82
83 KernelImpactBuilder(String name, this.elementAdapter) 83 KernelImpactBuilder(this.elementAdapter, this.currentMember)
84 : this.impactBuilder = new ResolutionWorldImpactBuilder(name); 84 : this.impactBuilder =
85 new ResolutionWorldImpactBuilder('${currentMember.name}');
85 86
86 CommonElements get commonElements => elementAdapter.commonElements; 87 CommonElements get commonElements => elementAdapter.commonElements;
87 88
88 /// Add a checked-mode type use of [type] if it is not `dynamic`. 89 /// Add a checked-mode type use of [type] if it is not `dynamic`.
89 DartType checkType(ir.DartType irType) { 90 DartType checkType(ir.DartType irType) {
90 DartType type = elementAdapter.getDartType(irType); 91 DartType type = elementAdapter.getDartType(irType);
91 if (!type.isDynamic) { 92 if (!type.isDynamic) {
92 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type)); 93 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type));
93 } 94 }
94 return type; 95 return type;
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
382 } 383 }
383 } 384 }
384 385
385 @override 386 @override
386 void visitStaticSet(ir.StaticSet node) { 387 void visitStaticSet(ir.StaticSet node) {
387 visitNode(node.value); 388 visitNode(node.value);
388 MemberEntity member = elementAdapter.getMember(node.target); 389 MemberEntity member = elementAdapter.getMember(node.target);
389 impactBuilder.registerStaticUse(new StaticUse.staticSet(member)); 390 impactBuilder.registerStaticUse(new StaticUse.staticSet(member));
390 } 391 }
391 392
392 void handleSuperInvocation(ir.Node target, ir.Node arguments) { 393 void handleSuperInvocation(ir.Name name, ir.Node target, ir.Node arguments) {
393 FunctionEntity method = elementAdapter.getMethod(target); 394 FunctionEntity method = elementAdapter
395 .getSuperMember(currentMember, name, target, setter: false);
394 _visitArguments(arguments); 396 _visitArguments(arguments);
395 impactBuilder.registerStaticUse(new StaticUse.superInvoke( 397 impactBuilder.registerStaticUse(new StaticUse.superInvoke(
396 method, elementAdapter.getCallStructure(arguments))); 398 method, elementAdapter.getCallStructure(arguments)));
397 } 399 }
398 400
399 @override 401 @override
400 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) { 402 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
401 handleSuperInvocation(node.target, node.arguments); 403 handleSuperInvocation(node.name, node.target, node.arguments);
402 } 404 }
403 405
404 @override 406 @override
405 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) { 407 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
406 // TODO(johnniwinther): Should we support this or always use the 408 // TODO(johnniwinther): Should we support this or always use the
407 // [MixinFullResolution] transformer? 409 // [MixinFullResolution] transformer?
408 handleSuperInvocation(node.interfaceTarget, node.arguments); 410 handleSuperInvocation(node.name, node.interfaceTarget, node.arguments);
409 } 411 }
410 412
411 void handleSuperGet(ir.Member target) { 413 void handleSuperGet(ir.Name name, ir.Member target) {
412 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { 414 MemberEntity member = elementAdapter
413 FunctionEntity method = elementAdapter.getMethod(target); 415 .getSuperMember(currentMember, name, target, setter: false);
414 impactBuilder.registerStaticUse(new StaticUse.superTearOff(method)); 416 if (member.isFunction) {
417 impactBuilder.registerStaticUse(new StaticUse.superTearOff(member));
415 } else { 418 } else {
416 MemberEntity member = elementAdapter.getMember(target);
417 impactBuilder.registerStaticUse(new StaticUse.superGet(member)); 419 impactBuilder.registerStaticUse(new StaticUse.superGet(member));
418 } 420 }
419 } 421 }
420 422
421 @override 423 @override
422 void visitDirectPropertyGet(ir.DirectPropertyGet node) { 424 void visitDirectPropertyGet(ir.DirectPropertyGet node) {
423 handleSuperGet(node.target); 425 handleSuperGet(null, node.target);
424 } 426 }
425 427
426 @override 428 @override
427 void visitSuperPropertyGet(ir.SuperPropertyGet node) { 429 void visitSuperPropertyGet(ir.SuperPropertyGet node) {
428 handleSuperGet(node.interfaceTarget); 430 handleSuperGet(node.name, node.interfaceTarget);
429 } 431 }
430 432
431 void handleSuperSet(ir.Node target, ir.Node value) { 433 void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) {
432 visitNode(value); 434 visitNode(value);
433 if (target is ir.Field) { 435 MemberEntity member = elementAdapter
434 FieldEntity field = elementAdapter.getField(target); 436 .getSuperMember(currentMember, name, target, setter: true);
435 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field)); 437 if (member.isField) {
438 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(member));
436 } else { 439 } else {
437 FunctionEntity method = elementAdapter.getMethod(target); 440 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(member));
438 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method));
439 } 441 }
440 } 442 }
441 443
442 @override 444 @override
443 void visitDirectPropertySet(ir.DirectPropertySet node) { 445 void visitDirectPropertySet(ir.DirectPropertySet node) {
444 handleSuperSet(node.target, node.value); 446 handleSuperSet(null, node.target, node.value);
445 } 447 }
446 448
447 @override 449 @override
448 void visitSuperPropertySet(ir.SuperPropertySet node) { 450 void visitSuperPropertySet(ir.SuperPropertySet node) {
449 handleSuperSet(node.interfaceTarget, node.value); 451 handleSuperSet(node.name, node.interfaceTarget, node.value);
450 } 452 }
451 453
452 @override 454 @override
453 void visitMethodInvocation(ir.MethodInvocation invocation) { 455 void visitMethodInvocation(ir.MethodInvocation invocation) {
454 var receiver = invocation.receiver; 456 var receiver = invocation.receiver;
455 if (receiver is ir.VariableGet && 457 if (receiver is ir.VariableGet &&
456 receiver.variable.isFinal && 458 receiver.variable.isFinal &&
457 receiver.variable.parent is ir.FunctionDeclaration) { 459 receiver.variable.parent is ir.FunctionDeclaration) {
458 // Invocation of a local function. No need for dynamic use. 460 // Invocation of a local function. No need for dynamic use.
459 } else { 461 } else {
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 ConstructorEntity target = elementAdapter.getConstructor(node.target); 604 ConstructorEntity target = elementAdapter.getConstructor(node.target);
603 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( 605 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
604 target, elementAdapter.getCallStructure(node.arguments))); 606 target, elementAdapter.getCallStructure(node.arguments)));
605 } 607 }
606 608
607 // TODO(johnniwinther): Make this throw and visit child nodes explicitly 609 // TODO(johnniwinther): Make this throw and visit child nodes explicitly
608 // instead to ensure that we don't visit unwanted parts of the ir. 610 // instead to ensure that we don't visit unwanted parts of the ir.
609 @override 611 @override
610 void defaultNode(ir.Node node) => node.visitChildren(this); 612 void defaultNode(ir.Node node) => node.visitChildren(this);
611 } 613 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart ('k') | tests/compiler/dart2js/kernel/closed_world_from_dill_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698