Skip to content

Commit 3f8c7e1

Browse files
committed
Update to Java commit 07d289c (2025.09.25): CLJ-2919 - in callsite optimization, use null instead of bound-ness as condition for registering, and push null on compile() to reset state for nested compilation
1 parent 3be426d commit 3f8c7e1

File tree

5 files changed

+30
-26
lines changed

5 files changed

+30
-26
lines changed

Clojure/Clojure/CljCompiler/Ast/FnExpr.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public static Expr Parse(ParserContext pcon, ISeq form, string name)
143143
Compiler.VarsVar, PersistentHashMap.EMPTY,
144144
Compiler.KeywordCallsitesVar, PersistentVector.EMPTY,
145145
Compiler.ProtocolCallsitesVar, PersistentVector.EMPTY,
146-
Compiler.VarCallsitesVar, Compiler.EmptyVarCallSites(),
146+
//Compiler.VarCallsitesVar, Compiler.EmptyVarCallSites(),
147147
Compiler.NoRecurVar, null));
148148
SortedDictionary<int, FnMethod> methods = [];
149149
FnMethod variadicMethod = null;
@@ -207,7 +207,7 @@ public static Expr Parse(ParserContext pcon, ISeq form, string name)
207207
fn.Constants = (PersistentVector)Compiler.ConstantsVar.deref();
208208
fn.KeywordCallsites = (IPersistentVector)Compiler.KeywordCallsitesVar.deref();
209209
fn.ProtocolCallsites = (IPersistentVector)Compiler.ProtocolCallsitesVar.deref();
210-
fn.VarCallsites = (IPersistentSet)Compiler.VarCallsitesVar.deref();
210+
//fn.VarCallsites = (IPersistentSet)Compiler.VarCallsitesVar.deref();
211211

212212
fn.ConstantsID = RT.nextID();
213213
}

Clojure/Clojure/CljCompiler/Ast/InvokeExpr.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ public class InvokeExpr : Expr
5959

6060
#region Ctors
6161

