@@ -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