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

Unified Diff: pkg/compiler/lib/src/ssa/builder_kernel.dart

Issue 2920753002: Use entities as keys rather than IR nodes (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 side-by-side diff with in-line comments
Download patch
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 75a71a9a056154629785839653b4eebac47ec2d3..a19a34cd1b53035009338e0bfce52d84646e4842 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -118,7 +118,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
sourceInformationBuilder.buildVariableDeclaration();
this.localsHandler = new LocalsHandler(this, targetElement, targetElement,
contextClass, null, nativeData, interceptorData);
- _targetStack.add(target);
+ _targetStack.add(targetElement);
}
@deprecated // Use [_elementMap] instead.
@@ -159,7 +159,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
field.initializer.accept(this);
HInstruction fieldValue = pop();
HInstruction checkInstruction = typeBuilder.potentiallyCheckOrTrustType(
- fieldValue, astAdapter.getDartTypeIfValid(field.type));
+ fieldValue, _getDartTypeIfValid(field.type));
stack.add(checkInstruction);
} else {
stack.add(graph.addConstantNull(closedWorld));
@@ -169,6 +169,11 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
closeFunction();
}
+ DartType _getDartTypeIfValid(ir.DartType type) {
+ if (type is ir.InvalidType) return null;
+ return _elementMap.getDartType(type);
+ }
+
/// Pops the most recent instruction from the stack and 'boolifies' it.
///
/// Boolification is checking if the value is '=== true'.
@@ -251,7 +256,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// TODO(sra): Checked mode parameter checks.
// Collect field values for the current class.
- Map<ir.Field, HInstruction> fieldValues =
+ Map<FieldEntity, HInstruction> fieldValues =
_collectFieldValues(constructedClass);
List<ir.Constructor> constructorChain = <ir.Constructor>[];
_buildInitializers(constructor, constructorChain, fieldValues);
@@ -262,9 +267,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
ClassElement cls = _elementMap.getClass(constructedClass);
cls.forEachInstanceField(
(ClassElement enclosingClass, FieldElement member) {
- var value = fieldValues[astAdapter.getFieldFromElement(member)];
- assert(value != null,
- 'No value for field ${member} aka ${astAdapter.getFieldFromElement(member)}');
+ var value = fieldValues[member];
+ assert(value != null, 'No value for field ${member}');
constructorArguments.add(value);
}, includeSuperAndInjectedMembers: true);
@@ -315,7 +319,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// Pass uncaptured arguments first, captured arguments in a box, then type
// arguments.
- ConstructorElement constructorElement = astAdapter.getElement(body);
+ ConstructorElement constructorElement = astAdapter.getConstructor(body);
ClosureClassMap parameterClosureData =
closureToClassMapper.getMemberMap(constructorElement);
@@ -371,44 +375,42 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
add(invoke);
}
- withCurrentIrNode(ir.Node node, f()) {
- reporter.withCurrentElement(astAdapter.getElement(node), f);
- }
-
/// Sets context for generating code that is the result of inlining
/// [inlinedTarget].
- inlinedFrom(ir.TreeNode inlinedTarget, f()) {
- withCurrentIrNode(inlinedTarget, () {
+ inlinedFrom(MemberEntity inlinedTarget, f()) {
+ reporter.withCurrentElement(inlinedTarget, () {
SourceInformationBuilder oldSourceInformationBuilder =
sourceInformationBuilder;
// TODO(sra): Update sourceInformationBuilder to Kernel.
// sourceInformationBuilder =
// sourceInformationBuilder.forContext(resolvedAst);
+
+ _elementMap.enterInlinedMember(inlinedTarget);
_targetStack.add(inlinedTarget);
var result = f();
sourceInformationBuilder = oldSourceInformationBuilder;
_targetStack.removeLast();
+ _elementMap.leaveInlinedMember(inlinedTarget);
return result;
});
}
/// Maps the instance fields of a class to their SSA values.
- Map<ir.Field, HInstruction> _collectFieldValues(ir.Class clazz) {
- final fieldValues = <ir.Field, HInstruction>{};
+ Map<FieldEntity, HInstruction> _collectFieldValues(ir.Class clazz) {
+ Map<FieldEntity, HInstruction> fieldValues = <FieldEntity, HInstruction>{};
- for (var field in clazz.fields) {
- if (field.isInstanceMember) {
- if (field.initializer == null) {
+ for (ir.Field node in clazz.fields) {
+ if (node.isInstanceMember) {
+ FieldEntity field = _elementMap.getField(node);
+ if (node.initializer == null) {
fieldValues[field] = graph.addConstantNull(closedWorld);
} else {
// Gotta update the resolvedAst when we're looking at field values
// outside the constructor.
- astAdapter.pushResolvedAst(field);
inlinedFrom(field, () {
- field.initializer.accept(this);
+ node.initializer.accept(this);
fieldValues[field] = pop();
});
- astAdapter.popResolvedAstStack();
}
}
}
@@ -420,7 +422,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void _buildInitializers(
ir.Constructor constructor,
List<ir.Constructor> constructorChain,
- Map<ir.Field, HInstruction> fieldValues) {
+ Map<FieldEntity, HInstruction> fieldValues) {
astAdapter.assertAtResolvedAstFor(constructor);
constructorChain.add(constructor);
@@ -428,7 +430,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
for (var initializer in constructor.initializers) {
if (initializer is ir.FieldInitializer) {
initializer.value.accept(this);
- fieldValues[initializer.field] = pop();
+ fieldValues[_elementMap.getField(initializer.field)] = pop();
} else if (initializer is ir.SuperInitializer) {
assert(!foundSuperOrRedirectCall);
foundSuperOrRedirectCall = true;
@@ -509,9 +511,9 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
localsHandler.updateLocal(
localsHandler.getTypeVariableAsLocal(
- astAdapter.getDartType(new ir.TypeParameterType(parameter))),
+ _elementMap.getDartType(new ir.TypeParameterType(parameter))),
typeBuilder.analyzeTypeArgument(
- astAdapter.getDartType(argument), sourceElement));
+ _elementMap.getDartType(argument), sourceElement));
}
}
@@ -521,7 +523,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void _inlineRedirectingInitializer(
ir.RedirectingInitializer initializer,
List<ir.Constructor> constructorChain,
- Map<ir.Field, HInstruction> fieldValues,
+ Map<FieldEntity, HInstruction> fieldValues,
ir.Constructor caller) {
var superOrRedirectConstructor = initializer.target;
var arguments = _normalizeAndBuildArguments(
@@ -543,7 +545,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void _inlineSuperInitializer(
ir.SuperInitializer initializer,
List<ir.Constructor> constructorChain,
- Map<ir.Field, HInstruction> fieldValues,
+ Map<FieldEntity, HInstruction> fieldValues,
ir.Constructor caller) {
var target = initializer.target;
var arguments =
@@ -557,7 +559,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
ir.Class cls = target.enclosingClass;
- inlinedFrom(target, () {
+ inlinedFrom(_elementMap.getConstructor(target), () {
fieldValues.addAll(_collectFieldValues(cls));
});
@@ -570,7 +572,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
ir.Constructor constructor,
List<HInstruction> arguments,
List<ir.Constructor> constructorChain,
- Map<ir.Field, HInstruction> fieldValues,
+ Map<FieldEntity, HInstruction> fieldValues,
ir.Constructor caller) {
var signature = astAdapter.getFunctionSignature(constructor.function);
var index = 0;
@@ -584,8 +586,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
});
// Set the locals handler state as if we were inlining the constructor.
- astAdapter.pushResolvedAst(constructor);
- ConstructorElement astElement = astAdapter.getElement(constructor);
+ ConstructorElement astElement = _elementMap.getConstructor(constructor);
ResolvedAst resolvedAst = astElement.resolvedAst;
ClosureClassMap oldClosureData = localsHandler.closureData;
ClosureClassMap newClosureData =
@@ -595,11 +596,10 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
localsHandler.enterScope(resolvedAst.node,
forGenerativeConstructorBody: astElement.isGenerativeConstructorBody);
}
- inlinedFrom(constructor, () {
+ inlinedFrom(astElement, () {
_buildInitializers(constructor, constructorChain, fieldValues);
});
localsHandler.closureData = oldClosureData;
- astAdapter.popResolvedAstStack();
}
/// Builds generative constructor body.
@@ -625,8 +625,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
if (parent is ir.Procedure &&
parent.kind == ir.ProcedureKind.Operator &&
parent.name.name == '==') {
- if (!backend
- .operatorEqHandlesNullArgument(_elementMap.getMethod(parent))) {
+ MethodElement method = _elementMap.getMethod(parent);
+ if (!backend.operatorEqHandlesNullArgument(method)) {
handleIf(
visitCondition: () {
HParameterValue parameter = parameters.values.first;
@@ -636,8 +636,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
visitThen: () {
closeAndGotoExit(new HReturn(
graph.addConstantBool(false, closedWorld),
- sourceInformationBuilder
- .buildImplicitReturn(astAdapter.getElement(parent))));
+ sourceInformationBuilder.buildImplicitReturn(method)));
},
visitElse: null,
// TODO(27394): Add sourceInformation via
@@ -713,29 +712,9 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// TODO(sra): Re-implement type builder using Kernel types and the
// `target` for context.
@override
- Element get sourceElement => _sourceElementForTarget(_targetStack.last);
-
- List<ir.Node> _targetStack = <ir.Node>[];
+ MemberElement get sourceElement => _targetStack.last;
- Element _sourceElementForTarget(ir.Node target) {
- // For closure-converted (i.e. local functions) the source element is the
- // 'call' method of the class that represents the closure.
- Element callMethodOfClosureClass() {
- LocalFunctionElement element = astAdapter.getElement(target);
- ClosureClassMap classMap =
- closureToClassMapper.getLocalFunctionMap(element);
- return classMap.callElement;
- }
-
- if (target is ir.FunctionExpression) {
- return callMethodOfClosureClass();
- }
- if (target is ir.FunctionDeclaration) {
- return callMethodOfClosureClass();
- }
- Element element = astAdapter.getElement(target);
- return element;
- }
+ List<MemberEntity> _targetStack = <MemberEntity>[];
@override
void visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded checkLoad) {
@@ -949,7 +928,8 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void buildInitializer() {
forInStatement.iterable.accept(this);
array = pop();
- isFixed = astAdapter.isFixedLength(array.instructionType, closedWorld);
+ isFixed =
+ _typeInferenceMap.isFixedLength(array.instructionType, closedWorld);
localsHandler.updateLocal(
indexVariable, graph.addConstantInt(0, closedWorld));
originalLength = buildGetLength();
@@ -2048,7 +2028,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
add(new HStaticStore(
_elementMap.getMember(staticTarget),
typeBuilder.potentiallyCheckOrTrustType(
- value, astAdapter.getDartTypeIfValid(staticTarget.setterType))));
+ value, _getDartTypeIfValid(staticTarget.setterType))));
}
stack.add(value);
}
@@ -2135,7 +2115,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
void _visitLocalSetter(ir.VariableDeclaration variable, HInstruction value) {
- LocalElement local = astAdapter.getElement(variable);
+ LocalElement local = astAdapter.getLocal(variable);
// Give the value a name if it doesn't have one already.
if (value.sourceElement == null) {
@@ -2146,7 +2126,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
localsHandler.updateLocal(
local,
typeBuilder.potentiallyCheckOrTrustType(
- value, astAdapter.getDartTypeIfValid(variable.type)));
+ value, _getDartTypeIfValid(variable.type)));
}
@override
@@ -2780,7 +2760,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
@override
visitFunctionNode(ir.FunctionNode node) {
- LocalFunctionElement methodElement = astAdapter.getElement(node);
+ Local methodElement = _elementMap.getLocalFunction(node);
ClosureClassMap nestedClosureData =
closureToClassMapper.getLocalFunctionMap(methodElement);
assert(nestedClosureData != null);
@@ -2807,8 +2787,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
visitFunctionDeclaration(ir.FunctionDeclaration declaration) {
assert(isReachable);
declaration.function.accept(this);
- LocalFunctionElement localFunction =
- astAdapter.getElement(declaration.function);
+ Local localFunction = _elementMap.getLocalFunction(declaration.function);
localsHandler.updateLocal(localFunction, pop());
}
@@ -3360,7 +3339,7 @@ class TryCatchFinallyBuilder {
catchesIndex++;
if (catchBlock.exception != null) {
LocalVariableElement exceptionVariable =
- kernelBuilder.astAdapter.getElement(catchBlock.exception);
+ kernelBuilder.astAdapter.getLocal(catchBlock.exception);
kernelBuilder.localsHandler
.updateLocal(exceptionVariable, unwrappedException);
}
@@ -3372,7 +3351,7 @@ class TryCatchFinallyBuilder {
kernelBuilder._commonElements.traceFromException));
HInstruction traceInstruction = kernelBuilder.pop();
LocalVariableElement traceVariable =
- kernelBuilder.astAdapter.getElement(catchBlock.stackTrace);
+ kernelBuilder.astAdapter.getLocal(catchBlock.stackTrace);
kernelBuilder.localsHandler
.updateLocal(traceVariable, traceInstruction);
}

Powered by Google App Engine
This is Rietveld 408576698