From: Fabian Stemmler Date: Mon, 16 Sep 2019 15:35:27 +0000 (+0200) Subject: Made MicroInstructions immutable X-Git-Url: https://mograsim.net/gitweb/?p=Mograsim.git;a=commitdiff_plain;h=95b1269b5d1ff51f4321e2182d3c37efa6ae093a Made MicroInstructions immutable --- diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java index d45c2772..28f88000 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java @@ -9,16 +9,16 @@ public interface MicroInstruction public MicroInstructionParameter getParameter(int index); - public void setParameter(int index, MicroInstructionParameter param); + public MicroInstructionParameter[] getParameters(); /** * @return The amount of {@link Mnemonic}s, the instruction is composed of */ public int getSize(); - public static MicroInstruction create(Runnable updateCallback, MicroInstructionParameter... parameters) + public static MicroInstruction create(MicroInstructionParameter... parameters) { - return new StandardMicroInstruction(updateCallback, parameters); + return new StandardMicroInstruction(parameters); } default BitVector toBitVector() diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java index 6625fa66..e5e34481 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java @@ -35,7 +35,7 @@ public interface MicroInstructionDefinition return Arrays.stream(getParameterClassifications()).mapToInt(e -> e.getExpectedBits()).reduce(0, (a, b) -> a + b); } - public default MicroInstruction createDefaultInstruction(Runnable updateCallback) + public default MicroInstruction createDefaultInstruction() { int size = size(); MicroInstructionParameter[] params = new MicroInstructionParameter[size]; @@ -45,7 +45,7 @@ public interface MicroInstructionDefinition ParameterClassification classification = classes[i]; params[i] = classification.getDefault(); } - return new StandardMicroInstruction(updateCallback, params); + return new StandardMicroInstruction(params); } public Optional getParameterDescription(int index); diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java index 5d4fac6b..6409f78d 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java @@ -4,5 +4,6 @@ import net.mograsim.machine.Memory; public interface MicroInstructionMemory extends Memory { + @Override public MicroInstructionMemoryDefinition getDefinition(); } diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java index d049e377..1aa518dc 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -35,8 +35,7 @@ public class MicroInstructionMemoryParser { for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) { - long iFinal = i; - memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line)); + memory.setCell(i, parse(miDef, line)); } } catch (IOException e) @@ -46,12 +45,11 @@ public class MicroInstructionMemoryParser for (; i <= maxAddr; i++) { - long iFinal = i; - memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal))); + memory.setCell(i, miDef.createDefaultInstruction()); } } - public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse) + public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse) { int size = definition.size(); String[] strings = toParse.split(","); @@ -65,7 +63,7 @@ public class MicroInstructionMemoryParser { params[i] = classes[i].parse(strings[i]); } - return new StandardMicroInstruction(updateCallback, params); + return new StandardMicroInstruction(params); } catch (Exception e) { diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java index c565432f..00acd1a8 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java @@ -4,13 +4,11 @@ import net.mograsim.machine.mi.parameters.MicroInstructionParameter; class StandardMicroInstruction implements MicroInstruction { - private final Runnable updateCallback; private MicroInstructionParameter[] parameters; - StandardMicroInstruction(Runnable updateCallback, MicroInstructionParameter... parameters) + StandardMicroInstruction(MicroInstructionParameter... parameters) { - this.updateCallback = updateCallback; - this.parameters = parameters; + this.parameters = parameters.clone(); } /** @@ -28,14 +26,10 @@ class StandardMicroInstruction implements MicroInstruction return parameters.length; } - /** - * @throws IndexOutOfBoundsException - */ @Override - public void setParameter(int index, MicroInstructionParameter param) + public MicroInstructionParameter[] getParameters() { - parameters[index] = param; - updateCallback.run(); + return parameters.clone(); } } diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java index 519c9b3a..7ef53d90 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java @@ -30,8 +30,7 @@ public class StandardMicroInstructionMemory implements MicroInstructionMemory int translatedAddress = translate(address); MicroInstruction actual = data[translatedAddress]; if (actual == null) - actual = data[translatedAddress] = definition.getMicroInstructionDefinition() - .createDefaultInstruction(() -> notifyObservers(address)); + actual = data[translatedAddress] = definition.getMicroInstructionDefinition().createDefaultInstruction(); return actual; } diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java index c3318b58..fa7a918b 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java @@ -6,8 +6,10 @@ import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.TableViewer; import net.mograsim.logic.core.types.Bit; +import net.mograsim.machine.mi.MicroInstruction; import net.mograsim.machine.mi.MicroInstructionDefinition; import net.mograsim.machine.mi.parameters.BooleanClassification; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; public class BooleanEditingSupport extends EditingSupport { @@ -40,13 +42,17 @@ public class BooleanEditingSupport extends EditingSupport @Override protected Object getValue(Object element) { - return ((InstructionTableRow) element).data.getParameter(index).getValue().getMSBit(0).equals(Bit.ONE); + InstructionTableRow row = (InstructionTableRow) element; + return row.data.getCell(row.address).getParameter(index).getValue().getMSBit(0).equals(Bit.ONE); } @Override protected void setValue(Object element, Object value) { - ((InstructionTableRow) element).data.setParameter(index, boolClass.get((Boolean) value)); + InstructionTableRow row = (InstructionTableRow) element; + MicroInstructionParameter[] params = row.data.getCell(row.address).getParameters(); + params[index] = boolClass.get((Boolean) value); + row.data.setCell(row.address, MicroInstruction.create(params)); viewer.update(element, null); } diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java index b8021b74..6519b628 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java @@ -16,7 +16,7 @@ public class InstructionTableContentProvider implements ILazyContentProvider public void updateElement(int index) { long address = memory.getDefinition().getMinimalAddress() + index; - viewer.replace(new InstructionTableRow(address, memory.getCell(address)), index); + viewer.replace(new InstructionTableRow(address, memory), index); } @Override diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java index 677d1668..7cef835b 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java @@ -1,11 +1,11 @@ package net.mograsim.plugin.tables.mi; -import net.mograsim.machine.mi.MicroInstruction; +import net.mograsim.machine.mi.MicroInstructionMemory; import net.mograsim.plugin.tables.TableRow; -public class InstructionTableRow extends TableRow +public class InstructionTableRow extends TableRow { - public InstructionTableRow(long address, MicroInstruction data) + public InstructionTableRow(long address, MicroInstructionMemory data) { super(address, data); } diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java index ce61581f..7134de12 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java @@ -19,7 +19,8 @@ public class IntegerColumnLabelProvider extends NumberColumnLabelProvider @Override public BigInteger getAsBigInteger(Object element) { - return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); + InstructionTableRow row = (InstructionTableRow) element; + return ((IntegerImmediate) row.data.getCell(row.address).getParameter(index)).getValueAsBigInteger(); } } diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java index d3b48ce4..4f5b6161 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java @@ -4,9 +4,11 @@ import java.math.BigInteger; import org.eclipse.jface.viewers.TableViewer; +import net.mograsim.machine.mi.MicroInstruction; import net.mograsim.machine.mi.MicroInstructionDefinition; import net.mograsim.machine.mi.parameters.IntegerClassification; import net.mograsim.machine.mi.parameters.IntegerImmediate; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; import net.mograsim.plugin.tables.DisplaySettings; import net.mograsim.plugin.tables.NumberCellEditingSupport; @@ -29,7 +31,9 @@ public class IntegerEditingSupport extends NumberCellEditingSupport protected void setAsBigInteger(Object element, BigInteger value) { InstructionTableRow row = ((InstructionTableRow) element); - row.data.setParameter(index, new IntegerImmediate(value, classification.getExpectedBits())); + MicroInstructionParameter[] params = row.data.getCell(row.address).getParameters(); + params[index] = new IntegerImmediate(value, classification.getExpectedBits()); + row.data.setCell(row.address, MicroInstruction.create(params)); provider.update(row.address); // viewer.update(element, null); Does not do anything for some reason } @@ -37,7 +41,8 @@ public class IntegerEditingSupport extends NumberCellEditingSupport @Override protected BigInteger getAsBigInteger(Object element) { - return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); + InstructionTableRow row = ((InstructionTableRow) element); + return ((IntegerImmediate) row.data.getCell(row.address).getParameter(index)).getValueAsBigInteger(); } } diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java index 765e4343..1140e683 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java @@ -6,7 +6,9 @@ import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; +import net.mograsim.machine.mi.MicroInstruction; import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; import net.mograsim.machine.mi.parameters.Mnemonic; import net.mograsim.machine.mi.parameters.MnemonicFamily; @@ -43,14 +45,17 @@ public class MnemonicEditingSupport extends EditingSupport @Override protected Object getValue(Object element) { - return ((Mnemonic) ((InstructionTableRow) element).data.getParameter(index)).ordinal(); + InstructionTableRow row = ((InstructionTableRow) element); + return ((Mnemonic) row.data.getCell(row.address).getParameter(index)).ordinal(); } @Override protected void setValue(Object element, Object value) { InstructionTableRow row = ((InstructionTableRow) element); - row.data.setParameter(index, family.get((Integer) value)); + MicroInstructionParameter[] params = row.data.getCell(row.address).getParameters(); + params[index] = family.get((Integer) value); + row.data.setCell(row.address, MicroInstruction.create(params)); provider.update(row.address); } diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java index 5e06370a..46e3ea7b 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java @@ -15,6 +15,7 @@ public class ParameterLabelProvider extends ColumnLabelProvider @Override public String getText(Object element) { - return ((InstructionTableRow) element).data.getParameter(index).toString(); + InstructionTableRow row = (InstructionTableRow) element; + return row.data.getCell(row.address).getParameter(index).toString(); } }