diff options
| author | Cliff Click <cliffc@acm.org> | 2025-01-12 10:54:27 -0800 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2025-01-15 15:07:30 -0800 |
| commit | e491c528e8d9380bdef823889f0b0a8e08a34f55 (patch) | |
| tree | 3da5efc22250cbfcab14fd175fd5f69ed9fd11f5 /chapter18/src/main/java/com/seaofnodes | |
| parent | 4cbab83ffd93831c0c9d887889bcf3ac49460d00 (diff) | |
| download | Simple-e491c528e8d9380bdef823889f0b0a8e08a34f55.tar.gz Simple-e491c528e8d9380bdef823889f0b0a8e08a34f55.zip | |
Fix deep co-recursive type check
Diffstat (limited to 'chapter18/src/main/java/com/seaofnodes')
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(); } |
