summaryrefslogtreecommitdiff
path: root/chapter05/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
Diffstat (limited to 'chapter05/src/main/java/com/seaofnodes')
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/Parser.java11
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/Node.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java5
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/ScopeNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java12
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java2
8 files changed, 26 insertions, 12 deletions
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java b/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java
index b7e561e1..79d98792 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/GraphVisualizer.java
@@ -122,7 +122,7 @@ public class GraphVisualizer {
sb.append( "\t}\n".repeat( level ) ); // End all Scope clusters
}
- private String makeScopeName(ScopeNode sn, int level) { return sn.label() + "_" + level; }
+ private String makeScopeName(ScopeNode sn, int level) { return sn.uniqueName() + "_" + level; }
private String makePortName(String scopeName, String varName) { return scopeName + "_" + varName; }
// Walk the node edges
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java
index 4225e67b..3e832610 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/Parser.java
@@ -29,6 +29,9 @@ public class Parser {
*/
public static StartNode START;
+ public StopNode STOP;
+
+ // The Lexer. Thin wrapper over a byte[] buffer with a cursor.
private final Lexer _lexer;
/**
@@ -57,6 +60,7 @@ public class Parser {
_scope = new ScopeNode();
START = new StartNode(new Type[]{ Type.CONTROL, arg });
START.peephole();
+ STOP = new StopNode();
}
public Parser(String source) {
@@ -69,13 +73,14 @@ public class Parser {
private Node ctrl(Node n) { return _scope.ctrl(n); }
- public ReturnNode parse() {
+ public StopNode parse() {
_allScopes.push(_scope);
_scope.push();
try {
_scope.define(CTRL , new ProjNode(START, 0, CTRL ).peephole());
_scope.define("arg", new ProjNode(START, 1, "arg").peephole());
- return (ReturnNode) parseBlock();
+ parseBlock();
+ return STOP;
}
finally {
_scope.pop();
@@ -164,7 +169,7 @@ public class Parser {
*/
private Node parseReturn() {
var expr = require(parseExpression(), ";");
- Node ret = new ReturnNode(ctrl(), expr);
+ Node ret = STOP.add_def(new ReturnNode(ctrl(), expr).peephole());
ctrl(null); // Kill control
return ret;
}
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java b/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java
index 382d41ae..49426c26 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/Node.java
@@ -206,7 +206,7 @@ public abstract class Node {
* @param new_def the new definition, appended to the end of existing definitions
* @return new_def for flow coding
*/
- Node add_def(Node new_def) {
+ public Node add_def(Node new_def) {
// Add use->def edge
_inputs.add(new_def);
// If new def is not null, add the corresponding def->use edge
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java
index c9b1ec07..8e223e93 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/ProjNode.java
@@ -22,7 +22,7 @@ public class ProjNode extends Node {
public String label() { return _label; }
@Override
- StringBuilder _print1(StringBuilder sb) { return sb.append(_label).append(_nid); }
+ StringBuilder _print1(StringBuilder sb) { return sb.append(_label); }
@Override public boolean isCFG() { return _idx==0 || ctrl() instanceof IfNode; }
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
index 681bd175..e20d01e5 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/ReturnNode.java
@@ -1,7 +1,6 @@
package com.seaofnodes.simple.node;
-import com.seaofnodes.simple.type.Type;
-import com.seaofnodes.simple.type.TypeBot;
+import com.seaofnodes.simple.type.*;
/**
* The Return node has two inputs. The first input is a control node and the
@@ -33,7 +32,7 @@ public class ReturnNode extends Node {
@Override
public Type compute() {
- return expr().compute();
+ return new TypeTuple(TypeControl.CONTROL,expr()._type);
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/ScopeNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
index f09eeef5..b3cca3da 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/ScopeNode.java
@@ -105,7 +105,7 @@ public class ScopeNode extends Node {
public ScopeNode dup() {
ScopeNode dup = new ScopeNode();
for( HashMap<String, Integer> tab : _scopes )
- dup._scopes.push((HashMap<String, Integer>) tab.clone());
+ dup._scopes.push(new HashMap<String, Integer>(tab));
for( int i=0; i<nIns(); i++ )
dup.add_def(in(i));
return dup;
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java
index b0c851a2..df5e09ef 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/StopNode.java
@@ -15,10 +15,20 @@ public class StopNode extends Node {
@Override
StringBuilder _print1(StringBuilder sb) {
- return sb;
+ if( ret()!=null ) return ret()._print0(sb);
+ sb.append("Stop[ ");
+ for( Node ret : _inputs )
+ ret._print0(sb).append(" ");
+ return sb.append("]");
}
@Override public boolean isCFG() { return true; }
+
+ // If a single Return, return it.
+ // Otherwise, null because ambiguous.
+ public ReturnNode ret() {
+ return nIns()==1 ? (ReturnNode)in(0) : null;
+ }
@Override
public Type compute() {
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java b/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
index 4d7a79bc..80d09884 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/type/TypeTuple.java
@@ -4,7 +4,7 @@ public class TypeTuple extends Type {
public final Type[] _types;
- public TypeTuple(Type[] _types) {
+ public TypeTuple(Type... _types) {
this._types = _types;
}