Skip to content

Commit b30b84e

Browse files
rakachanelkorchi
authored andcommitted
Push boundary down in MethodArgsUtil, to be able to prpagate method constantness.
(cherry picked from commit 91081e1)
1 parent d3cfb68 commit b30b84e

File tree

1 file changed

+17
-4
lines changed
  • espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop

1 file changed

+17
-4
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/interop/MethodArgsUtils.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,16 @@ public class MethodArgsUtils {
7777
* <li>{@code [long l, NULL]} -> [l, NULL]</li>
7878
* </ul>
7979
*/
80-
@TruffleBoundary
8180
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) {
8290
assert arguments.length == parameterKlasses.length || (candidate.isVarargs() && arguments.length >= parameterKlasses.length - 1);
8391
int paramLength = parameterKlasses.length;
8492
try {
@@ -139,7 +147,7 @@ public static CandidateMethodWithArgs matchCandidate(Method candidate, Object[]
139147
}
140148
}
141149

142-
return new CandidateMethodWithArgs(candidate, convertedArgs, parameterKlasses);
150+
return convertedArgs;
143151
} catch (ArithmeticException // If expansion of the given vararg array overflows
144152
| OutOfMemoryError // If converted args array creation fails.
145153
| UnsupportedTypeException e) {
@@ -162,7 +170,6 @@ public static CandidateMethodWithArgs matchCandidate(Method candidate, Object[]
162170
* <li>{@code [long l]} -> [l, []]</li>
163171
* <li>{@code [long l, NULL]} -> [l, NULL]</li>
164172
*/
165-
@TruffleBoundary
166173
public static CandidateMethodWithArgs ensureVarArgsArrayCreated(CandidateMethodWithArgs matched) {
167174
assert matched.getMethod().isVarargs();
168175
int varArgsIndex = matched.getParameterTypes().length - 1;
@@ -176,6 +183,12 @@ public static CandidateMethodWithArgs ensureVarArgsArrayCreated(CandidateMethodW
176183
return matched;
177184
}
178185

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) {
179192
StaticObject varArgsArray = isPrimitive ? varArgsType.getAllocator().createNewPrimitiveArray(varArgsType, varArgsLength) : varArgsType.allocateReferenceArray(varArgsLength);
180193

181194
int index = 0;
@@ -192,7 +205,7 @@ public static CandidateMethodWithArgs ensureVarArgsArrayCreated(CandidateMethodW
192205
Object[] finalConvertedArgs = new Object[matched.getParameterTypes().length];
193206
System.arraycopy(matched.getConvertedArgs(), 0, finalConvertedArgs, 0, varArgsIndex);
194207
finalConvertedArgs[varArgsIndex] = varArgsArray;
195-
return new CandidateMethodWithArgs(matched.getMethod(), finalConvertedArgs, matched.getParameterTypes());
208+
return finalConvertedArgs;
196209
}
197210

198211
public static PrimitiveKlass boxedTypeToPrimitiveType(Klass primitiveType) {

0 commit comments

Comments
 (0)