| OLD | NEW |
| 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 '../closure.dart'; | 7 import '../closure.dart'; |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/codegen.dart' show CodegenRegistry; | 9 import '../common/codegen.dart' show CodegenRegistry; |
| 10 import '../common/names.dart'; | 10 import '../common/names.dart'; |
| (...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 sourceInformationBuilder = oldSourceInformationBuilder; | 455 sourceInformationBuilder = oldSourceInformationBuilder; |
| 456 _targetStack.removeLast(); | 456 _targetStack.removeLast(); |
| 457 localsMap.leaveInlinedMember(inlinedTarget); | 457 localsMap.leaveInlinedMember(inlinedTarget); |
| 458 return result; | 458 return result; |
| 459 }); | 459 }); |
| 460 } | 460 } |
| 461 | 461 |
| 462 /// Maps the instance fields of a class to their SSA values. | 462 /// Maps the instance fields of a class to their SSA values. |
| 463 Map<FieldEntity, HInstruction> _collectFieldValues(ir.Class clazz) { | 463 Map<FieldEntity, HInstruction> _collectFieldValues(ir.Class clazz) { |
| 464 Map<FieldEntity, HInstruction> fieldValues = <FieldEntity, HInstruction>{}; | 464 Map<FieldEntity, HInstruction> fieldValues = <FieldEntity, HInstruction>{}; |
| 465 | 465 ClassEntity cls = _elementMap.getClass(clazz); |
| 466 for (ir.Field node in clazz.fields) { | 466 _worldBuilder.forEachInstanceField(cls, (_, FieldEntity field) { |
| 467 if (node.isInstanceMember) { | 467 MemberDefinition definition = _elementMap.getMemberDefinition(field); |
| 468 FieldEntity field = _elementMap.getField(node); | 468 ir.Field node; |
| 469 if (node.initializer == null) { | 469 switch (definition.kind) { |
| 470 fieldValues[field] = graph.addConstantNull(closedWorld); | 470 case MemberKind.regular: |
| 471 } else { | 471 node = definition.node; |
| 472 // Gotta update the resolvedAst when we're looking at field values | 472 break; |
| 473 // outside the constructor. | 473 default: |
| 474 inlinedFrom(field, () { | 474 failedAt(field, "Unexpected member definition $definition."); |
| 475 node.initializer.accept(this); | |
| 476 fieldValues[field] = pop(); | |
| 477 }); | |
| 478 } | |
| 479 } | 475 } |
| 480 } | 476 if (node.initializer == null) { |
| 481 | 477 fieldValues[field] = graph.addConstantNull(closedWorld); |
| 478 } else { |
| 479 // Gotta update the current member when we're looking at field values |
| 480 // outside the constructor. |
| 481 inlinedFrom(field, () { |
| 482 node.initializer.accept(this); |
| 483 fieldValues[field] = pop(); |
| 484 }); |
| 485 } |
| 486 }); |
| 482 return fieldValues; | 487 return fieldValues; |
| 483 } | 488 } |
| 484 | 489 |
| 485 /// Collects field initializers all the way up the inheritance chain. | 490 /// Collects field initializers all the way up the inheritance chain. |
| 486 void _buildInitializers( | 491 void _buildInitializers( |
| 487 ir.Constructor constructor, | 492 ir.Constructor constructor, |
| 488 List<ir.Constructor> constructorChain, | 493 List<ir.Constructor> constructorChain, |
| 489 Map<FieldEntity, HInstruction> fieldValues) { | 494 Map<FieldEntity, HInstruction> fieldValues) { |
| 490 assert( | 495 assert( |
| 491 _elementMap.getConstructor(constructor) == localsMap.currentMember, | 496 _elementMap.getConstructor(constructor) == localsMap.currentMember, |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 var target = initializer.target; | 623 var target = initializer.target; |
| 619 var arguments = | 624 var arguments = |
| 620 _normalizeAndBuildArguments(target.function, initializer.arguments); | 625 _normalizeAndBuildArguments(target.function, initializer.arguments); |
| 621 | 626 |
| 622 ir.Class callerClass = caller.enclosingClass; | 627 ir.Class callerClass = caller.enclosingClass; |
| 623 _bindSupertypeTypeParameters(callerClass.supertype); | 628 _bindSupertypeTypeParameters(callerClass.supertype); |
| 624 if (callerClass.mixedInType != null) { | 629 if (callerClass.mixedInType != null) { |
| 625 _bindSupertypeTypeParameters(callerClass.mixedInType); | 630 _bindSupertypeTypeParameters(callerClass.mixedInType); |
| 626 } | 631 } |
| 627 | 632 |
| 628 ir.Class cls = target.enclosingClass; | |
| 629 | |
| 630 inlinedFrom(_elementMap.getConstructor(target), () { | |
| 631 fieldValues.addAll(_collectFieldValues(cls)); | |
| 632 }); | |
| 633 | |
| 634 _inlineSuperOrRedirectCommon( | 633 _inlineSuperOrRedirectCommon( |
| 635 initializer, target, arguments, constructorChain, fieldValues, caller); | 634 initializer, target, arguments, constructorChain, fieldValues, caller); |
| 636 } | 635 } |
| 637 | 636 |
| 638 void _inlineSuperOrRedirectCommon( | 637 void _inlineSuperOrRedirectCommon( |
| 639 ir.Initializer initializer, | 638 ir.Initializer initializer, |
| 640 ir.Constructor constructor, | 639 ir.Constructor constructor, |
| 641 List<HInstruction> arguments, | 640 List<HInstruction> arguments, |
| 642 List<ir.Constructor> constructorChain, | 641 List<ir.Constructor> constructorChain, |
| 643 Map<FieldEntity, HInstruction> fieldValues, | 642 Map<FieldEntity, HInstruction> fieldValues, |
| (...skipping 3093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3737 enterBlock.setBlockFlow( | 3736 enterBlock.setBlockFlow( |
| 3738 new HTryBlockInformation( | 3737 new HTryBlockInformation( |
| 3739 kernelBuilder.wrapStatementGraph(bodyGraph), | 3738 kernelBuilder.wrapStatementGraph(bodyGraph), |
| 3740 exception, | 3739 exception, |
| 3741 kernelBuilder.wrapStatementGraph(catchGraph), | 3740 kernelBuilder.wrapStatementGraph(catchGraph), |
| 3742 kernelBuilder.wrapStatementGraph(finallyGraph)), | 3741 kernelBuilder.wrapStatementGraph(finallyGraph)), |
| 3743 exitBlock); | 3742 exitBlock); |
| 3744 kernelBuilder.inTryStatement = previouslyInTryStatement; | 3743 kernelBuilder.inTryStatement = previouslyInTryStatement; |
| 3745 } | 3744 } |
| 3746 } | 3745 } |
| OLD | NEW |