comparison src/share/vm/classfile/javaClasses.hpp @ 710:e5b0439ef4ae

6655638: dynamic languages need method handles Summary: initial implementation, with known omissions (x86/64, sparc, compiler optim., c-oops, C++ interp.) Reviewed-by: kvn, twisti, never
author jrose
date Wed, 08 Apr 2009 10:56:49 -0700
parents c89f86385056
children be93aad57795
comparison
equal deleted inserted replaced
709:1d037ecd7960 710:e5b0439ef4ae
149 static oop create_mirror(KlassHandle k, TRAPS); 149 static oop create_mirror(KlassHandle k, TRAPS);
150 static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS); 150 static oop create_basic_type_mirror(const char* basic_type_name, BasicType type, TRAPS);
151 // Conversion 151 // Conversion
152 static klassOop as_klassOop(oop java_class); 152 static klassOop as_klassOop(oop java_class);
153 static BasicType as_BasicType(oop java_class, klassOop* reference_klass = NULL); 153 static BasicType as_BasicType(oop java_class, klassOop* reference_klass = NULL);
154 static BasicType as_BasicType(oop java_class, KlassHandle* reference_klass) {
155 klassOop refk_oop = NULL;
156 BasicType result = as_BasicType(java_class, &refk_oop);
157 (*reference_klass) = KlassHandle(refk_oop);
158 return result;
159 }
154 static symbolOop as_signature(oop java_class, bool intern_if_not_found, TRAPS); 160 static symbolOop as_signature(oop java_class, bool intern_if_not_found, TRAPS);
155 static void print_signature(oop java_class, outputStream *st); 161 static void print_signature(oop java_class, outputStream *st);
156 // Testing 162 // Testing
157 static bool is_instance(oop obj) { 163 static bool is_instance(oop obj) {
158 return obj != NULL && obj->klass() == SystemDictionary::class_klass(); 164 return obj != NULL && obj->klass() == SystemDictionary::class_klass();
776 static jlong clock(); 782 static jlong clock();
777 static void set_clock(jlong value); 783 static void set_clock(jlong value);
778 }; 784 };
779 785
780 786
787 // Interface to java.dyn.MethodHandle objects
788
789 class MethodHandleEntry;
790
791 class java_dyn_MethodHandle: AllStatic {
792 friend class JavaClasses;
793
794 private:
795 static int _vmentry_offset; // assembly code trampoline for MH
796 static int _vmtarget_offset; // class-specific target reference
797 static int _type_offset; // the MethodType of this MH
798 static int _vmslots_offset; // OPTIONAL hoisted type.form.vmslots
799
800 static void compute_offsets();
801
802 public:
803 // Accessors
804 static oop type(oop mh);
805 static void set_type(oop mh, oop mtype);
806
807 static oop vmtarget(oop mh);
808 static void set_vmtarget(oop mh, oop target);
809
810 static MethodHandleEntry* vmentry(oop mh);
811 static void set_vmentry(oop mh, MethodHandleEntry* data);
812
813 static int vmslots(oop mh);
814 static void init_vmslots(oop mh);
815 static int compute_vmslots(oop mh);
816
817 // Testers
818 static bool is_subclass(klassOop klass) {
819 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MethodHandle_klass());
820 }
821 static bool is_instance(oop obj) {
822 return obj != NULL && is_subclass(obj->klass());
823 }
824
825 // Accessors for code generation:
826 static int type_offset_in_bytes() { return _type_offset; }
827 static int vmtarget_offset_in_bytes() { return _vmtarget_offset; }
828 static int vmentry_offset_in_bytes() { return _vmentry_offset; }
829 static int vmslots_offset_in_bytes() { return _vmslots_offset; }
830 };
831
832 class sun_dyn_DirectMethodHandle: public java_dyn_MethodHandle {
833 friend class JavaClasses;
834
835 private:
836 // _vmtarget_offset; // method or class or interface
837 static int _vmindex_offset; // negative or vtable idx or itable idx
838 static void compute_offsets();
839
840 public:
841 // Accessors
842 static int vmindex(oop mh);
843 static void set_vmindex(oop mh, int index);
844
845 // Testers
846 static bool is_subclass(klassOop klass) {
847 return Klass::cast(klass)->is_subclass_of(SystemDictionary::DirectMethodHandle_klass());
848 }
849 static bool is_instance(oop obj) {
850 return obj != NULL && is_subclass(obj->klass());
851 }
852
853 // Accessors for code generation:
854 static int vmindex_offset_in_bytes() { return _vmindex_offset; }
855 };
856
857 class sun_dyn_BoundMethodHandle: public java_dyn_MethodHandle {
858 friend class JavaClasses;
859
860 private:
861 static int _argument_offset; // argument value bound into this MH
862 static int _vmargslot_offset; // relevant argument slot (<= vmslots)
863 static void compute_offsets();
864
865 public:
866 static oop argument(oop mh);
867 static void set_argument(oop mh, oop ref);
868
869 static jint vmargslot(oop mh);
870 static void set_vmargslot(oop mh, jint slot);
871
872 // Testers
873 static bool is_subclass(klassOop klass) {
874 return Klass::cast(klass)->is_subclass_of(SystemDictionary::BoundMethodHandle_klass());
875 }
876 static bool is_instance(oop obj) {
877 return obj != NULL && is_subclass(obj->klass());
878 }
879
880 static int argument_offset_in_bytes() { return _argument_offset; }
881 static int vmargslot_offset_in_bytes() { return _vmargslot_offset; }
882 };
883
884 class sun_dyn_AdapterMethodHandle: public sun_dyn_BoundMethodHandle {
885 friend class JavaClasses;
886
887 private:
888 static int _conversion_offset; // type of conversion to apply
889 static void compute_offsets();
890
891 public:
892 static int conversion(oop mh);
893 static void set_conversion(oop mh, int conv);
894
895 // Testers
896 static bool is_subclass(klassOop klass) {
897 return Klass::cast(klass)->is_subclass_of(SystemDictionary::AdapterMethodHandle_klass());
898 }
899 static bool is_instance(oop obj) {
900 return obj != NULL && is_subclass(obj->klass());
901 }
902
903 // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
904 enum {
905 OP_RETYPE_ONLY = 0x0, // no argument changes; straight retype
906 OP_CHECK_CAST = 0x1, // ref-to-ref conversion; requires a Class argument
907 OP_PRIM_TO_PRIM = 0x2, // converts from one primitive to another
908 OP_REF_TO_PRIM = 0x3, // unboxes a wrapper to produce a primitive
909 OP_PRIM_TO_REF = 0x4, // boxes a primitive into a wrapper (NYI)
910 OP_SWAP_ARGS = 0x5, // swap arguments (vminfo is 2nd arg)
911 OP_ROT_ARGS = 0x6, // rotate arguments (vminfo is displaced arg)
912 OP_DUP_ARGS = 0x7, // duplicates one or more arguments (at TOS)
913 OP_DROP_ARGS = 0x8, // remove one or more argument slots
914 OP_COLLECT_ARGS = 0x9, // combine one or more arguments into a varargs (NYI)
915 OP_SPREAD_ARGS = 0xA, // expand in place a varargs array (of known size)
916 OP_FLYBY = 0xB, // operate first on reified argument list (NYI)
917 OP_RICOCHET = 0xC, // run an adapter chain on the return value (NYI)
918 CONV_OP_LIMIT = 0xD, // limit of CONV_OP enumeration
919
920 CONV_OP_MASK = 0xF00, // this nybble contains the conversion op field
921 CONV_VMINFO_MASK = 0x0FF, // LSB is reserved for JVM use
922 CONV_VMINFO_SHIFT = 0, // position of bits in CONV_VMINFO_MASK
923 CONV_OP_SHIFT = 8, // position of bits in CONV_OP_MASK
924 CONV_DEST_TYPE_SHIFT = 12, // byte 2 has the adapter BasicType (if needed)
925 CONV_SRC_TYPE_SHIFT = 16, // byte 2 has the source BasicType (if needed)
926 CONV_STACK_MOVE_SHIFT = 20, // high 12 bits give signed SP change
927 CONV_STACK_MOVE_MASK = (1 << (32 - CONV_STACK_MOVE_SHIFT)) - 1
928 };
929
930 static int conversion_offset_in_bytes() { return _conversion_offset; }
931 };
932
933
934 // Interface to sun.dyn.MemberName objects
935 // (These are a private interface for Java code to query the class hierarchy.)
936
937 class sun_dyn_MemberName: AllStatic {
938 friend class JavaClasses;
939
940 private:
941 // From java.dyn.MemberName:
942 // private Class<?> clazz; // class in which the method is defined
943 // private String name; // may be null if not yet materialized
944 // private Object type; // may be null if not yet materialized
945 // private int flags; // modifier bits; see reflect.Modifier
946 // private Object vmtarget; // VM-specific target value
947 // private int vmindex; // method index within class or interface
948 static int _clazz_offset;
949 static int _name_offset;
950 static int _type_offset;
951 static int _flags_offset;
952 static int _vmtarget_offset;
953 static int _vmindex_offset;
954
955 static void compute_offsets();
956
957 public:
958 // Accessors
959 static oop clazz(oop mname);
960 static void set_clazz(oop mname, oop clazz);
961
962 static oop type(oop mname);
963 static void set_type(oop mname, oop type);
964
965 static oop name(oop mname);
966 static void set_name(oop mname, oop name);
967
968 static int flags(oop mname);
969 static void set_flags(oop mname, int flags);
970
971 static int modifiers(oop mname) { return (u2) flags(mname); }
972 static void set_modifiers(oop mname, int mods)
973 { set_flags(mname, (flags(mname) &~ (u2)-1) | (u2)mods); }
974
975 static oop vmtarget(oop mname);
976 static void set_vmtarget(oop mname, oop target);
977
978 static int vmindex(oop mname);
979 static void set_vmindex(oop mname, int index);
980
981 // Testers
982 static bool is_subclass(klassOop klass) {
983 return Klass::cast(klass)->is_subclass_of(SystemDictionary::MemberName_klass());
984 }
985 static bool is_instance(oop obj) {
986 return obj != NULL && is_subclass(obj->klass());
987 }
988
989 // Relevant integer codes (keep these in synch. with MethodHandleNatives.Constants):
990 enum {
991 MN_IS_METHOD = 0x00010000, // method (not constructor)
992 MN_IS_CONSTRUCTOR = 0x00020000, // constructor
993 MN_IS_FIELD = 0x00040000, // field
994 MN_IS_TYPE = 0x00080000, // nested type
995 MN_SEARCH_SUPERCLASSES = 0x00100000, // for MHN.getMembers
996 MN_SEARCH_INTERFACES = 0x00200000, // for MHN.getMembers
997 VM_INDEX_UNINITIALIZED = -99
998 };
999
1000 // Accessors for code generation:
1001 static int clazz_offset_in_bytes() { return _clazz_offset; }
1002 static int type_offset_in_bytes() { return _type_offset; }
1003 static int name_offset_in_bytes() { return _name_offset; }
1004 static int flags_offset_in_bytes() { return _flags_offset; }
1005 static int vmtarget_offset_in_bytes() { return _vmtarget_offset; }
1006 static int vmindex_offset_in_bytes() { return _vmindex_offset; }
1007 };
1008
1009
1010 // Interface to java.dyn.MethodType objects
1011
1012 class java_dyn_MethodType: AllStatic {
1013 friend class JavaClasses;
1014
1015 private:
1016 static int _rtype_offset;
1017 static int _ptypes_offset;
1018 static int _form_offset;
1019
1020 static void compute_offsets();
1021
1022 public:
1023 // Accessors
1024 static oop rtype(oop mt);
1025 static objArrayOop ptypes(oop mt);
1026 static oop form(oop mt);
1027
1028 static oop ptype(oop mt, int index);
1029
1030 static symbolOop as_signature(oop mt, bool intern_if_not_found, TRAPS);
1031 static void print_signature(oop mt, outputStream* st);
1032
1033 static bool is_instance(oop obj) {
1034 return obj != NULL && obj->klass() == SystemDictionary::MethodType_klass();
1035 }
1036
1037 // Accessors for code generation:
1038 static int rtype_offset_in_bytes() { return _rtype_offset; }
1039 static int ptypes_offset_in_bytes() { return _ptypes_offset; }
1040 static int form_offset_in_bytes() { return _form_offset; }
1041 };
1042
1043 class java_dyn_MethodTypeForm: AllStatic {
1044 friend class JavaClasses;
1045
1046 private:
1047 static int _vmslots_offset; // number of argument slots needed
1048 static int _erasedType_offset; // erasedType = canonical MethodType
1049
1050 static void compute_offsets();
1051
1052 public:
1053 // Accessors
1054 static int vmslots(oop mtform);
1055 static oop erasedType(oop mtform);
1056
1057 // Accessors for code generation:
1058 static int vmslots_offset_in_bytes() { return _vmslots_offset; }
1059 static int erasedType_offset_in_bytes() { return _erasedType_offset; }
1060 };
1061
1062
1063
1064
781 // Interface to java.security.AccessControlContext objects 1065 // Interface to java.security.AccessControlContext objects
782 1066
783 class java_security_AccessControlContext: AllStatic { 1067 class java_security_AccessControlContext: AllStatic {
784 private: 1068 private:
785 // Note that for this class the layout changed between JDK1.2 and JDK1.3, 1069 // Note that for this class the layout changed between JDK1.2 and JDK1.3,