Skip to content

Commit bfe14ae

Browse files
committed
elide unused constants
1 parent 5cfe511 commit bfe14ae

File tree

2 files changed

+102
-92
lines changed

2 files changed

+102
-92
lines changed

clojure.iml

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
3-
<component name="FacetManager">
4-
<facet type="Clojure" name="Clojure">
5-
<configuration />
6-
</facet>
7-
</component>
83
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="false">
94
<output url="file://$MODULE_DIR$/target/classes" />
105
<output-test url="file://$MODULE_DIR$/target/test-classes" />
116
<content url="file://$MODULE_DIR$">
127
<sourceFolder url="file://$MODULE_DIR$/src/jvm" isTestSource="false" />
138
<sourceFolder url="file://$MODULE_DIR$/test/java" isTestSource="true" />
149
<sourceFolder url="file://$MODULE_DIR$/src/resources" type="java-resource" />
15-
<sourceFolder url="file://$MODULE_DIR$/src/clj" isTestSource="false" />
1610
<sourceFolder url="file://$MODULE_DIR$/test/clojure" isTestSource="true" />
11+
<sourceFolder url="file://$MODULE_DIR$/src/clj" type="java-resource" />
1712
<excludeFolder url="file://$MODULE_DIR$/target" />
1813
<excludeFolder url="file://$MODULE_DIR$/test-classes" />
1914
</content>

src/jvm/clojure/lang/Compiler.java

+101-86
Original file line numberDiff line numberDiff line change
@@ -4125,6 +4125,8 @@ static public class ObjExpr implements Expr{
41254125
int line;
41264126
int column;
41274127
PersistentVector constants;
4128+
IPersistentSet usedConstants = PersistentHashSet.EMPTY;
4129+
41284130
int constantsID;
41294131
int altCtorDrops = 0;
41304132

@@ -4277,93 +4279,15 @@ void compile(String superName, String[] interfaceNames, boolean oneTimeUse) thro
42774279
cv.visitSource(source, smap);
42784280
}
42794281
addAnnotation(cv, classMeta);
4280-
//static fields for constants
4281-
for(int i = 0; i < constants.count(); i++)
4282-
{
4283-
cv.visitField(ACC_PUBLIC + ACC_FINAL
4284-
+ ACC_STATIC, constantName(i), constantType(i).getDescriptor(),
4285-
null, null);
4286-
}
42874282

4288-
//static fields for lookup sites
4289-
for(int i = 0; i < keywordCallsites.count(); i++)
4290-
{
4291-
cv.visitField(ACC_FINAL
4292-
+ ACC_STATIC, siteNameStatic(i), KEYWORD_LOOKUPSITE_TYPE.getDescriptor(),
4293-
null, null);
4294-
cv.visitField(ACC_STATIC, thunkNameStatic(i), ILOOKUP_THUNK_TYPE.getDescriptor(),
4295-
null, null);
4296-
}
42974283

42984284
// for(int i=0;i<varCallsites.count();i++)
42994285
// {
43004286
// cv.visitField(ACC_PRIVATE + ACC_STATIC + ACC_FINAL
43014287
// , varCallsiteName(i), IFN_TYPE.getDescriptor(), null, null);
43024288
// }
43034289

