summaryrefslogtreecommitdiff
path: root/chapter25
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-09-25 15:00:00 -0700
committerCliff Click <cliffc@acm.org>2026-09-25 15:00:00 -0700
commita32e83c9d81cfdb3759a2961d8b192ca44d75935 (patch)
tree9898306adf1a2d2432f333a50db5576999fb82c8 /chapter25
parente9e02b18ee3223f2cfe1990be00674f9868e1a26 (diff)
downloadSimple-a32e83c9d81cfdb3759a2961d8b192ca44d75935.tar.gz
Simple-a32e83c9d81cfdb3759a2961d8b192ca44d75935.zip
Bunch more animation work
Diffstat (limited to 'chapter25')
-rw-r--r--chapter25/pom.xml4
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java9
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java1
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java12
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java2
6 files changed, 23 insertions, 7 deletions
diff --git a/chapter25/pom.xml b/chapter25/pom.xml
index 7a2b2b78..ab9f2ea5 100644
--- a/chapter25/pom.xml
+++ b/chapter25/pom.xml
@@ -8,9 +8,9 @@
<artifactId>simple</artifactId>
<version>1.0</version>
</parent>
- <artifactId>chapter23</artifactId>
+ <artifactId>chapter25</artifactId>
<packaging>jar</packaging>
- <name>Chapter 23</name>
+ <name>Chapter 25</name>
<properties>
<simple.graph.directory>${project.basedir}/../graph</simple.graph.directory>
</properties>
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java b/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
index 87aa96c4..0f38d3ff 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/codegen/CodeGen.java
@@ -558,10 +558,15 @@ public class CodeGen {
min instanceof CFGNode mincfg &&
ncfg.idepth() < mincfg.idepth())) )
min = n;
+ if( _obs != null ) _obs.error(min, min.err().getMessage());
throw min.err();
}
- if( unresolved != null )
- throw Parser.error("Unknown struct type '"+unresolved+"'",null);
+ if( unresolved != null ) {
+ var err = Parser.error("Unknown struct type '"+unresolved+"'",null);
+ if( _obs != null ) _obs.error(null, err.getMessage());
+ throw err;
+ }
+ if( _obs != null ) _obs.phase("TypeCheck");
return this;
}
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
index abf80288..3c6506b9 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/CallEndNode.java
@@ -56,7 +56,7 @@ public class CallEndNode extends CFGNode implements MultiNode {
@Override public boolean blockHead() { return true; }
public CallNode call() { return (CallNode)in(0); }
- boolean folding() { return _folding; }
+ public boolean folding() { return _folding; }
@Override public CFGNode idom(Node dep) {
// Folding the idom is the one inlining Return
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java
index ddd637c9..19b459df 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/FunNode.java
@@ -15,6 +15,7 @@ public class FunNode extends RegionNode {
// When set true, this Call/CallEnd/Fun/Return is being trivially inlined
public boolean _folding;
+ public boolean folding() { return _folding; }
private TypeFunPtr _sig; // Initial signature
private ReturnNode _ret; // Return pointer
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
index f3619bb5..6c4e7e31 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphAdapter.java
@@ -44,7 +44,17 @@ public class SimpleGraphAdapter extends GraphAdapter<Node> {
? new Projection(n.nIns() == 0 ? 0 : ref(n.in(0)), p.idx()) : null;
String label = n.label();
return new GraphSnapshot.Node(n._nid, label == null ? n.getClass().getSimpleName() : label,
- n._type == null ? null : n._type.toString(), kind(n), edges(n), proj);
+ n._type == null ? null : n._type.toString(), kind(n), edges(n), proj, folding(n));
+ }
+
+ private boolean folding(Node n) {
+ if( n instanceof FunNode fun ) return fun.folding();
+ if( n instanceof ReturnNode ret ) return ret.fun().folding();
+ if( n instanceof CallEndNode cend ) return cend.folding();
+ if( n instanceof CallNode )
+ for( int i=0; i<n.nOuts(); i++ )
+ if( n.out(i) instanceof CallEndNode cend && cend.folding() ) return true;
+ return false;
}
private Kind kind(Node n) {
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
index 0e5281fb..bf8403e1 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/print/SimpleGraphObserver.java
@@ -17,7 +17,7 @@ public class SimpleGraphObserver extends GraphCapture<Node> {
@Override protected void compile(String src) {
_code = new CodeGen(src);
_code._obs = this;
- _code.parse().opto();
+ _code.parse().opto().typeCheck();
}
@Override protected String phase() { return _code._phase.name(); }
@Override protected int pos() { return _code._phase == CodeGen.Phase.Parse ? _code.P.pos() : -1; }