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