@SuppressWarnings("unused")
@Specialization(guards = {"method.isVarArgs()", "method == cachedMethod"}, limit = "LIMIT")
Object doVarArgs(SingleMethodDesc method, Object obj, Object[] args, Object languageContext,
@Cached("method") SingleMethodDesc cachedMethod,
@Cached("create()") ToJavaNode toJavaNode,
@Cached("createClassProfile()") ValueProfile receiverProfile) {
int parameterCount = cachedMethod.getParameterCount();
int minArity = parameterCount - 1;
if (args.length < minArity) {
throw ArityException.raise(minArity, args.length);
}
Class<?>[] types = cachedMethod.getParameterTypes();
Type[] genericTypes = cachedMethod.getGenericParameterTypes();
Object[] convertedArguments = new Object[args.length];
for (int i = 0; i < minArity; i++) {
convertedArguments[i] = toJavaNode.execute(args[i], types[i], genericTypes[i], languageContext);
}
if (asVarArgs(args, cachedMethod)) {
for (int i = minArity; i < args.length; i++) {
Class<?> expectedType = types[minArity].getComponentType();
Type expectedGenericType = getGenericComponentType(genericTypes[minArity]);
convertedArguments[i] = toJavaNode.execute(args[i], expectedType, expectedGenericType, languageContext);
}
convertedArguments = createVarArgsArray(cachedMethod, convertedArguments, parameterCount);
} else {
convertedArguments[minArity] = toJavaNode.execute(args[minArity], types[minArity], genericTypes[minArity], languageContext);
}
return doInvoke(cachedMethod, receiverProfile.profile(obj), convertedArguments, languageContext);
}