Skip to content

Commit f1fcdcd

Browse files
Crema: implement getExceptionHandlers() for crema-loaded types
1 parent 34889f1 commit f1fcdcd

File tree

5 files changed

+90
-5
lines changed

5 files changed

+90
-5
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/registry/SVMSymbols.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public static void ensureInitialized() {
4747

4848
public static final class SVMTypes {
4949
public static final Symbol<Type> com_oracle_svm_core_hub_Hybrid = SYMBOLS.putType("Lcom/oracle/svm/core/hub/Hybrid;");
50+
public static final Symbol<Type> java_lang_Throwable = SYMBOLS.putType("Ljava/lang/Throwable;");
5051

5152
private SVMTypes() {
5253
}

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/CremaResolvedJavaMethodImpl.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,83 @@
2424
*/
2525
package com.oracle.svm.interpreter.metadata;
2626

27+
import java.lang.invoke.VarHandle;
28+
2729
import com.oracle.svm.core.hub.crema.CremaResolvedJavaMethod;
30+
import com.oracle.svm.core.hub.registry.SVMSymbols;
2831
import com.oracle.svm.core.reflect.CremaConstructorAccessor;
2932
import com.oracle.svm.core.reflect.CremaMethodAccessor;
3033
import com.oracle.svm.core.util.VMError;
34+
import com.oracle.svm.espresso.classfile.ExceptionHandler;
3135
import com.oracle.svm.espresso.classfile.ParserMethod;
36+
import com.oracle.svm.espresso.classfile.attributes.CodeAttribute;
37+
import com.oracle.svm.espresso.classfile.descriptors.Symbol;
38+
import com.oracle.svm.espresso.classfile.descriptors.Type;
3239

3340
import jdk.vm.ci.meta.JavaType;
41+
import jdk.vm.ci.meta.ResolvedJavaType;
3442

3543
public final class CremaResolvedJavaMethodImpl extends InterpreterResolvedJavaMethod implements CremaResolvedJavaMethod {
44+
private final ExceptionHandler[] rawExceptionHandlers;
3645

3746
private CremaResolvedJavaMethodImpl(InterpreterResolvedObjectType declaringClass, ParserMethod parserMethod, int vtableIndex) {
3847
super(declaringClass, parserMethod, vtableIndex);
48+
CodeAttribute codeAttribute = (CodeAttribute) parserMethod.getAttribute(CodeAttribute.NAME);
49+
if (codeAttribute != null) {
50+
this.rawExceptionHandlers = codeAttribute.getExceptionHandlers();
51+
} else {
52+
this.rawExceptionHandlers = null;
53+
}
3954
}
4055

4156
public static InterpreterResolvedJavaMethod create(InterpreterResolvedObjectType declaringClass, ParserMethod m, int vtableIndex) {
4257
return new CremaResolvedJavaMethodImpl(declaringClass, m, vtableIndex);
4358
}
4459

60+
@Override
61+
public jdk.vm.ci.meta.ExceptionHandler[] getExceptionHandlers() {
62+
/*
63+
* GR-70247 The interpreter should primarily use classfile.ExceptionHandler. This would
64+
* avoid having to deal with the JavaType which is not needed during interpretation.
65+
*/
66+
jdk.vm.ci.meta.ExceptionHandler[] result = exceptionHandlers;
67+
if (result == null) {
68+
boolean canCache = true;
69+
if (rawExceptionHandlers == null || rawExceptionHandlers.length == 0) {
70+
result = EMPTY_EXCEPTION_HANDLERS;
71+
} else {
72+
result = new jdk.vm.ci.meta.ExceptionHandler[rawExceptionHandlers.length];
73+
InterpreterConstantPool constantPool = getConstantPool();
74+
for (int i = 0; i < rawExceptionHandlers.length; i++) {
75+
ExceptionHandler exceptionHandler = rawExceptionHandlers[i];
76+
Symbol<Type> catchTypeSymbol = exceptionHandler.getCatchType();
77+
int catchTypeCPI = exceptionHandler.catchTypeCPI();
78+
JavaType catchType;
79+
if (SVMSymbols.SVMTypes.java_lang_Throwable.equals(catchTypeSymbol)) {
80+
catchTypeCPI = 0;
81+
catchType = null;
82+
} else if (catchTypeCPI != 0) {
83+
catchType = constantPool.findClassAt(catchTypeCPI);
84+
canCache = canCache && (catchType instanceof ResolvedJavaType);
85+
} else {
86+
assert catchTypeSymbol == null;
87+
catchType = null;
88+
}
89+
result[i] = new jdk.vm.ci.meta.ExceptionHandler(exceptionHandler.getStartBCI(),
90+
exceptionHandler.getEndBCI(),
91+
exceptionHandler.getHandlerBCI(),
92+
catchTypeCPI,
93+
catchType);
94+
}
95+
VarHandle.fullFence();
96+
}
97+
if (canCache) {
98+
this.exceptionHandlers = result;
99+
}
100+
}
101+
return result;
102+
}
103+
45104
@Override
46105
public JavaType[] getDeclaredExceptions() {
47106
// (GR-69097)

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterConstantPool.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,17 @@
3535

3636
import com.oracle.svm.core.BuildPhaseProvider.AfterAnalysis;
3737
import com.oracle.svm.core.heap.UnknownObjectField;
38+
import com.oracle.svm.core.hub.DynamicHub;
39+
import com.oracle.svm.core.hub.crema.CremaSupport;
40+
import com.oracle.svm.core.hub.registry.SymbolsSupport;
3841
import com.oracle.svm.core.util.VMError;
3942
import com.oracle.svm.espresso.classfile.ConstantPool;
4043
import com.oracle.svm.espresso.classfile.ParserConstantPool;
44+
import com.oracle.svm.espresso.classfile.descriptors.ByteSequence;
45+
import com.oracle.svm.espresso.classfile.descriptors.Name;
46+
import com.oracle.svm.espresso.classfile.descriptors.Symbol;
47+
import com.oracle.svm.espresso.classfile.descriptors.Type;
48+
import com.oracle.svm.espresso.classfile.descriptors.TypeSymbols;
4149
import com.oracle.svm.interpreter.metadata.serialization.VisibleForSerialization;
4250

4351
import jdk.vm.ci.meta.JavaConstant;
@@ -331,4 +339,22 @@ public long longAt(int index) {
331339
}
332340
return super.longAt(index);
333341
}
342+
343+
public JavaType findClassAt(int cpi) {
344+
if (peekCachedEntry(cpi) instanceof InterpreterResolvedObjectType type) {
345+
return type;
346+
}
347+
Symbol<Name> nameSymbol = className(cpi);
348+
ByteSequence typeBytes = TypeSymbols.nameToType(nameSymbol);
349+
Symbol<Type> typeSymbol = SymbolsSupport.getTypes().lookupValidType(typeBytes);
350+
if (typeSymbol == null) {
351+
return null;
352+
}
353+
Class<?> cls = CremaSupport.singleton().findLoadedClass(typeSymbol, getHolder());
354+
if (cls == null) {
355+
return UnresolvedJavaType.create(typeBytes.toString());
356+
} else {
357+
return DynamicHub.fromClass(cls).getInterpreterType();
358+
}
359+
}
334360
}

substratevm/src/com.oracle.svm.interpreter.metadata/src/com/oracle/svm/interpreter/metadata/InterpreterResolvedJavaMethod.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
public class InterpreterResolvedJavaMethod implements ResolvedJavaMethod, CremaMethodAccess {
6969
public static final InterpreterResolvedJavaMethod[] EMPTY_ARRAY = new InterpreterResolvedJavaMethod[0];
7070
public static final LocalVariableTable EMPTY_LOCAL_VARIABLE_TABLE = new LocalVariableTable(new Local[0]);
71+
public static final ExceptionHandler[] EMPTY_EXCEPTION_HANDLERS = new ExceptionHandler[0];
7172

7273
public static final int UNKNOWN_METHOD_ID = 0;
7374

@@ -89,7 +90,7 @@ public class InterpreterResolvedJavaMethod implements ResolvedJavaMethod, CremaM
8990

9091
private final LineNumberTable lineNumberTable;
9192

92-
private ExceptionHandler[] exceptionHandlers;
93+
protected ExceptionHandler[] exceptionHandlers;
9394

9495
private LocalVariableTable localVariableTable;
9596

@@ -340,7 +341,7 @@ public final boolean isConstructor() {
340341
}
341342

342343
@Override
343-
public final ExceptionHandler[] getExceptionHandlers() {
344+
public ExceptionHandler[] getExceptionHandlers() {
344345
ExceptionHandler[] result = exceptionHandlers;
345346
VMError.guarantee(result != null);
346347
return result;

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import static com.oracle.svm.interpreter.metadata.Bytecodes.NEW;
4242
import static com.oracle.svm.interpreter.metadata.Bytecodes.PUTFIELD;
4343
import static com.oracle.svm.interpreter.metadata.Bytecodes.PUTSTATIC;
44+
import static com.oracle.svm.interpreter.metadata.InterpreterResolvedJavaMethod.EMPTY_EXCEPTION_HANDLERS;
4445

4546
import java.util.List;
4647

@@ -88,9 +89,6 @@
8889
*/
8990
@Platforms(Platform.HOSTED_ONLY.class)
9091
final class BuildTimeConstantPool {
91-
92-
private static final ExceptionHandler[] EMPTY_EXCEPTION_HANDLERS = new ExceptionHandler[0];
93-
9492
private final ConstantPoolBuilder poolBuilder;
9593

9694
/**

0 commit comments

Comments
 (0)