| Index: pkg/compiler/lib/src/ssa/locals_handler.dart
|
| diff --git a/pkg/compiler/lib/src/ssa/locals_handler.dart b/pkg/compiler/lib/src/ssa/locals_handler.dart
|
| index 34fbee0e24facd80d68d7e7887d4dce718be0074..6c44a9386319dc42e2d078f0650243be383f09d3 100644
|
| --- a/pkg/compiler/lib/src/ssa/locals_handler.dart
|
| +++ b/pkg/compiler/lib/src/ssa/locals_handler.dart
|
| @@ -36,11 +36,12 @@ class LocalsHandler {
|
| ClosureClassMap closureData;
|
| Map<ResolutionTypeVariableType, TypeVariableLocal> typeVariableLocals =
|
| new Map<ResolutionTypeVariableType, TypeVariableLocal>();
|
| - final ExecutableElement executableContext;
|
| + final Entity executableContext;
|
| + final MemberEntity memberContext;
|
|
|
| /// The class that defines the current type environment or null if no type
|
| /// variables are in scope.
|
| - ClassElement get contextClass => executableContext.contextClass;
|
| + final ClassElement contextClass;
|
|
|
| /// The type of the current instance, if concrete.
|
| ///
|
| @@ -67,6 +68,8 @@ class LocalsHandler {
|
| LocalsHandler(
|
| this.builder,
|
| this.executableContext,
|
| + this.memberContext,
|
| + this.contextClass,
|
| ResolutionInterfaceType instanceType,
|
| this._nativeData,
|
| this._interceptorData)
|
| @@ -106,6 +109,8 @@ class LocalsHandler {
|
| : directLocals = new Map<Local, HInstruction>.from(other.directLocals),
|
| redirectionMapping = other.redirectionMapping,
|
| executableContext = other.executableContext,
|
| + memberContext = other.memberContext,
|
| + contextClass = other.contextClass,
|
| instanceType = other.instanceType,
|
| builder = other.builder,
|
| closureData = other.closureData,
|
| @@ -259,7 +264,7 @@ class LocalsHandler {
|
| bool isInterceptedClass =
|
| _interceptorData.isInterceptedClass(cls.declaration);
|
| String name = isInterceptedClass ? 'receiver' : '_';
|
| - SyntheticLocal parameter = new SyntheticLocal(name, executableContext);
|
| + SyntheticLocal parameter = createLocal(name);
|
| HParameterValue value = new HParameterValue(parameter, getTypeOfThis());
|
| builder.graph.explicitReceiverParameter = value;
|
| builder.graph.entry.addAfter(directLocals[closureData.thisLocal], value);
|
| @@ -272,8 +277,7 @@ class LocalsHandler {
|
| directLocals[closureData.thisLocal] = value;
|
| }
|
| } else if (isNativeUpgradeFactory) {
|
| - SyntheticLocal parameter =
|
| - new SyntheticLocal('receiver', executableContext);
|
| + SyntheticLocal parameter = createLocal('receiver');
|
| // Unlike `this`, receiver is nullable since direct calls to generative
|
| // constructor call the constructor with `null`.
|
| HParameterValue value =
|
| @@ -658,6 +662,10 @@ class LocalsHandler {
|
| /// being updated in try/catch blocks, and should be
|
| /// accessed indirectly through [HLocalGet] and [HLocalSet].
|
| Map<Local, HLocalValue> activationVariables = <Local, HLocalValue>{};
|
| +
|
| + SyntheticLocal createLocal(String name) {
|
| + return new SyntheticLocal(name, executableContext, memberContext);
|
| + }
|
| }
|
|
|
| /// A synthetic local variable only used with the SSA graph.
|
| @@ -666,16 +674,14 @@ class LocalsHandler {
|
| /// try-catch statement.
|
| class SyntheticLocal extends Local {
|
| final String name;
|
| - final ExecutableElement executableContext;
|
| + final Entity executableContext;
|
| + final MemberEntity memberContext;
|
|
|
| // Avoid slow Object.hashCode.
|
| final int hashCode = _nextHashCode = (_nextHashCode + 1).toUnsigned(30);
|
| static int _nextHashCode = 0;
|
|
|
| - SyntheticLocal(this.name, this.executableContext);
|
| -
|
| - @override
|
| - MemberElement get memberContext => executableContext.memberContext;
|
| + SyntheticLocal(this.name, this.executableContext, this.memberContext);
|
|
|
| toString() => 'SyntheticLocal($name)';
|
| }
|
|
|