4304-
//static init for constants, keywords and vars
4305-
GeneratorAdapter clinitgen = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC,
4306-
Method.getMethod("void <clinit> ()"),
4307-
null,
4308-
null,
4309-
cv);
4310-
clinitgen.visitCode();
4311-
clinitgen.visitLineNumber(line, clinitgen.mark());
4312-
4313-
if(constants.count() > 0)
4314-
{
4315-
emitConstants(clinitgen);
4316-
}
4317-
4318-
if(keywordCallsites.count() > 0)
4319-
emitKeywordCallsites(clinitgen);
4320-
4321-
/*
4322-
for(int i=0;i<varCallsites.count();i++)
4323-
{
4324-
Label skipLabel = clinitgen.newLabel();
4325-
Label endLabel = clinitgen.newLabel();
4326-
Var var = (Var) varCallsites.nth(i);
4327-
clinitgen.push(var.ns.name.toString());
4328-
clinitgen.push(var.sym.toString());
4329-
clinitgen.invokeStatic(RT_TYPE, Method.getMethod("clojure.lang.Var var(String,String)"));
4330-
clinitgen.dup();
4331-
clinitgen.invokeVirtual(VAR_TYPE,Method.getMethod("boolean hasRoot()"));
4332-
clinitgen.ifZCmp(GeneratorAdapter.EQ,skipLabel);
4333-
4334-
clinitgen.invokeVirtual(VAR_TYPE,Method.getMethod("Object getRoot()"));
4335-
clinitgen.dup();
4336-
clinitgen.instanceOf(AFUNCTION_TYPE);
4337-
clinitgen.ifZCmp(GeneratorAdapter.EQ,skipLabel);
4338-
clinitgen.checkCast(IFN_TYPE);
4339-
clinitgen.putStatic(objtype, varCallsiteName(i), IFN_TYPE);
4340-
clinitgen.goTo(endLabel);
4341-
4342-
clinitgen.mark(skipLabel);
4343-
clinitgen.pop();
4344-
4345-
clinitgen.mark(endLabel);
4346-
}
4347-
*/
4348-
4349-
if(isDeftype() && RT.booleanCast(RT.get(opts, loadNs))) {
4350-
String nsname = ((Symbol)RT.second(src)).getNamespace();
4351-
if (!nsname.equals("clojure.core")) {
4352-
clinitgen.push("clojure.core");
4353-
clinitgen.push("require");
4354-
clinitgen.invokeStatic(RT_TYPE, Method.getMethod("clojure.lang.Var var(String,String)"));
4355-
clinitgen.invokeVirtual(VAR_TYPE,Method.getMethod("Object getRawRoot()"));
4356-
clinitgen.checkCast(IFN_TYPE);
4357-
clinitgen.push(nsname);
4358-
clinitgen.invokeStatic(SYMBOL_TYPE, Method.getMethod("clojure.lang.Symbol create(String)"));
4359-
clinitgen.invokeInterface(IFN_TYPE, Method.getMethod("Object invoke(Object)"));
4360-
clinitgen.pop();
4361-
}
4362-
}
4363-
4364-
clinitgen.returnValue();
43654290

4366-
clinitgen.endMethod();
43674291
if(supportsMeta())
43684292
{
43694293
cv.visitField(ACC_FINAL, "__meta", IPERSISTENTMAP_TYPE.getDescriptor(), null, null);
@@ -4572,6 +4496,89 @@ void compile(String superName, String[] interfaceNames, boolean oneTimeUse) thro
45724496
emitStatics(cv);
45734497
emitMethods(cv);
45744498

4499+
//static fields for constants
4500+
for(int i = 0; i < constants.count(); i++)
4501+
{
4502+
if(usedConstants.contains(i))
4503+
cv.visitField(ACC_PUBLIC + ACC_FINAL
4504+
+ ACC_STATIC, constantName(i), constantType(i).getDescriptor(),
4505+
null, null);
4506+
}
4507+
4508+
//static fields for lookup sites
4509+
for(int i = 0; i < keywordCallsites.count(); i++)
4510+
{
4511+
cv.visitField(ACC_FINAL
4512+
+ ACC_STATIC, siteNameStatic(i), KEYWORD_LOOKUPSITE_TYPE.getDescriptor(),
4513+
null, null);
4514+
cv.visitField(ACC_STATIC, thunkNameStatic(i), ILOOKUP_THUNK_TYPE.getDescriptor(),
4515+
null, null);
4516+
}
4517+
4518+
//static init for constants, keywords and vars
4519+
GeneratorAdapter clinitgen = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC,
4520+
Method.getMethod("void <clinit> ()"),
4521+
null,
4522+
null,
4523+
cv);
4524+
clinitgen.visitCode();
4525+
clinitgen.visitLineNumber(line, clinitgen.mark());
4526+
4527+
if(constants.count() > 0)
4528+
{
4529+
emitConstants(clinitgen);
4530+
}
4531+
4532+
if(keywordCallsites.count() > 0)
4533+
emitKeywordCallsites(clinitgen);
4534+
4535+
/*
4536+
for(int i=0;i<varCallsites.count();i++)
4537+
{
4538+
Label skipLabel = clinitgen.newLabel();
4539+
Label endLabel = clinitgen.newLabel();
4540+
Var var = (Var) varCallsites.nth(i);
4541+
clinitgen.push(var.ns.name.toString());
4542+
clinitgen.push(var.sym.toString());
4543+
clinitgen.invokeStatic(RT_TYPE, Method.getMethod("clojure.lang.Var var(String,String)"));
4544+
clinitgen.dup();
4545+
clinitgen.invokeVirtual(VAR_TYPE,Method.getMethod("boolean hasRoot()"));
4546+
clinitgen.ifZCmp(GeneratorAdapter.EQ,skipLabel);
4547+
4548+
clinitgen.invokeVirtual(VAR_TYPE,Method.getMethod("Object getRoot()"));
4549+
clinitgen.dup();
4550+
clinitgen.instanceOf(AFUNCTION_TYPE);
4551+
clinitgen.ifZCmp(GeneratorAdapter.EQ,skipLabel);
4552+
clinitgen.checkCast(IFN_TYPE);
4553+
clinitgen.putStatic(objtype, varCallsiteName(i), IFN_TYPE);
4554+
clinitgen.goTo(endLabel);
4555+
4556+
clinitgen.mark(skipLabel);
4557+
clinitgen.pop();
4558+
4559+
clinitgen.mark(endLabel);
4560+
}
4561+
*/
4562+
4563+
if(isDeftype() && RT.booleanCast(RT.get(opts, loadNs))) {
4564+
String nsname = ((Symbol)RT.second(src)).getNamespace();
4565+
if (!nsname.equals("clojure.core")) {
4566+
clinitgen.push("clojure.core");
4567+
clinitgen.push("require");
4568+
clinitgen.invokeStatic(RT_TYPE, Method.getMethod("clojure.lang.Var var(String,String)"));
4569+
clinitgen.invokeVirtual(VAR_TYPE,Method.getMethod("Object getRawRoot()"));
4570+
clinitgen.checkCast(IFN_TYPE);
4571+
clinitgen.push(nsname);
4572+
clinitgen.invokeStatic(SYMBOL_TYPE, Method.getMethod("clojure.lang.Symbol create(String)"));
4573+
clinitgen.invokeInterface(IFN_TYPE, Method.getMethod("Object invoke(Object)"));
4574+
clinitgen.pop();
4575+
}
4576+
}
4577+
4578+
clinitgen.returnValue();
4579+
4580+
clinitgen.endMethod();
4581+
45754582
//end of class
45764583
cv.visitEnd();
45774584

