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

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

Issue 2932023003: Refactor LoopHandler to avoid calling KernelAstAdapter.getNode (Closed)
Patch Set: Created 3 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
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 0c48c62aa12213f45f47c9138b9cd4bb01970d46..340d3f031f2ee947534820d32495215106f8f715 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -86,7 +86,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
SourceInformationBuilder sourceInformationBuilder;
final KernelToElementMap _elementMap;
final KernelToTypeInferenceMap _typeInferenceMap;
- final KernelToLocalsMap _localsMap;
+ final KernelToLocalsMap localsMap;
LoopHandler<ir.Node> loopHandler;
TypeBuilder typeBuilder;
@@ -104,7 +104,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
this.compiler,
this._elementMap,
this._typeInferenceMap,
- this._localsMap,
+ this.localsMap,
this.closedWorld,
this._worldBuilder,
this.registry,
@@ -130,7 +130,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
CommonElements get _commonElements => _elementMap.commonElements;
HGraph build() {
- return reporter.withCurrentElement(_localsMap.currentMember, () {
+ return reporter.withCurrentElement(localsMap.currentMember, () {
// TODO(het): no reason to do this here...
HInstruction.idCounter = 0;
if (target is ir.Procedure) {
@@ -324,7 +324,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
closureToClassMapper.getMemberMap(constructorElement);
void handleParameter(ir.VariableDeclaration node) {
- Local parameter = _localsMap.getLocal(node);
+ Local parameter = localsMap.getLocal(node);
// If [parameter] is boxed, it will be a field in the box passed as the
// last parameter. So no need to directly pass it.
if (!localsHandler.isBoxed(parameter)) {
@@ -390,12 +390,12 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// sourceInformationBuilder =
// sourceInformationBuilder.forContext(resolvedAst);
- _localsMap.enterInlinedMember(inlinedTarget);
+ localsMap.enterInlinedMember(inlinedTarget);
_targetStack.add(inlinedTarget);
var result = f();
sourceInformationBuilder = oldSourceInformationBuilder;
_targetStack.removeLast();
- _localsMap.leaveInlinedMember(inlinedTarget);
+ localsMap.leaveInlinedMember(inlinedTarget);
return result;
});
}
@@ -428,7 +428,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
ir.Constructor constructor,
List<ir.Constructor> constructorChain,
Map<FieldEntity, HInstruction> fieldValues) {
- assert(_elementMap.getConstructor(constructor) == _localsMap.currentMember);
+ assert(_elementMap.getConstructor(constructor) == localsMap.currentMember);
constructorChain.add(constructor);
var foundSuperOrRedirectCall = false;
@@ -580,7 +580,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
ir.Constructor caller) {
var index = 0;
void handleParameter(ir.VariableDeclaration node) {
- Local parameter = _localsMap.getLocal(node);
+ Local parameter = localsMap.getLocal(node);
HInstruction argument = arguments[index++];
// Because we are inlining the initializer, we must update
// what was given as parameter. This will be used in case
@@ -680,7 +680,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
Map<Local, TypeMask> parameterMap = <Local, TypeMask>{};
if (function != null) {
void handleParameter(ir.VariableDeclaration node) {
- Local local = _localsMap.getLocal(node);
+ Local local = localsMap.getLocal(node);
parameterMap[local] =
_typeInferenceMap.getInferredTypeOfParameter(local);
}
@@ -994,7 +994,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
HInstruction value = new HIndex(array, index, null, type);
add(value);
- Local loopVariableLocal = _localsMap.getLocal(forInStatement.variable);
+ Local loopVariableLocal = localsMap.getLocal(forInStatement.variable);
localsHandler.updateLocal(loopVariableLocal, value);
// Hint to name loop value after name of loop variable.
if (loopVariableLocal is! SyntheticLocal) {
@@ -1055,7 +1055,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
TypeMask mask = _typeInferenceMap.typeOfIteratorCurrent(forInStatement);
_pushDynamicInvocation(forInStatement, mask, [iterator],
selector: Selectors.current);
- Local loopVariableLocal = _localsMap.getLocal(forInStatement.variable);
+ Local loopVariableLocal = localsMap.getLocal(forInStatement.variable);
HInstruction value = pop();
localsHandler.updateLocal(loopVariableLocal, value);
// Hint to name loop value after name of loop variable.
@@ -1097,7 +1097,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
_pushDynamicInvocation(forInStatement, mask, [streamIterator],
selector: Selectors.current);
localsHandler.updateLocal(
- _localsMap.getLocal(forInStatement.variable), pop());
+ localsMap.getLocal(forInStatement.variable), pop());
forInStatement.body.accept(this);
}
@@ -1161,12 +1161,14 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// TODO(efortuna): I think this can be rewritten using
// LoopHandler.handleLoop with some tricks about when the "update" happens.
LocalsHandler savedLocals = new LocalsHandler.from(localsHandler);
- localsHandler.startLoop(astAdapter.getNode(doStatement));
+ ClosureScope scopeData = localsMap.getClosureScopeForLoop(
+ localsHandler.closureData, doStatement);
+ localsHandler.startLoop(scopeData);
JumpHandler jumpHandler = loopHandler.beginLoopHeader(doStatement);
HLoopInformation loopInfo = current.loopInformation;
HBasicBlock loopEntryBlock = current;
HBasicBlock bodyEntryBlock = current;
- JumpTarget target = _localsMap.getJumpTarget(doStatement);
+ JumpTarget target = localsMap.getJumpTarget(doStatement);
bool hasContinues = target != null && target.isContinueTarget;
if (hasContinues) {
// Add extra block to hang labels on.
@@ -1178,7 +1180,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// Using a separate block is just a simple workaround.
bodyEntryBlock = openNewBlock();
}
- localsHandler.enterLoopBody(astAdapter.getNode(doStatement));
+ localsHandler.enterLoopBody(scopeData);
doStatement.body.accept(this);
// If there are no continues we could avoid the creation of the condition
@@ -1278,7 +1280,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// Since the body of the loop has a break, we attach a synthesized label
// to the body.
SubGraph bodyGraph = new SubGraph(bodyEntryBlock, bodyExitBlock);
- JumpTarget target = _localsMap.getJumpTarget(doStatement);
+ JumpTarget target = localsMap.getJumpTarget(doStatement);
LabelDefinition label = target.addLabel(null, 'loop');
label.setBreakTarget();
HLabeledBlockInformation info = new HLabeledBlockInformation(
@@ -1403,14 +1405,14 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
/// to distinguish the synthesized loop created for a switch statement with
/// continue statements from simple switch statements.
JumpHandler createJumpHandler(ir.TreeNode node, {bool isLoopJump: false}) {
- JumpTarget target = _localsMap.getJumpTarget(node);
+ JumpTarget target = localsMap.getJumpTarget(node);
assert(target is KernelJumpTarget);
if (target == null) {
// No breaks or continues to this node.
return new NullJumpHandler(reporter);
}
if (isLoopJump && node is ir.SwitchStatement) {
- return new KernelSwitchCaseJumpHandler(this, target, node, _localsMap);
+ return new KernelSwitchCaseJumpHandler(this, target, node, localsMap);
}
return new JumpHandler(this, target);
@@ -1420,7 +1422,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void visitBreakStatement(ir.BreakStatement breakStatement) {
assert(!isAborted());
handleInTryStatement();
- JumpTarget target = _localsMap.getJumpTarget(breakStatement.target);
+ JumpTarget target = localsMap.getJumpTarget(breakStatement.target);
assert(target != null);
JumpHandler handler = jumpTargets[target];
assert(handler != null);
@@ -1493,7 +1495,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
void visitContinueSwitchStatement(
ir.ContinueSwitchStatement switchStatement) {
handleInTryStatement();
- JumpTarget target = _localsMap.getJumpTarget(switchStatement.target);
+ JumpTarget target = localsMap.getJumpTarget(switchStatement.target);
assert(target != null);
JumpHandler handler = jumpTargets[target];
assert(handler != null);
@@ -1613,7 +1615,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
// This is because JS does not have this same "continue label" semantics so
// we encode it in the form of a state machine.
- JumpTarget switchTarget = _localsMap.getJumpTarget(switchStatement);
+ JumpTarget switchTarget = localsMap.getJumpTarget(switchStatement);
localsHandler.updateLocal(switchTarget, graph.addConstantNull(closedWorld));
var switchCases = switchStatement.cases;
@@ -2085,7 +2087,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
return;
}
- Local local = _localsMap.getLocal(variableGet.variable);
+ Local local = localsMap.getLocal(variableGet.variable);
stack.add(localsHandler.readLocal(local));
}
@@ -2133,7 +2135,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
@override
void visitVariableDeclaration(ir.VariableDeclaration declaration) {
- Local local = _localsMap.getLocal(declaration);
+ Local local = localsMap.getLocal(declaration);
if (declaration.initializer == null) {
HInstruction initialValue = graph.addConstantNull(closedWorld);
localsHandler.updateLocal(local, initialValue);
@@ -2149,7 +2151,7 @@ class KernelSsaBuilder extends ir.Visitor with GraphBuilder {
}
void _visitLocalSetter(ir.VariableDeclaration variable, HInstruction value) {
- Local local = _localsMap.getLocal(variable);
+ Local local = localsMap.getLocal(variable);
// Give the value a name if it doesn't have one already.
if (value.sourceElement == null) {
@@ -3374,7 +3376,7 @@ class TryCatchFinallyBuilder {
catchesIndex++;
if (catchBlock.exception != null) {
LocalVariableElement exceptionVariable =
- kernelBuilder._localsMap.getLocal(catchBlock.exception);
+ kernelBuilder.localsMap.getLocal(catchBlock.exception);
kernelBuilder.localsHandler
.updateLocal(exceptionVariable, unwrappedException);
}
@@ -3386,7 +3388,7 @@ class TryCatchFinallyBuilder {
kernelBuilder._commonElements.traceFromException));
HInstruction traceInstruction = kernelBuilder.pop();
LocalVariableElement traceVariable =
- kernelBuilder._localsMap.getLocal(catchBlock.stackTrace);
+ kernelBuilder.localsMap.getLocal(catchBlock.stackTrace);
kernelBuilder.localsHandler
.updateLocal(traceVariable, traceInstruction);
}

Powered by Google App Engine
This is Rietveld 408576698