| Index: pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| index 89de758c3c187dd3addd801c58c9b3762e85635d..8452a0cb8290c4247ed298608345ab6090ffc3d4 100644
|
| --- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| +++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
|
| @@ -31,6 +31,7 @@ import '../types/masks.dart';
|
| import '../universe/selector.dart';
|
| import '../universe/side_effects.dart' show SideEffects;
|
| import '../universe/use.dart' show DynamicUse;
|
| +import '../universe/world_builder.dart' show CodegenWorldBuilder;
|
| import '../world.dart';
|
| import 'graph_builder.dart';
|
| import 'jump_handler.dart';
|
| @@ -54,6 +55,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| // handler.
|
| final Node functionNode;
|
| final ClosedWorld closedWorld;
|
| + final CodegenWorldBuilder _worldBuilder;
|
| final CodegenRegistry registry;
|
| final ClosureClassMaps closureToClassMapper;
|
|
|
| @@ -104,6 +106,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| this._typeInferenceMap,
|
| this._localsMap,
|
| this.closedWorld,
|
| + this._worldBuilder,
|
| this.registry,
|
| this.closureToClassMapper,
|
| // TODO(het): Should sourceInformationBuilder be in GraphBuilder?
|
| @@ -127,30 +130,33 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| CommonElements get _commonElements => _elementMap.commonElements;
|
|
|
| HGraph build() {
|
| - // TODO(het): no reason to do this here...
|
| - HInstruction.idCounter = 0;
|
| - if (target is ir.Procedure) {
|
| - _targetFunction = (target as ir.Procedure).function;
|
| - buildFunctionNode(_targetFunction);
|
| - } else if (target is ir.Field) {
|
| - buildField(target);
|
| - } else if (target is ir.Constructor) {
|
| - if (_targetIsConstructorBody) {
|
| - buildConstructorBody(target);
|
| + return reporter.withCurrentElement(_localsMap.currentMember, () {
|
| + // TODO(het): no reason to do this here...
|
| + HInstruction.idCounter = 0;
|
| + if (target is ir.Procedure) {
|
| + _targetFunction = (target as ir.Procedure).function;
|
| + buildFunctionNode(_targetFunction);
|
| + } else if (target is ir.Field) {
|
| + buildField(target);
|
| + } else if (target is ir.Constructor) {
|
| + if (_targetIsConstructorBody) {
|
| + buildConstructorBody(target);
|
| + } else {
|
| + buildConstructor(target);
|
| + }
|
| + } else if (target is ir.FunctionExpression) {
|
| + _targetFunction = (target as ir.FunctionExpression).function;
|
| + buildFunctionNode(_targetFunction);
|
| + } else if (target is ir.FunctionDeclaration) {
|
| + _targetFunction = (target as ir.FunctionDeclaration).function;
|
| + buildFunctionNode(_targetFunction);
|
| } else {
|
| - buildConstructor(target);
|
| + throw 'No case implemented to handle target: '
|
| + '$target for $targetElement';
|
| }
|
| - } else if (target is ir.FunctionExpression) {
|
| - _targetFunction = (target as ir.FunctionExpression).function;
|
| - buildFunctionNode(_targetFunction);
|
| - } else if (target is ir.FunctionDeclaration) {
|
| - _targetFunction = (target as ir.FunctionDeclaration).function;
|
| - buildFunctionNode(_targetFunction);
|
| - } else {
|
| - throw 'No case implemented to handle target: $target for $targetElement';
|
| - }
|
| - assert(graph.isValid());
|
| - return graph;
|
| + assert(graph.isValid());
|
| + return graph;
|
| + });
|
| }
|
|
|
| void buildField(ir.Field field) {
|
| @@ -265,17 +271,17 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| final constructorArguments = <HInstruction>[];
|
| // Doing this instead of fieldValues.forEach because we haven't defined the
|
| // order of the arguments here. We can define that with JElements.
|
| - ClassElement cls = _elementMap.getClass(constructedClass);
|
| - cls.forEachInstanceField(
|
| - (ClassElement enclosingClass, FieldElement member) {
|
| + ClassEntity cls = _elementMap.getClass(constructedClass);
|
| + InterfaceType thisType = _elementMap.getThisType(cls);
|
| + _worldBuilder.forEachInstanceField(cls,
|
| + (ClassEntity enclosingClass, FieldEntity member) {
|
| var value = fieldValues[member];
|
| assert(value != null, 'No value for field ${member}');
|
| constructorArguments.add(value);
|
| - }, includeSuperAndInjectedMembers: true);
|
| + });
|
|
|
| // Create the runtime type information, if needed.
|
| - bool hasRtiInput = backend.rtiNeed
|
| - .classNeedsRtiField(_elementMap.getClass(constructedClass));
|
| + bool hasRtiInput = backend.rtiNeed.classNeedsRtiField(cls);
|
| if (hasRtiInput) {
|
| // Read the values of the type arguments and create a HTypeInfoExpression
|
| // to set on the newly create object.
|
| @@ -283,29 +289,22 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
|
| for (ir.DartType typeParameter
|
| in constructedClass.thisType.typeArguments) {
|
| HInstruction argument = localsHandler.readLocal(localsHandler
|
| - .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter)
|
| - as ResolutionTypeVariableType));
|
| + .getTypeVariableAsLocal(_elementMap.getDartType(typeParameter)));
|
| typeArguments.add(argument);
|
| }
|
|
|
| - ClassElement cls = _elementMap.getClass(constructedClass);
|
| HInstruction typeInfo = new HTypeInfoExpression(
|
| TypeInfoExpressionKind.INSTANCE,
|
| - cls.thisType,
|
| + thisType,
|
| typeArguments,
|
| commonMasks.dynamicType);
|
| add(typeInfo);
|
| constructorArguments.add(typeInfo);
|
| }
|
|
|
| - ClassElement constructedCls = _elementMap.getClass(constructedClass);
|
| HInstruction newObject = new HCreate(
|
| - _elementMap.getClass(constructedClass),
|
| - constructorArguments,
|
| - new TypeMask.nonNullExact(
|
| - _elementMap.getClass(constructedClass), closedWorld),
|
| - instantiatedTypes: <ResolutionInterfaceType>[constructedCls.thisType],
|
| - hasRtiInput: hasRtiInput);
|
| + cls, constructorArguments, new TypeMask.nonNullExact(cls, closedWorld),
|
| + instantiatedTypes: <InterfaceType>[thisType], hasRtiInput: hasRtiInput);
|
|
|
| add(newObject);
|
|
|
|
|