62+
63+
// Callsites are only registered in a function context
64+
// In KEYWORD/PROTOCOL_CALLSITES, null indicates "do not register"
65+
static bool ShouldRegisterCallsites(Var callSiteVar)
66+
{
67+
return callSiteVar.deref() != null;
68+
}
69+
6270
public InvokeExpr(string source, IPersistentMap spanMap, Symbol tag, Expr fexpr, IPersistentVector args, bool tailPosition)
6371
{
6472
_source = source;
@@ -73,7 +81,7 @@ public InvokeExpr(string source, IPersistentMap spanMap, Symbol tag, Expr fexpr,
7381
{
7482
Var fvar = varFexpr.Var;
7583
Var pvar = (Var)RT.get(fvar.meta(), Compiler.ProtocolKeyword);
76-
if (pvar is not null && Compiler.ProtocolCallsitesVar.isBound)
84+
if (pvar is not null && ShouldRegisterCallsites(Compiler.ProtocolCallsitesVar))
7785
{
7886
_isProtocol = true;
7987
_siteIndex = Compiler.RegisterProtocolCallsite(fvar);
@@ -201,7 +209,7 @@ public static Expr Parse(ParserContext pcon, ISeq form)
201209
}
202210
}
203211

204-
if (fexpr is KeywordExpr kwFexpr && RT.count(form) == 2 && Compiler.KeywordCallsitesVar.isBound)
212+
if (fexpr is KeywordExpr kwFexpr && RT.count(form) == 2 && ShouldRegisterCallsites(Compiler.KeywordCallsitesVar))
205213
{
206214
Expr target = Compiler.Analyze(pcon, RT.second(form));
207215
return new KeywordInvokeExpr((string)Compiler.SourceVar.deref(), (IPersistentMap)Compiler.SourceSpanVar.deref(), Compiler.TagOf(form), kwFexpr, target);

Clojure/Clojure/CljCompiler/Ast/NewInstanceExpr.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ internal static ObjExpr Build(
191191
Compiler.VarsVar, PersistentHashMap.EMPTY,
192192
Compiler.KeywordCallsitesVar, PersistentVector.EMPTY,
193193
Compiler.ProtocolCallsitesVar, PersistentVector.EMPTY,
194-
Compiler.VarCallsitesVar, Compiler.EmptyVarCallSites(),
194+
//Compiler.VarCallsitesVar, Compiler.EmptyVarCallSites(),
195195
Compiler.NoRecurVar, null,
196196
Compiler.CompilerContextVar, genC
197197
));
@@ -226,7 +226,7 @@ internal static ObjExpr Build(
226226
ret.ConstantsID = RT.nextID();
227227
ret.KeywordCallsites = (IPersistentVector)Compiler.KeywordCallsitesVar.deref();
228228
ret.ProtocolCallsites = (IPersistentVector)Compiler.ProtocolCallsitesVar.deref();
229-
ret.VarCallsites = (IPersistentSet)Compiler.VarCallsitesVar.deref();
229+
//ret.VarCallsites = (IPersistentSet)Compiler.VarCallsitesVar.deref();
230230
}
231231
finally
232232
{

Clojure/Clojure/CljCompiler/Ast/ObjExpr.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public class FieldBuilderRecord(FieldBuilder fb)
6666
public Type BaseClass { get; protected set; } // needed by NewInstanceExpr
6767
public IPersistentVector KeywordCallsites { get; protected set; }
6868
public IPersistentVector ProtocolCallsites { get; protected set; }
69-
public IPersistentSet VarCallsites { get; protected set; }
69+
//public IPersistentSet VarCallsites { get; protected set; }
7070
public IList<FieldBuilder> KeywordLookupSiteFields { get; protected set; }
7171
public IList<FieldBuilder> ThunkFields { get; protected set; }
7272
public IList<FieldBuilder> CachedTypeFields { get; protected set; }

Clojure/Clojure/CljCompiler/Compiler.cs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@
1515
using System.Collections.Generic;
1616
using System.ComponentModel;
1717
using System.IO;
18-
using System.Linq;
1918
using System.Reflection;
2019
using System.Reflection.Emit;
2120
using System.Runtime.Serialization;
2221
using System.Text;
2322
using System.Text.RegularExpressions;
2423
using System.Threading;
2524

25+
2626
namespace clojure.lang
2727
{
2828
public static class Compiler
@@ -223,9 +223,9 @@ internal static int ColumnVarDeref()
223223
internal static readonly Var ConstantIdsVar = Var.create().setDynamic(); // IdentityHashMap
224224
internal static readonly Var KeywordsVar = Var.create().setDynamic(); //keyword->constid
225225

226-
internal static readonly Var KeywordCallsitesVar = Var.create().setDynamic(); // vector<keyword>
227-
internal static readonly Var ProtocolCallsitesVar = Var.create().setDynamic(); // vector<var>
228-
internal static readonly Var VarCallsitesVar = Var.create().setDynamic(); // set<var>
226+
internal static readonly Var KeywordCallsitesVar = Var.create(null).setDynamic(); // vector<keyword>
227+
internal static readonly Var ProtocolCallsitesVar = Var.create(null).setDynamic(); // vector<var>
228+
//internal static readonly Var VarCallsitesVar = Var.create().setDynamic(); // set<var>
229229

230230
internal static readonly Var CompileStubSymVar = Var.create(null).setDynamic();
231231
internal static readonly Var CompileStubClassVar = Var.create(null).setDynamic();
@@ -757,9 +757,6 @@ internal static KeywordExpr RegisterKeyword(Keyword keyword)
757757

758758
internal static int RegisterKeywordCallsite(Keyword keyword)
759759
{
760-
if (!KeywordCallsitesVar.isBound)
761-
throw new InvalidOperationException("KEYWORD_CALLSITES is not bound");
762-
763760
IPersistentVector keywordCallsites = (IPersistentVector)KeywordCallsitesVar.deref();
764761
keywordCallsites = keywordCallsites.cons(keyword);
765762
KeywordCallsitesVar.set(keywordCallsites);
@@ -768,25 +765,22 @@ internal static int RegisterKeywordCallsite(Keyword keyword)
768765

769766
internal static int RegisterProtocolCallsite(Var v)
770767
{
771-
if (!ProtocolCallsitesVar.isBound)
772-
throw new InvalidOperationException("PROTOCOL_CALLSITES is not bound");
773-
774768
IPersistentVector protocolCallsites = (IPersistentVector)ProtocolCallsitesVar.deref();
775769
protocolCallsites = protocolCallsites.cons(v);
776770
ProtocolCallsitesVar.set(protocolCallsites);
777771
return protocolCallsites.count() - 1;
778772
}
779773

780-
internal static void RegisterVarCallsite(Var v)
781-
{
782-
if (!VarCallsitesVar.isBound)
783-
throw new InvalidOperationException("VAR_CALLSITES is not bound");
774+
//internal static void RegisterVarCallsite(Var v)
775+
//{
776+
// if (!VarCallsitesVar.isBound)
777+
// throw new InvalidOperationException("VAR_CALLSITES is not bound");
784778

785-
IPersistentCollection varCallsites = (IPersistentCollection)VarCallsitesVar.deref();
786-
varCallsites = varCallsites.cons(v);
787-
VarCallsitesVar.set(varCallsites);
788-
//return varCallsites.count() - 1;
789-
}
779+
// IPersistentCollection varCallsites = (IPersistentCollection)VarCallsitesVar.deref();
780+
// varCallsites = varCallsites.cons(v);
781+
// VarCallsitesVar.set(varCallsites);
782+
// //return varCallsites.count() - 1;
783+
//}
790784

791785
internal static IPersistentCollection EmptyVarCallSites() => PersistentHashSet.EMPTY;
792786

@@ -1655,6 +1649,8 @@ public static object Compile(GenContext context, TextReader rdr, string sourceDi
16551649
RT.CurrentNSVar, RT.CurrentNSVar.deref(),
16561650
ConstantsVar, PersistentVector.EMPTY,
16571651
ConstantIdsVar, new IdentityHashMap(),
1652+
KeywordCallsitesVar, null,
1653+
ProtocolCallsitesVar, null,
16581654
KeywordsVar, PersistentHashMap.EMPTY,
16591655
VarsVar, PersistentHashMap.EMPTY,
16601656
RT.UncheckedMathVar, RT.UncheckedMathVar.deref(),

0 commit comments

Comments
 (0)