From e491c528e8d9380bdef823889f0b0a8e08a34f55 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 12 Jan 2025 10:54:27 -0800 Subject: Fix deep co-recursive type check --- chapter18/src/main/java/com/seaofnodes/simple/Parser.java | 4 ++-- chapter18/src/main/java/com/seaofnodes/simple/type/Type.java | 3 +++ .../src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java | 12 ++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) (limited to 'chapter18/src/main') 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(); } -- cgit v1.2.3