From 76a7ee6eaf6963b044cb5d149c916c55ae4d24f7 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Wed, 28 Oct 2026 08:36:27 -0700 Subject: Remove a extra calls to classInitDependencies --- .../java/com/seaofnodes/simple/Chapter25Test.java | 29 ++++++++++++++++++++++ .../simple/ClassInitDependenciesTest.java | 4 +++ 2 files changed, 33 insertions(+) (limited to 'chapter28b/src/test/java') diff --git a/chapter28b/src/test/java/com/seaofnodes/simple/Chapter25Test.java b/chapter28b/src/test/java/com/seaofnodes/simple/Chapter25Test.java index f94f641b..f5eba8f5 100644 --- a/chapter28b/src/test/java/com/seaofnodes/simple/Chapter25Test.java +++ b/chapter28b/src/test/java/com/seaofnodes/simple/Chapter25Test.java @@ -12,6 +12,7 @@ import com.seaofnodes.simple.node.CallNode; import com.seaofnodes.simple.node.FunNode; import com.seaofnodes.simple.node.LoopNode; import com.seaofnodes.simple.type.TypeInteger; +import com.seaofnodes.simple.type.XInt; import com.seaofnodes.simple.util.Ary; import java.io.File; import java.io.FileWriter; @@ -93,6 +94,34 @@ public class Chapter25Test { } } + @Test public void testPublicFunctionAlias() { + CodeGen code = new CodeGen(""" + val _hidden = { int x -> x; }; + val visible = _hidden; + val _private = { int x -> x+1; }; + return 0; + """).parse(); + int checked = 0; + for( FunNode fun : code._linker ) { + if( fun==null || fun._name==null ) continue; + if( fun._name.equals("_hidden") ) { + // A public field can publish a privately named function. + assertTrue(code.publicFIDX(fun.sig().fidx())); + checked++; + } + if( fun._name.equals("_private") ) { + assertFalse(code.publicFIDX(fun.sig().fidx())); + checked++; + } + } + assertEquals(2,checked); + var clz = code.compunit()._clz; + assertTrue(XInt.bit(code.publicAliases(),clz.field("visible")._alias)); + assertFalse(XInt.bit(code.publicAliases(),clz.field("_hidden")._alias)); + assertFalse(XInt.bit(code.publicAliases(),clz.field("_private")._alias)); + code.driver(CodeGen.Phase.TypeCheck); + } + @Test public void testNeverReturnPointerRiscV() { new CodeGen(""" struct _S { int x; }; diff --git a/chapter28b/src/test/java/com/seaofnodes/simple/ClassInitDependenciesTest.java b/chapter28b/src/test/java/com/seaofnodes/simple/ClassInitDependenciesTest.java index 09391e4f..08648187 100644 --- a/chapter28b/src/test/java/com/seaofnodes/simple/ClassInitDependenciesTest.java +++ b/chapter28b/src/test/java/com/seaofnodes/simple/ClassInitDependenciesTest.java @@ -577,5 +577,9 @@ public class ClassInitDependenciesTest { forward!=null && reverse!=null); assertCycle(forward,"Root.A -> Root.B -> Root.A"); assertCycle(reverse,"Root.A -> Root.B -> Root.A"); + // A failed check leaves an SCC on the stack. A later check must start + // fresh, and must not treat edges into completed SCCs as back edges. + deps._edgess[b]=null; + assertNull(deps.check()); } } -- cgit v1.2.3