Skip to content

Commit a4bdaca

Browse files
Crema reflection: wrap exceptions in InvocationTargetException
1 parent f1fcdcd commit a4bdaca

File tree

5 files changed

+28
-22
lines changed

5 files changed

+28
-22
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/crema/CremaSupport.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ interface CremaDispatchTable {
6161

6262
void fillDynamicHubInfo(DynamicHub hub, CremaDispatchTable table, List<Class<?>> transitiveSuperInterfaces, int[] interfaceIndices);
6363

64-
Object newInstance(ResolvedJavaMethod targetMethod, Object[] args);
64+
/**
65+
* Creates a new instance of {@code type} without running any constructor yet. The caller should
66+
* make sure to run a constructor before publishing the result.
67+
*/
68+
Object rawNewInstance(ResolvedJavaType type);
6569

6670
Object execute(ResolvedJavaMethod targetMethod, Object[] args);
6771

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/CremaConstructorAccessor.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@
2424
*/
2525
package com.oracle.svm.core.reflect;
2626

27+
import java.lang.reflect.InvocationTargetException;
28+
2729
import com.oracle.svm.core.hub.crema.CremaSupport;
2830
import com.oracle.svm.core.jdk.InternalVMMethod;
2931

3032
import jdk.internal.reflect.ConstructorAccessor;
3133
import jdk.vm.ci.meta.ResolvedJavaMethod;
3234

33-
import org.graalvm.nativeimage.ImageSingletons;
34-
3535
@InternalVMMethod
3636
public final class CremaConstructorAccessor extends AbstractCremaAccessor implements ConstructorAccessor {
3737

@@ -40,9 +40,19 @@ public CremaConstructorAccessor(ResolvedJavaMethod targetMethod, Class<?> declar
4040
}
4141

4242
@Override
43-
public Object newInstance(Object[] args) {
43+
public Object newInstance(Object[] args) throws InvocationTargetException {
4444
verifyArguments(args);
4545
ensureDeclaringClassInitialized();
46-
return ImageSingletons.lookup(CremaSupport.class).newInstance(targetMethod, args);
46+
47+
Object newReference = CremaSupport.singleton().rawNewInstance(targetMethod.getDeclaringClass());
48+
Object[] finalArgs = new Object[args.length + 1];
49+
finalArgs[0] = newReference;
50+
System.arraycopy(args, 0, finalArgs, 1, args.length);
51+
try {
52+
CremaSupport.singleton().execute(targetMethod, finalArgs);
53+
} catch (Throwable t) {
54+
throw new InvocationTargetException(t);
55+
}
56+
return newReference;
4757
}
4858
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/reflect/CremaMethodAccessor.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,15 @@
2424
*/
2525
package com.oracle.svm.core.reflect;
2626

27+
import java.lang.reflect.InvocationTargetException;
28+
2729
import com.oracle.svm.core.hub.crema.CremaSupport;
2830
import com.oracle.svm.core.jdk.InternalVMMethod;
2931
import com.oracle.svm.core.util.VMError;
3032

3133
import jdk.internal.reflect.MethodAccessor;
32-
3334
import jdk.vm.ci.meta.ResolvedJavaMethod;
3435

35-
import java.lang.reflect.InvocationTargetException;
36-
3736
@InternalVMMethod
3837
public final class CremaMethodAccessor extends AbstractCremaAccessor implements MethodAccessor {
3938

@@ -54,7 +53,11 @@ public Object invoke(Object obj, Object[] args) throws IllegalArgumentException,
5453
Object[] finalArgs = new Object[args.length + 1];
5554
finalArgs[0] = obj;
5655
System.arraycopy(args, 0, finalArgs, 1, args.length);
57-
return CremaSupport.singleton().execute(targetMethod, finalArgs);
56+
try {
57+
return CremaSupport.singleton().execute(targetMethod, finalArgs);
58+
} catch (Throwable t) {
59+
throw new InvocationTargetException(t);
60+
}
5861
}
5962

6063
@Override

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/CremaSupportImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ public Object execute(ResolvedJavaMethod targetMethod, Object[] args) {
727727
}
728728

729729
@Override
730-
public Object newInstance(ResolvedJavaMethod targetMethod, Object[] args) {
731-
return Interpreter.newInstance((InterpreterResolvedJavaMethod) targetMethod, args);
730+
public Object rawNewInstance(ResolvedJavaType type) {
731+
return InterpreterToVM.createNewReference((InterpreterResolvedJavaType) type);
732732
}
733733
}

substratevm/src/com.oracle.svm.interpreter/src/com/oracle/svm/interpreter/Interpreter.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -370,17 +370,6 @@ public static Object execute(InterpreterResolvedJavaMethod method, Object[] args
370370
return execute0(method, frame, forceStayInInterpreter);
371371
}
372372

373-
public static Object newInstance(InterpreterResolvedJavaMethod method, Object[] args) {
374-
// this is a constructor call, so we have to allocate a new instance,
375-
// expand this into args[0] and then execute
376-
Object newReference = InterpreterToVM.createNewReference(method.getDeclaringClass());
377-
Object[] finalArgs = new Object[args.length + 1];
378-
finalArgs[0] = newReference;
379-
System.arraycopy(args, 0, finalArgs, 1, args.length);
380-
execute(method, finalArgs, false);
381-
return newReference;
382-
}
383-
384373
private static Object execute0(InterpreterResolvedJavaMethod method, InterpreterFrame frame, boolean stayInInterpreter) {
385374
try {
386375
if (method.isSynchronized()) {

0 commit comments

Comments
 (0)