|
52 | 52 | import com.oracle.svm.core.hub.registry.ClassRegistries;
|
53 | 53 | import com.oracle.svm.core.hub.registry.SymbolsSupport;
|
54 | 54 | import com.oracle.svm.core.meta.MethodPointer;
|
| 55 | +import com.oracle.svm.core.util.VMError; |
55 | 56 | import com.oracle.svm.espresso.classfile.ConstantPool;
|
| 57 | +import com.oracle.svm.espresso.classfile.JavaKind; |
56 | 58 | import com.oracle.svm.espresso.classfile.ParserField;
|
57 | 59 | import com.oracle.svm.espresso.classfile.ParserKlass;
|
58 | 60 | import com.oracle.svm.espresso.classfile.ParserMethod;
|
59 | 61 | import com.oracle.svm.espresso.classfile.attributes.Attribute;
|
60 | 62 | import com.oracle.svm.espresso.classfile.attributes.ConstantValueAttribute;
|
61 |
| -import com.oracle.svm.espresso.classfile.descriptors.ByteSequence; |
62 | 63 | import com.oracle.svm.espresso.classfile.descriptors.Name;
|
63 | 64 | import com.oracle.svm.espresso.classfile.descriptors.ParserSymbols;
|
64 | 65 | import com.oracle.svm.espresso.classfile.descriptors.Signature;
|
65 | 66 | import com.oracle.svm.espresso.classfile.descriptors.Symbol;
|
66 | 67 | import com.oracle.svm.espresso.classfile.descriptors.Type;
|
| 68 | +import com.oracle.svm.espresso.classfile.descriptors.TypeSymbols; |
67 | 69 | import com.oracle.svm.espresso.shared.vtable.MethodTableException;
|
68 | 70 | import com.oracle.svm.espresso.shared.vtable.PartialMethod;
|
69 | 71 | import com.oracle.svm.espresso.shared.vtable.PartialType;
|
|
80 | 82 | import com.oracle.svm.interpreter.metadata.InterpreterResolvedObjectType;
|
81 | 83 |
|
82 | 84 | import jdk.graal.compiler.word.Word;
|
83 |
| -import jdk.vm.ci.meta.JavaType; |
84 | 85 | import jdk.vm.ci.meta.ResolvedJavaField;
|
85 | 86 | import jdk.vm.ci.meta.ResolvedJavaMethod;
|
86 | 87 | import jdk.vm.ci.meta.ResolvedJavaType;
|
@@ -638,50 +639,81 @@ public Class<?> toClass(ResolvedJavaType resolvedJavaType) {
|
638 | 639 | }
|
639 | 640 |
|
640 | 641 | @Override
|
641 |
| - public Class<?> resolveOrThrow(JavaType unresolvedJavaType, ResolvedJavaType accessingClass) { |
| 642 | + public Class<?> resolveOrThrow(Symbol<Type> type, ResolvedJavaType accessingClass) { |
| 643 | + int arrayDimensions = TypeSymbols.getArrayDimensions(type); |
| 644 | + Symbol<Type> elementalType; |
| 645 | + if (arrayDimensions == 0) { |
| 646 | + elementalType = type; |
| 647 | + } else { |
| 648 | + elementalType = SymbolsSupport.getTypes().getOrCreateValidType(type.subSequence(arrayDimensions)); |
| 649 | + } |
642 | 650 | try {
|
643 |
| - Class<?> result = loadClass(unresolvedJavaType, (InterpreterResolvedJavaType) accessingClass); |
| 651 | + Class<?> result = loadClass(elementalType, (InterpreterResolvedJavaType) accessingClass); |
644 | 652 | if (result == null) {
|
645 |
| - throw new NoClassDefFoundError(getTypeName(unresolvedJavaType)); |
646 |
| - } else { |
647 |
| - return result; |
| 653 | + throw new NoClassDefFoundError(elementalType.toString()); |
| 654 | + } |
| 655 | + if (arrayDimensions > 0) { |
| 656 | + while (arrayDimensions-- > 0) { |
| 657 | + result = DynamicHub.toClass(DynamicHub.fromClass(result).arrayType()); |
| 658 | + } |
648 | 659 | }
|
| 660 | + return result; |
649 | 661 | } catch (ClassNotFoundException e) {
|
650 |
| - NoClassDefFoundError error = new NoClassDefFoundError(getTypeName(unresolvedJavaType)); |
| 662 | + NoClassDefFoundError error = new NoClassDefFoundError(elementalType.toString()); |
651 | 663 | error.initCause(e);
|
652 | 664 | throw error;
|
653 | 665 | }
|
654 | 666 | }
|
655 | 667 |
|
656 |
| - private static String getTypeName(JavaType unresolvedJavaType) { |
657 |
| - assert unresolvedJavaType.getElementalType().getName().startsWith("L"); |
658 |
| - |
659 |
| - String internalName = unresolvedJavaType.getElementalType().getName(); |
660 |
| - return internalName.substring(1, internalName.length() - 1); |
661 |
| - } |
662 |
| - |
663 | 668 | @Override
|
664 |
| - public Class<?> resolveOrNull(JavaType unresolvedJavaType, ResolvedJavaType accessingClass) { |
| 669 | + public Class<?> resolveOrNull(Symbol<Type> type, ResolvedJavaType accessingClass) { |
| 670 | + int arrayDimensions = TypeSymbols.getArrayDimensions(type); |
| 671 | + Symbol<Type> elementalType; |
| 672 | + if (arrayDimensions == 0) { |
| 673 | + elementalType = type; |
| 674 | + } else { |
| 675 | + elementalType = SymbolsSupport.getTypes().getOrCreateValidType(type.subSequence(arrayDimensions)); |
| 676 | + } |
665 | 677 | try {
|
666 |
| - return loadClass(unresolvedJavaType, (InterpreterResolvedJavaType) accessingClass); |
| 678 | + Class<?> result = loadClass(elementalType, (InterpreterResolvedJavaType) accessingClass); |
| 679 | + if (result == null) { |
| 680 | + return null; |
| 681 | + } |
| 682 | + if (arrayDimensions > 0) { |
| 683 | + while (arrayDimensions-- > 0) { |
| 684 | + result = DynamicHub.toClass(DynamicHub.fromClass(result).arrayType()); |
| 685 | + } |
| 686 | + } |
| 687 | + return result; |
667 | 688 | } catch (ClassNotFoundException e) {
|
668 | 689 | return null;
|
669 | 690 | }
|
670 | 691 | }
|
671 | 692 |
|
672 |
| - private static Class<?> loadClass(JavaType unresolvedJavaType, InterpreterResolvedJavaType accessingClass) throws ClassNotFoundException { |
673 |
| - ByteSequence type = ByteSequence.create(unresolvedJavaType.getName()); |
674 |
| - Symbol<Type> symbolicType = SymbolsSupport.getTypes().getOrCreateValidType(type); |
675 |
| - AbstractClassRegistry registry = ClassRegistries.singleton().getRegistry(accessingClass.getJavaClass().getClassLoader()); |
676 |
| - return registry.loadClass(symbolicType); |
| 693 | + private static Class<?> loadClass(Symbol<Type> type, InterpreterResolvedJavaType accessingClass) throws ClassNotFoundException { |
| 694 | + JavaKind kind = TypeSymbols.getJavaKind(type); |
| 695 | + return switch (kind) { |
| 696 | + case Object -> { |
| 697 | + AbstractClassRegistry registry = ClassRegistries.singleton().getRegistry(accessingClass.getJavaClass().getClassLoader()); |
| 698 | + yield registry.loadClass(type); |
| 699 | + } |
| 700 | + case Boolean -> boolean.class; |
| 701 | + case Byte -> byte.class; |
| 702 | + case Short -> short.class; |
| 703 | + case Char -> char.class; |
| 704 | + case Int -> int.class; |
| 705 | + case Long -> long.class; |
| 706 | + case Float -> float.class; |
| 707 | + case Double -> double.class; |
| 708 | + case Void -> void.class; |
| 709 | + default -> throw VMError.shouldNotReachHere(kind.toString()); |
| 710 | + }; |
677 | 711 | }
|
678 | 712 |
|
679 | 713 | @Override
|
680 |
| - public Class<?> findLoadedClass(JavaType unresolvedJavaType, ResolvedJavaType accessingClass) { |
681 |
| - ByteSequence type = ByteSequence.create(unresolvedJavaType.getName()); |
682 |
| - Symbol<Type> symbolicType = SymbolsSupport.getTypes().getOrCreateValidType(type); |
| 714 | + public Class<?> findLoadedClass(Symbol<Type> type, ResolvedJavaType accessingClass) { |
683 | 715 | AbstractClassRegistry registry = ClassRegistries.singleton().getRegistry(((InterpreterResolvedJavaType) accessingClass).getJavaClass().getClassLoader());
|
684 |
| - return registry.findLoadedClass(symbolicType); |
| 716 | + return registry.findLoadedClass(type); |
685 | 717 | }
|
686 | 718 |
|
687 | 719 | @Override
|
|
0 commit comments