From 6857694d1a171a5a95596befbbd119bf5eea5633 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Wed, 5 Mar 2014 19:29:14 +0400 Subject: [PATCH] added 'getParent' to Pseudocode fixed DataFlowInfoTest: variable data shouldn't be built for locals as independent declarations --- .../jet/lang/cfg/pseudocode/Pseudocode.java | 4 +++ .../lang/cfg/pseudocode/PseudocodeImpl.java | 25 ++++++++++++++++++- .../basic/UsageInFunctionLiteral.instructions | 22 ++++++++-------- .../jet/cfg/AbstractDataFlowTest.java | 2 +- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java index 23a3e2dae83..ce0ca0ce05f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.cfg.pseudocode; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetElement; import java.util.List; @@ -26,6 +27,9 @@ public interface Pseudocode { @NotNull JetElement getCorrespondingElement(); + @Nullable + Pseudocode getParent(); + @NotNull Set getLocalDeclarations(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudocodeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudocodeImpl.java index 0d7eb5d3a79..c68bec22e43 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudocodeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudocodeImpl.java @@ -78,6 +78,7 @@ public class PseudocodeImpl implements Pseudocode { private final List mutableInstructionList = new ArrayList(); private final List instructions = new ArrayList(); + private Pseudocode parent = null; private Set localDeclarations = null; //todo getters private final Map representativeInstructions = new HashMap(); @@ -122,6 +123,26 @@ public class PseudocodeImpl implements Pseudocode { return localDeclarations; } + @Override + @Nullable + public Pseudocode getParent() { + return parent; + } + + private void setParent(Pseudocode parent) { + this.parent = parent; + } + + @NotNull + public Pseudocode getRootPseudocode() { + Pseudocode parent = getParent(); + while (parent != null) { + if (parent.getParent() == null) return parent; + parent = parent.getParent(); + } + return this; + } + /*package*/ PseudocodeLabel createLabel(String name) { PseudocodeLabel label = new PseudocodeLabel(name); labels.add(label); @@ -292,7 +313,9 @@ public class PseudocodeImpl implements Pseudocode { @Override public void visitLocalFunctionDeclarationInstruction(LocalFunctionDeclarationInstruction instruction) { - ((PseudocodeImpl)instruction.getBody()).postProcess(); + PseudocodeImpl body = (PseudocodeImpl) instruction.getBody(); + body.setParent(PseudocodeImpl.this); + body.postProcess(); instruction.setNext(getSinkInstruction()); } diff --git a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions index 17e4152581e..b4cb6c42657 100644 --- a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions +++ b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions @@ -34,25 +34,25 @@ sink: } --------------------- L3: - INIT: in: {} out: {} - v(x: Int) INIT: in: {} out: {x=D} - w(x) INIT: in: {x=D} out: {x=ID} - mark(val y = x + a use(a)) INIT: in: {x=ID} out: {x=ID} - v(val y = x + a) INIT: in: {x=ID} out: {x=ID, y=D} - mark(x + a) INIT: in: {x=ID, y=D} out: {x=ID, y=D} USE: in: {a=READ, x=READ} out: {a=READ, x=READ} - r(x) USE: in: {a=READ} out: {a=READ, x=READ} + INIT: in: {a=ID, f=D} out: {a=ID, f=D} + v(x: Int) INIT: in: {a=ID, f=D} out: {a=ID, f=D, x=D} + w(x) INIT: in: {a=ID, f=D, x=D} out: {a=ID, f=D, x=ID} + mark(val y = x + a use(a)) INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID} + v(val y = x + a) INIT: in: {a=ID, f=D, x=ID} out: {a=ID, f=D, x=ID, y=D} + mark(x + a) INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=D} USE: in: {a=READ, x=READ} out: {a=READ, x=READ} + r(x) USE: in: {a=READ} out: {a=READ, x=READ} r(a) call(+, plus) - w(y) INIT: in: {x=ID, y=D} out: {x=ID, y=ID} - mark(use(a)) INIT: in: {x=ID, y=ID} out: {x=ID, y=ID} USE: in: {a=READ} out: {a=READ} - r(a) USE: in: {} out: {a=READ} + w(y) INIT: in: {a=ID, f=D, x=ID, y=D} out: {a=ID, f=D, x=ID, y=ID} + mark(use(a)) INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=D, x=ID, y=ID} USE: in: {a=READ} out: {a=READ} + r(a) USE: in: {} out: {a=READ} call(use, use) L4: error: INIT: in: {} out: {} sink: - INIT: in: {x=ID, y=ID} out: {x=ID, y=ID} USE: in: {} out: {} + INIT: in: {a=ID, f=D, x=ID, y=ID} out: {a=ID, f=D, x=ID, y=ID} USE: in: {} out: {} ===================== == use == fun use(vararg a: Any?) = a diff --git a/compiler/tests/org/jetbrains/jet/cfg/AbstractDataFlowTest.java b/compiler/tests/org/jetbrains/jet/cfg/AbstractDataFlowTest.java index ccbf36af0fe..c07e0a425a4 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/AbstractDataFlowTest.java +++ b/compiler/tests/org/jetbrains/jet/cfg/AbstractDataFlowTest.java @@ -42,7 +42,7 @@ public abstract class AbstractDataFlowTest extends AbstractPseudocodeTest { @NotNull StringBuilder out, @NotNull BindingContext bindingContext ) { - PseudocodeVariablesData pseudocodeVariablesData = new PseudocodeVariablesData(pseudocode, bindingContext); + PseudocodeVariablesData pseudocodeVariablesData = new PseudocodeVariablesData(pseudocode.getRootPseudocode(), bindingContext); final Map>> variableInitializers = pseudocodeVariablesData.getVariableInitializers(); final Map>> useStatusData =