@@ -165,6 +165,52 @@ func TestGenerateStaticInstanceCheck(t *testing.T) {
165165 }
166166}
167167
168+ func TestGenerateStaticInstanceCheckForSameNamespaceDirectLink (t * testing.T ) {
169+ instanceVar := lang .NSCore .FindInternedVar (lang .NewSymbol ("instance?" ))
170+ if instanceVar == nil {
171+ t .Fatal ("clojure.core/instance? is not interned" )
172+ }
173+
174+ var output bytes.Buffer
175+ generator := newGenerator (& output , true )
176+ generator .addImport ("github.com/glojurelang/glojure/pkg/lang" )
177+ generator .currentWriter = & output
178+ generator .aotNamespace = lang .NSCore
179+ target := & aotSpecializationTarget {
180+ vr : instanceVar ,
181+ directLinked : true ,
182+ directFnVar : "aotDirectFn0" ,
183+ }
184+ target .directArities [2 ] = true
185+ generator .aotCallTargets [instanceVar ] = target
186+
187+ vectorType := reflect .TypeOf ((* lang .IPersistentVector )(nil )).Elem ()
188+ invoke := & ast.InvokeNode {
189+ Fn : & ast.Node {
190+ Op : ast .OpVar ,
191+ Sub : & ast.VarNode {Var : instanceVar },
192+ },
193+ Args : []* ast.Node {
194+ {Op : ast .OpConst , Sub : & ast.ConstNode {Value : vectorType }},
195+ {Op : ast .OpConst , Sub : & ast.ConstNode {Value : nil }},
196+ },
197+ }
198+ generator .generateInvokeDefault (invoke )
199+
200+ generated := output .String ()
201+ if ! strings .Contains (
202+ generated ,
203+ "lang.IsInstance[lang.IPersistentVector](nil)" ,
204+ ) {
205+ t .Fatalf ("same-namespace instance? did not use a type assertion:\n %s" ,
206+ generated )
207+ }
208+ if strings .Contains (generated , "aotDirectFn0" ) {
209+ t .Fatalf ("same-namespace instance? retained function dispatch:\n %s" ,
210+ generated )
211+ }
212+ }
213+
168214func TestGenerateDirectCallsForKnownFunctionArities (t * testing.T ) {
169215 ns := lang .FindOrCreateNamespace (lang .NewSymbol ("codegen.direct-known-arities" ))
170216 ns .ReferAllSnapshot (lang .NSCore , nil )
0 commit comments