summaryrefslogtreecommitdiff
path: root/chapter01/src/main/java
diff options
context:
space:
mode:
authordibyendumajumdar <mobile@majumdar.org.uk>2023-09-18 23:39:53 +0100
committerdibyendumajumdar <mobile@majumdar.org.uk>2023-09-18 23:39:53 +0100
commitab76b39f74776e8a0b09d4add10fcacb6668eb2e (patch)
tree2acc7c02dc278b8d90fd191e2f8fc811b5feee96 /chapter01/src/main/java
parent1372c413329221aca0837134747d7ba45ac0501b (diff)
downloadSimple-ab76b39f74776e8a0b09d4add10fcacb6668eb2e.tar.gz
Simple-ab76b39f74776e8a0b09d4add10fcacb6668eb2e.zip
Remove opcodes
Make the IdGenerator an input to the Parser
Diffstat (limited to 'chapter01/src/main/java')
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java2
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/node/Node.java36
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/node/NodeIDGenerator.java6
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/node/ReturnNode.java2
-rw-r--r--chapter01/src/main/java/com/seaofnodes/simple/node/StartNode.java2
6 files changed, 18 insertions, 34 deletions
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/Parser.java b/chapter01/src/main/java/com/seaofnodes/simple/Parser.java
index 2feeddf9..abaedd05 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/Parser.java
@@ -22,8 +22,8 @@ public class Parser {
private StartNode _startNode;
- public Parser() {
- _idGenerator = new NodeIDGenerator();
+ public Parser(NodeIDGenerator idGenerator) {
+ _idGenerator = idGenerator;
}
public StartNode parse(String source) {
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java b/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
index 31718a1d..bdf3340d 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/node/ConstantNode.java
@@ -14,7 +14,7 @@ public class ConstantNode extends Node {
public final long _value;
public ConstantNode(NodeIDGenerator idGenerator, long value, StartNode startNode) {
- super(idGenerator, OP_CONSTANT, startNode);
+ super(idGenerator, startNode);
_value = value;
}
}
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java
index e78ab19a..22ff8e3e 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -9,25 +9,8 @@ import java.util.List;
* The Node class provides common functionality used by all subtypes.
* Subtypes of Node specialize by overriding methods.
*/
-public class Node {
+public abstract class Node {
- /**
- * @see StartNode
- */
- static final byte OP_START = 1;
- /**
- * @see ReturnNode
- */
- static final byte OP_RETURN = 2;
- /**
- * @see ConstantNode
- */
- static final byte OP_CONSTANT = 3;
-
- /**
- * The opcode for this node
- */
- public final byte _opCode;
/**
* Each node has a unique dense Node ID within a compilation context
@@ -53,18 +36,18 @@ public class Node {
* Note that the outputs are derived from inputs, it appears that
* outputs are therefore a performance optimization to make it easier to
* traverse the graph. The Sea of Nodes documentation in chapter 1 does not
- * mention these outputs list.
+ * mention the outputs list.
*/
public final List<Node> _outputs;
- protected Node(NodeIDGenerator idGenerator, byte opCode, Node ...inputs)
+ protected Node(NodeIDGenerator idGenerator, Node ...inputs)
{
_nid = idGenerator.newNodeID(); // allocate unique dense ID
- _opCode = opCode;
_inputs = Arrays.asList(inputs);
- _outputs = new ArrayList<>();
- for (int i = 0; i < _inputs.size(); i++) {
- Node n = _inputs.get(i);
+ _outputs = new ArrayList<>(); // The outputs will be populated by nodes that use this as input
+
+ // Add this to as output on all nodes that are inputs
+ for (Node n : _inputs) {
if (n != null)
n._outputs.add(this);
}
@@ -79,6 +62,11 @@ public class Node {
public int numInputs() { return _inputs.size(); }
+ /**
+ * Gets the ith output node
+ * @param i Offset of the output node
+ * @return Output node (not null)
+ */
public Node out(int i) { return _outputs.get(i); }
public int numOutputs() { return _outputs.size(); }
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/node/NodeIDGenerator.java b/chapter01/src/main/java/com/seaofnodes/simple/node/NodeIDGenerator.java
index 96a292df..5c022160 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/node/NodeIDGenerator.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/node/NodeIDGenerator.java
@@ -5,15 +5,11 @@ package com.seaofnodes.simple.node;
*/
public class NodeIDGenerator {
/**
- * Counter for node IDs, do not hand out NID 0
- * (Presumably) because it is used for the control node?
+ * Counter for node IDs, do not hand out NID 0; this is just for safety
*/
private int nodeIDCounter = 1;
public int newNodeID() {
- if (nodeIDCounter > 100000) {
- throw new RuntimeException("infinite node create loop");
- }
return nodeIDCounter++;
}
}
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter01/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
index 0b62cd4c..3b539ead 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
@@ -11,6 +11,6 @@ package com.seaofnodes.simple.node;
public class ReturnNode extends Node implements Control {
public ReturnNode(NodeIDGenerator idGenerator, Node... inputs) {
- super(idGenerator, OP_RETURN, inputs);
+ super(idGenerator, inputs);
}
}
diff --git a/chapter01/src/main/java/com/seaofnodes/simple/node/StartNode.java b/chapter01/src/main/java/com/seaofnodes/simple/node/StartNode.java
index 7a9233a8..11043a79 100644
--- a/chapter01/src/main/java/com/seaofnodes/simple/node/StartNode.java
+++ b/chapter01/src/main/java/com/seaofnodes/simple/node/StartNode.java
@@ -8,6 +8,6 @@ package com.seaofnodes.simple.node;
public class StartNode extends Node implements Control {
public StartNode(NodeIDGenerator idGenerator, Node... inputs) {
- super(idGenerator, OP_START, inputs);
+ super(idGenerator, inputs);
}
}