@@ -77,8 +77,16 @@ public class MethodArgsUtils {
77
77
* <li>{@code [long l, NULL]} -> [l, NULL]</li>
78
78
* </ul>
79
79
*/
80
- @ TruffleBoundary
81
80
public static CandidateMethodWithArgs matchCandidate (Method candidate , Object [] arguments , Klass [] parameterKlasses , ToEspressoNode .DynamicToEspresso toEspressoNode ) {
81
+ Object [] convertedArgs = convertedArgs (candidate , arguments , parameterKlasses , toEspressoNode );
82
+ if (convertedArgs != null ) {
83
+ return new CandidateMethodWithArgs (candidate , convertedArgs , parameterKlasses );
84
+ }
85
+ return null ;
86
+ }
87
+
88
+ @ TruffleBoundary
89
+ private static Object [] convertedArgs (Method candidate , Object [] arguments , Klass [] parameterKlasses , ToEspressoNode .DynamicToEspresso toEspressoNode ) {
82
90
assert arguments .length == parameterKlasses .length || (candidate .isVarargs () && arguments .length >= parameterKlasses .length - 1 );
83
91
int paramLength = parameterKlasses .length ;
84
92
try {
@@ -139,7 +147,7 @@ public static CandidateMethodWithArgs matchCandidate(Method candidate, Object[]
139
147
}
140
148
}
141
149
142
- return new CandidateMethodWithArgs ( candidate , convertedArgs , parameterKlasses ) ;
150
+ return convertedArgs ;
143
151
} catch (ArithmeticException // If expansion of the given vararg array overflows
144
152
| OutOfMemoryError // If converted args array creation fails.
145
153
| UnsupportedTypeException e ) {
@@ -162,7 +170,6 @@ public static CandidateMethodWithArgs matchCandidate(Method candidate, Object[]
162
170
* <li>{@code [long l]} -> [l, []]</li>
163
171
* <li>{@code [long l, NULL]} -> [l, NULL]</li>
164
172
*/
165
- @ TruffleBoundary
166
173
public static CandidateMethodWithArgs ensureVarArgsArrayCreated (CandidateMethodWithArgs matched ) {
167
174
assert matched .getMethod ().isVarargs ();
168
175
int varArgsIndex = matched .getParameterTypes ().length - 1 ;
@@ -176,6 +183,12 @@ public static CandidateMethodWithArgs ensureVarArgsArrayCreated(CandidateMethodW
176
183
return matched ;
177
184
}
178
185
186
+ Object [] finalConvertedArgs = shrinkVarargs (matched , varArgsIndex , varArgsType , isPrimitive , varArgsLength );
187
+ return new CandidateMethodWithArgs (matched .getMethod (), finalConvertedArgs , matched .getParameterTypes ());
188
+ }
189
+
190
+ @ TruffleBoundary
191
+ private static Object [] shrinkVarargs (CandidateMethodWithArgs matched , int varArgsIndex , Klass varArgsType , boolean isPrimitive , int varArgsLength ) {
179
192
StaticObject varArgsArray = isPrimitive ? varArgsType .getAllocator ().createNewPrimitiveArray (varArgsType , varArgsLength ) : varArgsType .allocateReferenceArray (varArgsLength );
180
193
181
194
int index = 0 ;
@@ -192,7 +205,7 @@ public static CandidateMethodWithArgs ensureVarArgsArrayCreated(CandidateMethodW
192
205
Object [] finalConvertedArgs = new Object [matched .getParameterTypes ().length ];
193
206
System .arraycopy (matched .getConvertedArgs (), 0 , finalConvertedArgs , 0 , varArgsIndex );
194
207
finalConvertedArgs [varArgsIndex ] = varArgsArray ;
195
- return new CandidateMethodWithArgs ( matched . getMethod (), finalConvertedArgs , matched . getParameterTypes ()) ;
208
+ return finalConvertedArgs ;
196
209
}
197
210
198
211
public static PrimitiveKlass boxedTypeToPrimitiveType (Klass primitiveType ) {
0 commit comments