@@ -227,12 +227,17 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
227
227
var reflPoly$Cache: SoftReference[scala.runtime.MethodCache] = new SoftReference(new EmptyMethodCache())
228
228
229
229
def reflMethod$Method(forReceiver: JClass[_]): JMethod = {
230
- var method: JMethod = reflPoly$Cache.find(forReceiver)
231
- if (method != null)
230
+ var methodCache: MethodCache = reflPoly$Cache.find(forReceiver)
231
+ if (methodCache eq null) {
232
+ methodCache = new EmptyMethodCache
233
+ reflPoly$Cache = new SoftReference(methodCache)
234
+ }
235
+ var method: JMethod = methodCache.find(forReceiver)
236
+ if (method ne null)
232
237
return method
233
238
else {
234
239
method = ScalaRunTime.ensureAccessible(forReceiver.getMethod("xyz", reflParams$Cache))
235
- reflPoly$Cache = new SoftReference(reflPoly$Cache.get .add(forReceiver, method))
240
+ reflPoly$Cache = new SoftReference(methodCache .add(forReceiver, method))
236
241
return method
237
242
}
238
243
}
@@ -248,16 +253,22 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
248
253
249
254
addStaticMethodToClass(" reflMethod$Method" , List (ClassClass .tpe), MethodClass .tpe)
250
255
{ case Pair (reflMethodSym, List (forReceiverSym)) =>
256
+ val methodCache = reflMethodSym.newVariable(ad.pos, mkTerm(" methodCache" )) setInfo MethodCacheClass .tpe
251
257
val methodSym = reflMethodSym.newVariable(ad.pos, mkTerm(" method" )) setInfo MethodClass .tpe
252
258
253
259
BLOCK (
254
- IF (getPolyCache OBJ_EQ NULL ) THEN (safeREF(reflPolyCacheSym) === mkNewPolyCache) ENDIF ,
255
- VAL (methodSym) === ((getPolyCache DOT methodCache_find)(REF (forReceiverSym))) ,
256
- IF (REF (methodSym) OBJ_!= NULL ) .
260
+ VAR (methodCache) === getPolyCache,
261
+ IF (REF (methodCache) OBJ_EQ NULL ) THEN BLOCK (
262
+ REF (methodCache) === NEW (TypeTree (EmptyMethodCacheClass .tpe)),
263
+ REF (reflPolyCacheSym) === gen.mkSoftRef(REF (methodCache))
264
+ ) ENDIF ,
265
+
266
+ VAR (methodSym) === (REF (methodCache) DOT methodCache_find)(REF (forReceiverSym)),
267
+ IF (REF (methodSym) OBJ_NE NULL ) .
257
268
THEN (Return (REF (methodSym)))
258
269
ELSE {
259
270
def methodSymRHS = ((REF (forReceiverSym) DOT Class_getMethod )(LIT (method), safeREF(reflParamsCacheSym)))
260
- def cacheRHS = ((getPolyCache DOT methodCache_add)(REF (forReceiverSym), REF (methodSym)))
271
+ def cacheRHS = ((REF (methodCache) DOT methodCache_add)(REF (forReceiverSym), REF (methodSym)))
261
272
BLOCK (
262
273
REF (methodSym) === (REF (ensureAccessibleMethod) APPLY (methodSymRHS)),
263
274
safeREF(reflPolyCacheSym) === gen.mkSoftRef(cacheRHS),
0 commit comments