@@ -231,16 +231,52 @@ public static void subcallstaticResolve_noa(Lookup caller, MutableCallSite cs, S
231
231
* it's a compiler stub, though. */
232
232
if (!cr .isCompilerStub && !shared ) {
233
233
try {
234
- MethodType invType = MethodType .methodType (void .class ,
235
- MethodHandle .class , String .class , CallSiteDescriptor .class ,
236
- CodeRef .class , ThreadContext .class , Object [].class );
237
- MethodHandle inv = caller .findStatic (IndyBootstrap .class , "substaticInvoker" , invType );
238
- cs .setTarget (MethodHandles
239
- .dropArguments (
240
- MethodHandles .insertArguments (inv , 0 , cr .staticInfo .mh , name , csdOrig , cr ),
241
- 0 , String .class , int .class )
242
- .asVarargsCollector (Object [].class )
243
- .asType (cs .getTarget ().type ()));
234
+ boolean updated = false ;
235
+ switch (cr .staticInfo .argsExpectation ) {
236
+ case ArgsExpectation .NO_ARGS :
237
+ if (csd .argFlags .length == 0 ) {
238
+ cs .setTarget (MethodHandles
239
+ .dropArguments (
240
+ MethodHandles .insertArguments (cr .staticInfo .mh , 1 , cr , csdOrig ),
241
+ 0 , String .class , int .class )
242
+ .asType (cs .getTarget ().type ()));
243
+ updated = true ;
244
+ }
245
+ break ;
246
+ case ArgsExpectation .OBJ :
247
+ if (csd .argFlags .length == 1 && csd .argFlags [0 ] == CallSiteDescriptor .ARG_OBJ ) {
248
+ cs .setTarget (MethodHandles
249
+ .dropArguments (
250
+ MethodHandles .insertArguments (cr .staticInfo .mh , 1 , cr , csdOrig ),
251
+ 0 , String .class , int .class )
252
+ .asType (cs .getTarget ().type ()));
253
+ updated = true ;
254
+ }
255
+ break ;
256
+ case ArgsExpectation .OBJ_OBJ :
257
+ if (csd .argFlags .length == 2 && csd .argFlags [0 ] == CallSiteDescriptor .ARG_OBJ &&
258
+ csd .argFlags [1 ] == CallSiteDescriptor .ARG_OBJ ) {
259
+ cs .setTarget (MethodHandles
260
+ .dropArguments (
261
+ MethodHandles .insertArguments (cr .staticInfo .mh , 1 , cr , csdOrig ),
262
+ 0 , String .class , int .class )
263
+ .asType (cs .getTarget ().type ()));
264
+ updated = true ;
265
+ }
266
+ break ;
267
+ }
268
+ if (!updated ) {
269
+ MethodType invType = MethodType .methodType (void .class ,
270
+ CallSiteDescriptor .class , CodeRef .class , ThreadContext .class ,
271
+ Object [].class );
272
+ MethodHandle inv = caller .findStatic (IndyBootstrap .class , "substaticInvoker" , invType );
273
+ cs .setTarget (MethodHandles
274
+ .dropArguments (
275
+ MethodHandles .insertArguments (inv , 0 , csdOrig , cr ),
276
+ 0 , String .class , int .class )
277
+ .asVarargsCollector (Object [].class )
278
+ .asType (cs .getTarget ().type ()));
279
+ }
244
280
}
245
281
catch (Throwable t ) {
246
282
throw ExceptionHandling .dieInternal (tc , t );
@@ -259,7 +295,7 @@ public static void subcallstaticResolve_noa(Lookup caller, MutableCallSite cs, S
259
295
}
260
296
}
261
297
262
- public static void substaticInvoker (MethodHandle mh , String name , CallSiteDescriptor csd , CodeRef cr , ThreadContext tc , Object [] args ) throws Throwable {
298
+ public static void substaticInvoker (CallSiteDescriptor csd , CodeRef cr , ThreadContext tc , Object [] args ) throws Throwable {
263
299
ArgsExpectation .invokeByExpectation (tc , cr , csd , args );
264
300
}
265
301
0 commit comments