store references to instruction copies

inside instruction
This commit is contained in:
Svetlana Isakova
2012-12-07 19:06:21 +04:00
parent d92e989c6e
commit 3ac45ecca7
17 changed files with 62 additions and 20 deletions
@@ -51,10 +51,14 @@ public abstract class AbstractJumpInstruction extends InstructionImpl {
this.resolvedTarget = outgoingEdgeTo(resolvedTarget); 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 @Override
public Instruction copy() { protected Instruction createCopy() {
return copy(targetLabel); return createCopy(targetLabel);
} }
} }
@@ -73,7 +73,7 @@ public class ConditionalJumpInstruction extends AbstractJumpInstruction {
} }
@Override @Override
AbstractJumpInstruction copy(@NotNull Label newLabel) { protected AbstractJumpInstruction createCopy(@NotNull Label newLabel) {
return new ConditionalJumpInstruction(onTrue, newLabel); return new ConditionalJumpInstruction(onTrue, newLabel);
} }
} }
@@ -36,4 +36,7 @@ public interface Instruction {
Collection<Instruction> getNextInstructions(); Collection<Instruction> getNextInstructions();
void accept(InstructionVisitor visitor); void accept(InstructionVisitor visitor);
@NotNull
Collection<Instruction> getCopies();
} }
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.cfg.pseudocode; package org.jetbrains.jet.lang.cfg.pseudocode;
import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -28,6 +29,7 @@ import java.util.LinkedHashSet;
public abstract class InstructionImpl implements Instruction { public abstract class InstructionImpl implements Instruction {
private Pseudocode owner; private Pseudocode owner;
private final Collection<Instruction> previousInstructions = new LinkedHashSet<Instruction>(); private final Collection<Instruction> previousInstructions = new LinkedHashSet<Instruction>();
private final Collection<Instruction> copies = Sets.newHashSet();
protected boolean isDead = false; protected boolean isDead = false;
protected InstructionImpl() { protected InstructionImpl() {
@@ -67,5 +69,29 @@ public abstract class InstructionImpl implements Instruction {
return isDead; return isDead;
} }
public abstract Instruction copy(); public final Instruction copy() {
return updateCopyInfo(createCopy());
}
protected abstract Instruction createCopy();
@NotNull
@Override
public Collection<Instruction> 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;
}
} }
@@ -73,7 +73,7 @@ public class LocalDeclarationInstruction extends InstructionWithNext {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new LocalDeclarationInstruction((JetDeclaration) element, body); return new LocalDeclarationInstruction((JetDeclaration) element, body);
} }
} }
@@ -69,7 +69,7 @@ public class NondeterministicJumpInstruction extends InstructionImpl{
@NotNull @NotNull
@Override @Override
public Collection<Instruction> getNextInstructions() { public Collection<Instruction> getNextInstructions() {
ArrayList<Instruction> targetInstructions = Lists.newArrayList(getResolvedTargets().values()); List<Instruction> targetInstructions = Lists.newArrayList(getResolvedTargets().values());
targetInstructions.add(getNext()); targetInstructions.add(getNext());
return targetInstructions; return targetInstructions;
} }
@@ -90,7 +90,16 @@ public class NondeterministicJumpInstruction extends InstructionImpl{
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new NondeterministicJumpInstruction(getTargetLabels()); return createCopy(getTargetLabels());
}
@NotNull
public final Instruction copy(@NotNull List<Label> newTargetLabels) {
return updateCopyInfo(createCopy(newTargetLabels));
}
private Instruction createCopy(@NotNull List<Label> newTargetLabels) {
return new NondeterministicJumpInstruction(newTargetLabels);
} }
} }
@@ -39,7 +39,7 @@ public class ReadUnitValueInstruction extends InstructionWithNext {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new ReadUnitValueInstruction((JetExpression) element); return new ReadUnitValueInstruction((JetExpression) element);
} }
} }
@@ -39,7 +39,7 @@ public class ReadValueInstruction extends InstructionWithNext {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new ReadValueInstruction(element); return new ReadValueInstruction(element);
} }
} }
@@ -49,7 +49,7 @@ public class ReturnNoValueInstruction extends AbstractJumpInstruction implements
} }
@Override @Override
AbstractJumpInstruction copy(@NotNull Label newLabel) { protected AbstractJumpInstruction createCopy(@NotNull Label newLabel) {
return new ReturnNoValueInstruction(element, newLabel); return new ReturnNoValueInstruction(element, newLabel);
} }
} }
@@ -50,7 +50,7 @@ public class ReturnValueInstruction extends AbstractJumpInstruction implements J
} }
@Override @Override
AbstractJumpInstruction copy(@NotNull Label newLabel) { protected AbstractJumpInstruction createCopy(@NotNull Label newLabel) {
return new ReturnValueInstruction((JetExpression) element, newLabel); return new ReturnValueInstruction((JetExpression) element, newLabel);
} }
} }
@@ -45,7 +45,7 @@ public class SubroutineEnterInstruction extends InstructionWithNext {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new SubroutineEnterInstruction(subroutine); return new SubroutineEnterInstruction(subroutine);
} }
} }
@@ -61,7 +61,7 @@ public class SubroutineExitInstruction extends InstructionImpl {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new SubroutineExitInstruction(subroutine, debugLabel); return new SubroutineExitInstruction(subroutine, debugLabel);
} }
} }
@@ -55,7 +55,7 @@ public class SubroutineSinkInstruction extends InstructionImpl {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new SubroutineSinkInstruction(subroutine, debugLabel); return new SubroutineSinkInstruction(subroutine, debugLabel);
} }
} }
@@ -40,7 +40,7 @@ public class UnconditionalJumpInstruction extends AbstractJumpInstruction {
} }
@Override @Override
AbstractJumpInstruction copy(@NotNull Label newLabel) { protected AbstractJumpInstruction createCopy(@NotNull Label newLabel) {
return new UnconditionalJumpInstruction(newLabel); return new UnconditionalJumpInstruction(newLabel);
} }
} }
@@ -39,7 +39,7 @@ public class UnsupportedElementInstruction extends InstructionWithNext {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new UnsupportedElementInstruction(element); return new UnsupportedElementInstruction(element);
} }
} }
@@ -49,7 +49,7 @@ public class VariableDeclarationInstruction extends InstructionWithNext {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
if (element instanceof JetParameter) { if (element instanceof JetParameter) {
return new VariableDeclarationInstruction((JetParameter) element); return new VariableDeclarationInstruction((JetParameter) element);
} }
@@ -52,7 +52,7 @@ public class WriteValueInstruction extends InstructionWithNext {
} }
@Override @Override
public Instruction copy() { protected Instruction createCopy() {
return new WriteValueInstruction(element, lValue); return new WriteValueInstruction(element, lValue);
} }
} }