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

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

Issue 1212433002: Implement SsaBuilder without the ResolvedVisitor. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 6 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/ssa.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/ssa/builder.dart
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 50fa510cee2b5419e9214dcabb19d4b9338af5c8..4c3a91838812ec472b8026ddb272f8afd5cdf984 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -1019,12 +1019,18 @@ class SwitchCaseJumpHandler extends TargetJumpHandler {
/**
* This class builds SSA nodes for functions represented in AST.
*/
-class SsaBuilder extends NewResolvedVisitor {
+class SsaBuilder extends ast.Visitor
+ with BaseImplementationOfCompoundsMixin,
+ SendResolverMixin,
+ SemanticSendResolvedMixin,
+ NewBulkMixin
+ implements SemanticSendVisitor {
final Compiler compiler;
final JavaScriptBackend backend;
final ConstantSystem constantSystem;
final CodegenWorkItem work;
final RuntimeTypes rti;
+ TreeElements elements;
SourceInformationBuilder sourceInformationBuilder;
bool inLazyInitializerExpression = false;
@@ -1119,13 +1125,26 @@ class SsaBuilder extends NewResolvedVisitor {
this.constantSystem = backend.constantSystem,
this.work = work,
this.rti = backend.rti,
- super(work.resolutionTree) {
+ this.elements = work.resolutionTree {
localsHandler = new LocalsHandler(this, work.element, null);
sourceElementStack.add(work.element);
sourceInformationBuilder =
sourceInformationFactory.forContext(work.element.implementation);
}
+ @override
+ SemanticSendVisitor get sendVisitor => this;
+
+ @override
+ void visitNode(ast.Node node) {
+ internalError(node, "Unhandled node: $node");
+ }
+
+ @override
+ void apply(ast.Node node, [_]) {
+ node.accept(this);
+ }
+
CodegenRegistry get registry => work.registry;
/// Returns the current source element.
@@ -3123,9 +3142,14 @@ class SsaBuilder extends NewResolvedVisitor {
localsHandler.updateLocal(localFunction, pop());
}
+ @override
+ void visitThisGet(ast.Identifier node, [_]) {
+ stack.add(localsHandler.readThis());
+ }
+
visitIdentifier(ast.Identifier node) {
if (node.isThis()) {
- stack.add(localsHandler.readThis());
+ visitThisGet(node);
} else {
compiler.internalError(node,
"SsaFromAstMixin.visitIdentifier on non-this.");
@@ -4401,18 +4425,6 @@ class SsaBuilder extends NewResolvedVisitor {
generateSuperNoSuchMethodSend(node, selector, arguments);
}
- /// Handle super constructor invocation.
- @override
- void handleSuperConstructorInvoke(ast.Send node) {
- Selector selector = elements.getSelector(node);
- Element element = elements[node];
- if (selector.applies(element, compiler.world)) {
- generateSuperInvoke(node, element);
- } else {
- generateWrongArgumentCountError(node, element, node.arguments);
- }
- }
-
@override
void visitUnresolvedSuperIndex(
ast.Send node,
@@ -4575,6 +4587,20 @@ class SsaBuilder extends NewResolvedVisitor {
ast.NodeList arguments,
CallStructure callStructure,
_) {
+ handleInvalidSuperInvoke(node, arguments);
+ }
+
+ @override
+ void visitSuperSetterInvoke(
+ ast.Send node,
+ SetterElement setter,
+ ast.NodeList arguments,
+ CallStructure callStructure,
+ _) {
+ handleInvalidSuperInvoke(node, arguments);
+ }
+
+ void handleInvalidSuperInvoke(ast.Send node, ast.NodeList arguments) {
Selector selector = elements.getSelector(node);
List<HInstruction> inputs = <HInstruction>[];
addGenericSendArgumentsToList(arguments.nodes, inputs);
@@ -4760,7 +4786,7 @@ class SsaBuilder extends NewResolvedVisitor {
return pop();
}
- handleNewSend(ast.NewExpression node) {
+ void handleNewSend(ast.NewExpression node) {
ast.Send send = node.send;
generateIsDeferredLoadedCheckOfSend(send);
@@ -5427,7 +5453,12 @@ class SsaBuilder extends NewResolvedVisitor {
}
@override
- handleNewExpression(ast.NewExpression node) {
+ void bulkHandleNode(ast.Node node, String message, _) {
+ internalError(node, "Unexpected bulk handled node: $node");
+ }
+
+ @override
+ void bulkHandleNew(ast.NewExpression node, [_]) {
Element element = elements[node.send];
final bool isSymbolConstructor = element == compiler.symbolConstructor;
if (!Elements.isErroneous(element)) {
@@ -5463,6 +5494,17 @@ class SsaBuilder extends NewResolvedVisitor {
}
}
+ @override
+ void errorNonConstantConstructorInvoke(
+ ast.NewExpression node,
+ Element element,
+ DartType type,
+ ast.NodeList arguments,
+ CallStructure callStructure,
+ _) {
+ bulkHandleNew(node);
+ }
+
void pushInvokeDynamic(ast.Node node,
Selector selector,
TypeMask mask,
@@ -5690,6 +5732,369 @@ class SsaBuilder extends NewResolvedVisitor {
}
@override
+ void handleSuperCompounds(
+ ast.SendSet node,
+ Element getter,
+ CompoundGetter getterKind,
+ Element setter,
+ CompoundSetter setterKind,
+ CompoundRhs rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitFinalSuperFieldSet(
+ ast.SendSet node,
+ FieldElement field,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperFieldSet(
+ ast.SendSet node,
+ FieldElement field,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperGetterSet(
+ ast.SendSet node,
+ FunctionElement getter,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperIndexSet(
+ ast.SendSet node,
+ FunctionElement function,
+ ast.Node index,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperMethodSet(
+ ast.Send node,
+ MethodElement method,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperSetterSet(
+ ast.SendSet node,
+ FunctionElement setter,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperIndexSet(
+ ast.Send node,
+ Element element,
+ ast.Node index,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperIndexPrefix(
+ ast.Send node,
+ MethodElement indexFunction,
+ MethodElement indexSetFunction,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperIndexPostfix(
+ ast.Send node,
+ MethodElement indexFunction,
+ MethodElement indexSetFunction,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperGetterIndexPrefix(
+ ast.Send node,
+ Element element,
+ MethodElement setter,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperGetterIndexPostfix(
+ ast.Send node,
+ Element element,
+ MethodElement setter,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperSetterIndexPrefix(
+ ast.Send node,
+ MethodElement indexFunction,
+ Element element,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperSetterIndexPostfix(
+ ast.Send node,
+ MethodElement indexFunction,
+ Element element,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperIndexPrefix(
+ ast.Send node,
+ Element element,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperIndexPostfix(
+ ast.Send node,
+ Element element,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperCompoundIndexSet(
+ ast.SendSet node,
+ MethodElement getter,
+ MethodElement setter,
+ ast.Node index,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperGetterCompoundIndexSet(
+ ast.Send node,
+ Element element,
+ MethodElement setter,
+ ast.Node index,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperSetterCompoundIndexSet(
+ ast.Send node,
+ MethodElement getter,
+ Element element,
+ ast.Node index,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperCompoundIndexSet(
+ ast.Send node,
+ Element element,
+ ast.Node index,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperFieldCompound(
+ ast.Send node,
+ FieldElement field,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitFinalSuperFieldCompound(
+ ast.Send node,
+ FieldElement field,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitFinalSuperFieldPrefix(
+ ast.Send node,
+ FieldElement field,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperPrefix(
+ ast.Send node,
+ Element element,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperPostfix(
+ ast.Send node,
+ Element element,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperCompound(
+ ast.Send node,
+ Element element,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitFinalSuperFieldPostfix(
+ ast.Send node,
+ FieldElement field,
+ IncDecOperator operator,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperFieldFieldCompound(
+ ast.Send node,
+ FieldElement readField,
+ FieldElement writtenField,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperGetterSetterCompound(
+ ast.Send node,
+ FunctionElement getter,
+ FunctionElement setter,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperMethodSetterCompound(
+ ast.Send node,
+ FunctionElement method,
+ FunctionElement setter,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperMethodCompound(
+ ast.Send node,
+ FunctionElement method,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperGetterCompound(
+ ast.Send node,
+ Element element,
+ MethodElement setter,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitUnresolvedSuperSetterCompound(
+ ast.Send node,
+ MethodElement getter,
+ Element element,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperFieldSetterCompound(
+ ast.Send node,
+ FieldElement field,
+ FunctionElement setter,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
+ void visitSuperGetterFieldCompound(
+ ast.Send node,
+ FunctionElement getter,
+ FieldElement field,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ handleSuperSendSet(node);
+ }
+
+ @override
void visitIndexSet(
ast.SendSet node,
ast.Node receiver,
@@ -5699,6 +6104,40 @@ class SsaBuilder extends NewResolvedVisitor {
generateDynamicSend(node);
}
+ @override
+ void visitCompoundIndexSet(
+ ast.SendSet node,
+ ast.Node receiver,
+ ast.Node index,
+ AssignmentOperator operator,
+ ast.Node rhs,
+ _) {
+ generateIsDeferredLoadedCheckOfSend(node);
+ handleIndexSendSet(node);
+ }
+
+ @override
+ void visitIndexPrefix(
+ ast.Send node,
+ ast.Node receiver,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ generateIsDeferredLoadedCheckOfSend(node);
+ handleIndexSendSet(node);
+ }
+
+ @override
+ void visitIndexPostfix(
+ ast.Send node,
+ ast.Node receiver,
+ ast.Node index,
+ IncDecOperator operator,
+ _) {
+ generateIsDeferredLoadedCheckOfSend(node);
+ handleIndexSendSet(node);
+ }
+
void handleIndexSendSet(ast.SendSet node) {
ast.Operator op = node.assignmentOperator;
if ("=" == op.source) {
@@ -6108,27 +6547,36 @@ class SsaBuilder extends NewResolvedVisitor {
}
@override
- handleSendSet(ast.SendSet node) {
- ast.Operator op = node.assignmentOperator;
- generateIsDeferredLoadedCheckOfSend(node);
- Element element = elements[node];
- if (!Elements.isUnresolved(element) && element.impliesType) {
- ast.Identifier selector = node.selector;
- generateThrowNoSuchMethod(node, selector.source,
- argumentNodes: node.arguments);
- } else if (node.isSuperCall) {
- handleSuperSendSet(node);
- } else if (node.isIndex) {
- handleIndexSendSet(node);
- } else if ("=" == op.source) {
- internalError(node, "Unexpected assignment.");
- } else if (identical(op.source, "is")) {
- compiler.internalError(op, "is-operator as SendSet.");
- } else {
- assert("++" == op.source || "--" == op.source ||
- node.assignmentOperator.source.endsWith("="));
- handleCompoundSendSet(node);
- }
+ void handleDynamicCompounds(
+ ast.Send node,
+ ast.Node receiver,
+ CompoundRhs rhs,
+ Selector getterSelector,
+ Selector setterSelector,
+ _) {
+ handleCompoundSendSet(node);
+ }
+
+ @override
+ void handleLocalCompounds(
+ ast.SendSet node,
+ LocalElement local,
+ CompoundRhs rhs,
+ _,
+ {bool isSetterValid}) {
+ handleCompoundSendSet(node);
+ }
+
+ @override
+ void handleStaticCompounds(
+ ast.SendSet node,
+ Element getter,
+ CompoundGetter getterKind,
+ Element setter,
+ CompoundSetter setterKind,
+ CompoundRhs rhs,
+ _) {
+ handleCompoundSendSet(node);
}
void visitLiteralInt(ast.LiteralInt node) {
@@ -7571,6 +8019,80 @@ class SsaBuilder extends NewResolvedVisitor {
localsHandler.updateLocal(returnLocal, value);
}
}
+
+ @override
+ void handleTypeLiteralConstantCompounds(
+ ast.SendSet node,
+ ConstantExpression constant,
+ CompoundRhs rhs,
+ _) {
+ if (rhs.operator.kind == BinaryOperatorKind.IF_NULL) {
+ handleCompoundSendSet(node);
+ } else {
+ handleTypeLiteralCompound(node);
+ }
+ }
+
+ @override
+ void handleTypeVariableTypeLiteralCompounds(
+ ast.SendSet node,
+ TypeVariableElement typeVariable,
+ CompoundRhs rhs,
+ _) {
+ handleTypeLiteralCompound(node);
+ }
+
+ void handleTypeLiteralCompound(ast.SendSet node) {
+ generateIsDeferredLoadedCheckOfSend(node);
+ ast.Identifier selector = node.selector;
+ generateThrowNoSuchMethod(node, selector.source,
+ argumentNodes: node.arguments);
+ }
+
+ @override
+ void visitConstantGet(
+ ast.Send node,
+ ConstantExpression constant,
+ _) {
+ visitNode(node);
+ }
+
+ @override
+ void visitConstantInvoke(
+ ast.Send node,
+ ConstantExpression constant,
+ ast.NodeList arguments,
+ CallStructure callStreucture,
+ _) {
+ visitNode(node);
+ }
+
+ @override
+ void errorInvalidAssert(
+ ast.Send node,
+ ast.NodeList arguments,
+ _) {
+ visitNode(node);
+ }
+
+ @override
+ void errorUndefinedBinaryExpression(
+ ast.Send node,
+ ast.Node left,
+ ast.Operator operator,
+ ast.Node right,
+ _) {
+ visitNode(node);
+ }
+
+ @override
+ void errorUndefinedUnaryExpression(
+ ast.Send node,
+ ast.Operator operator,
+ ast.Node expression,
+ _) {
+ visitNode(node);
+ }
}
/**
« no previous file with comments | « no previous file | pkg/compiler/lib/src/ssa/ssa.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698