@@ -4125,6 +4125,8 @@ static public class ObjExpr implements Expr{
4125
4125
int line ;
4126
4126
int column ;
4127
4127
PersistentVector constants ;
4128
+ IPersistentSet usedConstants = PersistentHashSet .EMPTY ;
4129
+
4128
4130
int constantsID ;
4129
4131
int altCtorDrops = 0 ;
4130
4132
@@ -4277,93 +4279,15 @@ void compile(String superName, String[] interfaceNames, boolean oneTimeUse) thro
4277
4279
cv .visitSource (source , smap );
4278
4280
}
4279
4281
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
- }
4287
4282
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
- }
4297
4283
4298
4284
// for(int i=0;i<varCallsites.count();i++)
4299
4285
// {
4300
4286
// cv.visitField(ACC_PRIVATE + ACC_STATIC + ACC_FINAL
4301
4287
// , varCallsiteName(i), IFN_TYPE.getDescriptor(), null, null);
4302
4288
// }
4303
4289
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 ();
4365
4290
4366
- clinitgen .endMethod ();
4367
4291
if (supportsMeta ())
4368
4292
{
4369
4293
cv .visitField (ACC_FINAL , "__meta" , IPERSISTENTMAP_TYPE .getDescriptor (), null , null );
@@ -4572,6 +4496,89 @@ void compile(String superName, String[] interfaceNames, boolean oneTimeUse) thro
4572
4496
emitStatics (cv );
4573
4497
emitMethods (cv );
4574
4498
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
+
4575
4582
//end of class
4576
4583
cv .visitEnd ();
4577
4584
@@ -4839,9 +4846,12 @@ void emitConstants(GeneratorAdapter clinitgen){
4839
4846
4840
4847
for (int i = 0 ; i < constants .count (); i ++)
4841
4848
{
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
+ }
4845
4855
}
4846
4856
}
4847
4857
finally
@@ -5108,6 +5118,7 @@ public void emitKeyword(GeneratorAdapter gen, Keyword k){
5108
5118
}
5109
5119
5110
5120
public void emitConstant (GeneratorAdapter gen , int id ){
5121
+ usedConstants = (IPersistentSet ) usedConstants .cons (id );
5111
5122
gen .getStatic (objtype , constantName (id ), constantType (id ));
5112
5123
}
5113
5124
@@ -6846,7 +6857,7 @@ private static Expr analyzeSeq(C context, ISeq form, String name) {
6846
6857
6847
6858
Object op = RT .first (form );
6848
6859
if (op == null )
6849
- throw new IllegalArgumentException ("Can't call nil" );
6860
+ throw new IllegalArgumentException ("Can't call nil, form: " + form );
6850
6861
IFn inline = isInline (op , RT .count (RT .next (form )));
6851
6862
if (inline != null )
6852
6863
return analyze (context , preserveTag (form , inline .applyTo (RT .next (form ))));
@@ -7538,7 +7549,8 @@ CONSTANT_IDS, new IdentityHashMap(),
7538
7549
//static fields for constants
7539
7550
for (int i = 0 ; i < objx .constants .count (); i ++)
7540
7551
{
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 (),
7542
7554
null , null );
7543
7555
}
7544
7556
@@ -7561,9 +7573,12 @@ CONSTANT_IDS, new IdentityHashMap(),
7561
7573
7562
7574
for (int i = n *INITS_PER ; i < objx .constants .count () && i < (n +1 )*INITS_PER ; i ++)
7563
7575
{
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
+ }
7567
7582
}
7568
7583
}
7569
7584
finally
0 commit comments