@@ -4839,9 +4846,12 @@ void emitConstants(GeneratorAdapter clinitgen){
48394846

48404847
for(int i = 0; i < constants.count(); i++)
48414848
{
4842-
emitValue(constants.nth(i), clinitgen);
4843-
clinitgen.checkCast(constantType(i));
4844-
clinitgen.putStatic(objtype, constantName(i), constantType(i));
4849+
if(usedConstants.contains(i))
4850+
{
4851+
emitValue(constants.nth(i), clinitgen);
4852+
clinitgen.checkCast(constantType(i));
4853+
clinitgen.putStatic(objtype, constantName(i), constantType(i));
4854+
}
48454855
}
48464856
}
48474857
finally
@@ -5108,6 +5118,7 @@ public void emitKeyword(GeneratorAdapter gen, Keyword k){
51085118
}
51095119

51105120
public void emitConstant(GeneratorAdapter gen, int id){
5121+
usedConstants = (IPersistentSet) usedConstants.cons(id);
51115122
gen.getStatic(objtype, constantName(id), constantType(id));
51125123
}
51135124

@@ -6846,7 +6857,7 @@ private static Expr analyzeSeq(C context, ISeq form, String name) {
68466857

68476858
Object op = RT.first(form);
68486859
if(op == null)
6849-
throw new IllegalArgumentException("Can't call nil");
6860+
throw new IllegalArgumentException("Can't call nil, form: " + form);
68506861
IFn inline = isInline(op, RT.count(RT.next(form)));
68516862
if(inline != null)
68526863
return analyze(context, preserveTag(form, inline.applyTo(RT.next(form))));
@@ -7538,7 +7549,8 @@ CONSTANT_IDS, new IdentityHashMap(),
75387549
//static fields for constants
75397550
for(int i = 0; i < objx.constants.count(); i++)
75407551
{
7541-
cv.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, objx.constantName(i), objx.constantType(i).getDescriptor(),
7552+
if(objx.usedConstants.contains(i))
7553+
cv.visitField(ACC_PUBLIC + ACC_FINAL + ACC_STATIC, objx.constantName(i), objx.constantType(i).getDescriptor(),
75427554
null, null);
75437555
}
75447556

@@ -7561,9 +7573,12 @@ CONSTANT_IDS, new IdentityHashMap(),
75617573

75627574
for(int i = n*INITS_PER; i < objx.constants.count() && i < (n+1)*INITS_PER; i++)
75637575
{
7564-
objx.emitValue(objx.constants.nth(i), clinitgen);
7565-
clinitgen.checkCast(objx.constantType(i));
7566-
clinitgen.putStatic(objx.objtype, objx.constantName(i), objx.constantType(i));
7576+
if(objx.usedConstants.contains(i))
7577+
{
7578+
objx.emitValue(objx.constants.nth(i), clinitgen);
7579+
clinitgen.checkCast(objx.constantType(i));
7580+
clinitgen.putStatic(objx.objtype, objx.constantName(i), objx.constantType(i));
7581+
}
75677582
}
75687583
}
75697584
finally

0 commit comments

Comments
 (0)