From 3ac45ecca72488c8536fc9f7479754f948bc703a Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 7 Dec 2012 19:06:21 +0400 Subject: [PATCH] store references to instruction copies inside instruction --- .../pseudocode/AbstractJumpInstruction.java | 10 +++++-- .../ConditionalJumpInstruction.java | 2 +- .../jet/lang/cfg/pseudocode/Instruction.java | 3 ++ .../lang/cfg/pseudocode/InstructionImpl.java | 28 ++++++++++++++++++- .../LocalDeclarationInstruction.java | 2 +- .../NondeterministicJumpInstruction.java | 15 ++++++++-- .../pseudocode/ReadUnitValueInstruction.java | 2 +- .../cfg/pseudocode/ReadValueInstruction.java | 2 +- .../pseudocode/ReturnNoValueInstruction.java | 2 +- .../pseudocode/ReturnValueInstruction.java | 2 +- .../SubroutineEnterInstruction.java | 2 +- .../pseudocode/SubroutineExitInstruction.java | 2 +- .../pseudocode/SubroutineSinkInstruction.java | 2 +- .../UnconditionalJumpInstruction.java | 2 +- .../UnsupportedElementInstruction.java | 2 +- .../VariableDeclarationInstruction.java | 2 +- .../cfg/pseudocode/WriteValueInstruction.java | 2 +- 17 files changed, 62 insertions(+), 20 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/AbstractJumpInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/AbstractJumpInstruction.java index 04b0b3b94fa..35aa6c81f05 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/AbstractJumpInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/AbstractJumpInstruction.java @@ -51,10 +51,14 @@ public abstract class AbstractJumpInstruction extends InstructionImpl { this.resolvedTarget = outgoingEdgeTo(resolvedTarget); } - abstract AbstractJumpInstruction copy(@NotNull Label newLabel); + protected abstract AbstractJumpInstruction createCopy(@NotNull Label newLabel); + + final public Instruction copy(@NotNull Label newLabel) { + return updateCopyInfo(createCopy(newLabel)); + } @Override - public Instruction copy() { - return copy(targetLabel); + protected Instruction createCopy() { + return createCopy(targetLabel); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java index 7566a413940..92cd38b374a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/ConditionalJumpInstruction.java @@ -73,7 +73,7 @@ public class ConditionalJumpInstruction extends AbstractJumpInstruction { } @Override - AbstractJumpInstruction copy(@NotNull Label newLabel) { + protected AbstractJumpInstruction createCopy(@NotNull Label newLabel) { return new ConditionalJumpInstruction(onTrue, newLabel); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java index 182b46fa610..041dbc7008c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Instruction.java @@ -36,4 +36,7 @@ public interface Instruction { Collection getNextInstructions(); void accept(InstructionVisitor visitor); + + @NotNull + Collection getCopies(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java index 7399879db8d..3724b47315d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionImpl.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.cfg.pseudocode; +import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,6 +29,7 @@ import java.util.LinkedHashSet; public abstract class InstructionImpl implements Instruction { private Pseudocode owner; private final Collection previousInstructions = new LinkedHashSet(); + private final Collection copies = Sets.newHashSet(); protected boolean isDead = false; protected InstructionImpl() { @@ -67,5 +69,29 @@ public abstract class InstructionImpl implements Instruction { return isDead; } - public abstract Instruction copy(); + public final Instruction copy() { + return updateCopyInfo(createCopy()); + } + + protected abstract Instruction createCopy(); + + @NotNull + @Override + public Collection getCopies() { + return copies; + } + + private void addCopy(@NotNull Instruction instruction) { + copies.add(instruction); + } + + protected Instruction updateCopyInfo(@NotNull Instruction instruction) { + for (Instruction copy : copies) { + ((InstructionImpl)copy).addCopy(instruction); + ((InstructionImpl)instruction).addCopy(copy); + } + addCopy(instruction); + ((InstructionImpl)instruction).addCopy(this); + return instruction; + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java index 1d52147f04b..a409565b2b7 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java @@ -73,7 +73,7 @@ public class LocalDeclarationInstruction extends InstructionWithNext { } @Override - public Instruction copy() { + protected Instruction createCopy() { return new LocalDeclarationInstruction((JetDeclaration) element, body); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java index c24077d2b41..9885ddabdc8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/NondeterministicJumpInstruction.java @@ -69,7 +69,7 @@ public class NondeterministicJumpInstruction extends InstructionImpl{ @NotNull @Override public Collection getNextInstructions() { - ArrayList targetInstructions = Lists.newArrayList(getResolvedTargets().values()); + List targetInstructions = Lists.newArrayList(getResolvedTargets().values()); targetInstructions.add(getNext()); return targetInstructions; } @@ -90,7 +90,16 @@ public class NondeterministicJumpInstruction extends InstructionImpl{ } @Override - public Instruction copy() { - return new NondeterministicJumpInstruction(getTargetLabels()); + protected Instruction createCopy() { + return createCopy(getTargetLabels()); + } + + @NotNull + public final Instruction copy(@NotNull List