summaryrefslogtreecommitdiff
path: root/chapter18/src/main/java/com
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2025-01-12 10:54:27 -0800
committerCliff Click <cliffc@acm.org>2025-01-15 15:07:30 -0800
commite491c528e8d9380bdef823889f0b0a8e08a34f55 (patch)
tree3da5efc22250cbfcab14fd175fd5f69ed9fd11f5 /chapter18/src/main/java/com
parent4cbab83ffd93831c0c9d887889bcf3ac49460d00 (diff)
downloadSimple-e491c528e8d9380bdef823889f0b0a8e08a34f55.tar.gz
Simple-e491c528e8d9380bdef823889f0b0a8e08a34f55.zip
Fix deep co-recursive type check
Diffstat (limited to 'chapter18/src/main/java/com')
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/type/Type.java3
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java12
3 files changed, 17 insertions, 2 deletions
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/Parser.java b/chapter18/src/main/java/com/seaofnodes/simple/Parser.java
index a4fd9d52..649145fd 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/Parser.java
@@ -651,7 +651,7 @@ public class Parser {
// Auto-narrow wide ints to narrow ints
expr = zsMask(expr,t);
// Type is sane
- if( expr._type!=Type.BOTTOM && !expr._type.isa(t) )
+ if( expr._type!=Type.BOTTOM && !expr._type.shallowISA(t) )
throw error("Type " + expr._type.str() + " is not of declared type " + t.str());
return expr;
}
@@ -835,7 +835,7 @@ public class Parser {
if( !(peek(',') || peek(';')) )
return posT(old1);
pos(old2); // Reset lexer to reparse
- if( id==null || _scope.lookup(id)!=null )
+ if( id==null )
return posT(old1); // Reset lexer to reparse
// Yes a forward ref, so declare it
TYPES.put(tname,t1);
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/type/Type.java b/chapter18/src/main/java/com/seaofnodes/simple/type/Type.java
index 95fdca74..b6757ef2 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/type/Type.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/type/Type.java
@@ -191,6 +191,9 @@ public class Type {
// True if this "isa" t; e.g. 17 isa TypeInteger.BOT
public boolean isa( Type t ) { return meet(t)==t; }
+ // True if this "isa" t up to named structures
+ public boolean shallowISA( Type t ) { return isa(t); }
+
public Type nonZero() { return TypePtr.NPTR; }
// Make a zero version of this type, 0 for integers and null for pointers.
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java b/chapter18/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
index 6dda9c39..c8a5c1f4 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
@@ -64,6 +64,18 @@ public class TypeMemPtr extends TypeNil {
return _nil==3 ? this : make((byte)3,_obj);
}
+
+ // True if this "isa" t up to named structures
+ @Override public boolean shallowISA( Type t ) {
+ if( !(t instanceof TypeMemPtr that) ) return false;
+ if( this==that ) return true;
+ if( xmeet0(that)!=that._nil ) return false;
+ if( _obj==that._obj ) return true;
+ if( _obj._name.equals(that._obj._name) )
+ return true; // Shallow, do not follow matching names, just assume ok
+ throw Utils.TODO(); // return _obj.shallowISA(that._obj);
+ }
+
@Override public TypeMemPtr glb() { return make((byte)3,_obj.glb()); }
// Is forward-reference
@Override public boolean isFRef() { return _obj.isFRef(); }