123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- Add support for DirectMethodHandle field implementations (StaticAccessor/Accessor).
-
- During the redefinition run, these instances are updated to point to new field index location.
- # HG changeset patch
- # Parent a5d69314e0a8e05605ca678e31eeba92ec173400
-
- diff -r a5d69314e0a8 src/share/vm/classfile/javaClasses.cpp
- --- a/src/share/vm/classfile/javaClasses.cpp Tue Mar 31 18:05:19 2015 -0700
- +++ b/src/share/vm/classfile/javaClasses.cpp Tue Mar 31 18:06:35 2015 -0700
- @@ -2667,6 +2667,50 @@
- }
- }
-
- +// Support for java_lang_invoke_DirectMethodHandle$StaticAccessor
- +
- +int java_lang_invoke_DirectMethodHandle_StaticAccessor::_static_offset_offset;
- +
- +long java_lang_invoke_DirectMethodHandle_StaticAccessor::static_offset(oop dmh) {
- + assert(_static_offset_offset != 0, "");
- + return dmh->long_field(_static_offset_offset);
- +}
- +
- +void java_lang_invoke_DirectMethodHandle_StaticAccessor::set_static_offset(oop dmh, long static_offset) {
- + assert(_static_offset_offset != 0, "");
- + dmh->long_field_put(_static_offset_offset, static_offset);
- +}
- +
- +
- +void java_lang_invoke_DirectMethodHandle_StaticAccessor::compute_offsets() {
- + Klass* klass_oop = SystemDictionary::DirectMethodHandle_StaticAccessor_klass();
- + if (klass_oop != NULL && EnableInvokeDynamic) {
- + compute_offset(_static_offset_offset, klass_oop, vmSymbols::static_offset_name(), vmSymbols::long_signature());
- + }
- +}
- +
- +// Support for java_lang_invoke_DirectMethodHandle$Accessor
- +
- +int java_lang_invoke_DirectMethodHandle_Accessor::_field_offset_offset;
- +
- +int java_lang_invoke_DirectMethodHandle_Accessor::field_offset(oop dmh) {
- + assert(_field_offset_offset != 0, "");
- + return dmh->int_field(_field_offset_offset);
- +}
- +
- +void java_lang_invoke_DirectMethodHandle_Accessor::set_field_offset(oop dmh, int field_offset) {
- + assert(_field_offset_offset != 0, "");
- + dmh->int_field_put(_field_offset_offset, field_offset);
- +}
- +
- +
- +void java_lang_invoke_DirectMethodHandle_Accessor::compute_offsets() {
- + Klass* klass_oop = SystemDictionary::DirectMethodHandle_Accessor_klass();
- + if (klass_oop != NULL && EnableInvokeDynamic) {
- + compute_offset(_field_offset_offset, klass_oop, vmSymbols::field_offset_name(), vmSymbols::int_signature());
- + }
- +}
- +
- // Support for java_lang_invoke_MethodHandle
-
- int java_lang_invoke_MethodHandle::_type_offset;
- @@ -3343,6 +3387,9 @@
- java_lang_invoke_LambdaForm::compute_offsets();
- java_lang_invoke_MethodType::compute_offsets();
- java_lang_invoke_CallSite::compute_offsets();
- +
- + java_lang_invoke_DirectMethodHandle_StaticAccessor::compute_offsets();
- + java_lang_invoke_DirectMethodHandle_Accessor::compute_offsets();
- }
- java_security_AccessControlContext::compute_offsets();
- // Initialize reflection classes. The layouts of these classes
- diff -r a5d69314e0a8 src/share/vm/classfile/javaClasses.hpp
- --- a/src/share/vm/classfile/javaClasses.hpp Tue Mar 31 18:05:19 2015 -0700
- +++ b/src/share/vm/classfile/javaClasses.hpp Tue Mar 31 18:06:35 2015 -0700
- @@ -1020,6 +1020,55 @@
- static int member_offset_in_bytes() { return _member_offset; }
- };
-
- +// Interface to java.lang.invoke.DirectMethodHandle$StaticAccessor objects
- +
- +class java_lang_invoke_DirectMethodHandle_StaticAccessor: AllStatic {
- + friend class JavaClasses;
- +
- + private:
- + static int _static_offset_offset; // offset to static field
- +
- + static void compute_offsets();
- +
- + public:
- + // Accessors
- + static long static_offset(oop dmh);
- + static void set_static_offset(oop dmh, long value);
- +
- + // Testers
- + static bool is_subclass(Klass* klass) {
- + return klass->is_subclass_of(SystemDictionary::DirectMethodHandle_StaticAccessor_klass());
- + }
- + static bool is_instance(oop obj) {
- + return obj != NULL && is_subclass(obj->klass());
- + }
- +};
- +
- +// Interface to java.lang.invoke.DirectMethodHandle$Accessor objects
- +
- +class java_lang_invoke_DirectMethodHandle_Accessor: AllStatic {
- + friend class JavaClasses;
- +
- + private:
- + static int _field_offset_offset; // offset to field
- +
- + static void compute_offsets();
- +
- + public:
- + // Accessors
- + static int field_offset(oop dmh);
- + static void set_field_offset(oop dmh, int value);
- +
- + // Testers
- + static bool is_subclass(Klass* klass) {
- + return klass->is_subclass_of(SystemDictionary::DirectMethodHandle_Accessor_klass());
- + }
- + static bool is_instance(oop obj) {
- + return obj != NULL && is_subclass(obj->klass());
- + }
- +};
- +
- +
- // Interface to java.lang.invoke.LambdaForm objects
- // (These are a private interface for managing adapter code generation.)
-
- diff -r a5d69314e0a8 src/share/vm/classfile/systemDictionary.hpp
- --- a/src/share/vm/classfile/systemDictionary.hpp Tue Mar 31 18:05:19 2015 -0700
- +++ b/src/share/vm/classfile/systemDictionary.hpp Tue Mar 31 18:06:35 2015 -0700
- @@ -153,6 +153,8 @@
- \
- /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
- do_klass(DirectMethodHandle_klass, java_lang_invoke_DirectMethodHandle, Opt ) \
- + do_klass(DirectMethodHandle_StaticAccessor_klass, java_lang_invoke_DirectMethodHandle_StaticAccessor, Opt ) \
- + do_klass(DirectMethodHandle_Accessor_klass, java_lang_invoke_DirectMethodHandle_Accessor, Opt ) \
- do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_JSR292 ) \
- do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre_JSR292 ) \
- do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre_JSR292 ) \
- diff -r a5d69314e0a8 src/share/vm/classfile/vmSymbols.hpp
- --- a/src/share/vm/classfile/vmSymbols.hpp Tue Mar 31 18:05:19 2015 -0700
- +++ b/src/share/vm/classfile/vmSymbols.hpp Tue Mar 31 18:06:35 2015 -0700
- @@ -265,6 +265,8 @@
- template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
- template(java_lang_invoke_ConstantCallSite, "java/lang/invoke/ConstantCallSite") \
- template(java_lang_invoke_DirectMethodHandle, "java/lang/invoke/DirectMethodHandle") \
- + template(java_lang_invoke_DirectMethodHandle_StaticAccessor, "java/lang/invoke/DirectMethodHandle$StaticAccessor") \
- + template(java_lang_invoke_DirectMethodHandle_Accessor, "java/lang/invoke/DirectMethodHandle$Accessor") \
- template(java_lang_invoke_MutableCallSite, "java/lang/invoke/MutableCallSite") \
- template(java_lang_invoke_VolatileCallSite, "java/lang/invoke/VolatileCallSite") \
- template(java_lang_invoke_MethodHandle, "java/lang/invoke/MethodHandle") \
- @@ -414,6 +416,10 @@
- template(getProtectionDomain_name, "getProtectionDomain") \
- template(getProtectionDomain_signature, "(Ljava/security/CodeSource;)Ljava/security/ProtectionDomain;") \
- template(url_code_signer_array_void_signature, "(Ljava/net/URL;[Ljava/security/CodeSigner;)V") \
- + template(static_offset_name, "staticOffset") \
- + template(static_base_name, "staticBase") \
- + template(field_offset_name, "fieldOffset") \
- + template(field_type_name, "fieldType") \
- template(referencequeue_null_name, "NULL") \
- template(referencequeue_enqueued_name, "ENQUEUED") \
- \
- /* non-intrinsic name/signature pairs: */ \
- template(register_method_name, "register") \
|