do not store references to all copies (if it's a copy itself)
This commit is contained in:
@@ -30,6 +30,7 @@ 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();
|
private final Collection<Instruction> copies = Sets.newHashSet();
|
||||||
|
private Instruction original;
|
||||||
protected boolean isDead = false;
|
protected boolean isDead = false;
|
||||||
|
|
||||||
protected InstructionImpl() {
|
protected InstructionImpl() {
|
||||||
@@ -78,6 +79,12 @@ public abstract class InstructionImpl implements Instruction {
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<Instruction> getCopies() {
|
public Collection<Instruction> getCopies() {
|
||||||
|
if (original != null) {
|
||||||
|
Collection<Instruction> originalCopies = Sets.newHashSet(original.getCopies());
|
||||||
|
originalCopies.remove(this);
|
||||||
|
originalCopies.add(original);
|
||||||
|
return originalCopies;
|
||||||
|
}
|
||||||
return copies;
|
return copies;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,13 +92,15 @@ public abstract class InstructionImpl implements Instruction {
|
|||||||
copies.add(instruction);
|
copies.add(instruction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setOriginal(@NotNull Instruction original) {
|
||||||
|
assert this.original == null :
|
||||||
|
"Instruction can't have two originals: this.original = " + this.original + "; new original = " + original;
|
||||||
|
this.original = original;
|
||||||
|
}
|
||||||
|
|
||||||
protected Instruction updateCopyInfo(@NotNull Instruction instruction) {
|
protected Instruction updateCopyInfo(@NotNull Instruction instruction) {
|
||||||
for (Instruction copy : copies) {
|
|
||||||
((InstructionImpl)copy).addCopy(instruction);
|
|
||||||
((InstructionImpl)instruction).addCopy(copy);
|
|
||||||
}
|
|
||||||
addCopy(instruction);
|
addCopy(instruction);
|
||||||
((InstructionImpl)instruction).addCopy(this);
|
((InstructionImpl)instruction).setOriginal(this);
|
||||||
return instruction;
|
return instruction;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user