You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dmh-field-accessors-java8u172.patch 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. Add support for DirectMethodHandle field implementations (StaticAccessor/Accessor).
  2. During the redefinition run, these instances are updated to point to new field index location.
  3. # HG changeset patch
  4. # Parent a5d69314e0a8e05605ca678e31eeba92ec173400
  5. diff -r a5d69314e0a8 src/share/vm/classfile/javaClasses.cpp
  6. --- a/src/share/vm/classfile/javaClasses.cpp Tue Mar 31 18:05:19 2015 -0700
  7. +++ b/src/share/vm/classfile/javaClasses.cpp Tue Mar 31 18:06:35 2015 -0700
  8. @@ -2667,6 +2667,50 @@
  9. }
  10. }
  11. +// Support for java_lang_invoke_DirectMethodHandle$StaticAccessor
  12. +
  13. +int java_lang_invoke_DirectMethodHandle_StaticAccessor::_static_offset_offset;
  14. +
  15. +long java_lang_invoke_DirectMethodHandle_StaticAccessor::static_offset(oop dmh) {
  16. + assert(_static_offset_offset != 0, "");
  17. + return dmh->long_field(_static_offset_offset);
  18. +}
  19. +
  20. +void java_lang_invoke_DirectMethodHandle_StaticAccessor::set_static_offset(oop dmh, long static_offset) {
  21. + assert(_static_offset_offset != 0, "");
  22. + dmh->long_field_put(_static_offset_offset, static_offset);
  23. +}
  24. +
  25. +
  26. +void java_lang_invoke_DirectMethodHandle_StaticAccessor::compute_offsets() {
  27. + Klass* klass_oop = SystemDictionary::DirectMethodHandle_StaticAccessor_klass();
  28. + if (klass_oop != NULL && EnableInvokeDynamic) {
  29. + compute_offset(_static_offset_offset, klass_oop, vmSymbols::static_offset_name(), vmSymbols::long_signature());
  30. + }
  31. +}
  32. +
  33. +// Support for java_lang_invoke_DirectMethodHandle$Accessor
  34. +
  35. +int java_lang_invoke_DirectMethodHandle_Accessor::_field_offset_offset;
  36. +
  37. +int java_lang_invoke_DirectMethodHandle_Accessor::field_offset(oop dmh) {
  38. + assert(_field_offset_offset != 0, "");
  39. + return dmh->int_field(_field_offset_offset);
  40. +}
  41. +
  42. +void java_lang_invoke_DirectMethodHandle_Accessor::set_field_offset(oop dmh, int field_offset) {
  43. + assert(_field_offset_offset != 0, "");
  44. + dmh->int_field_put(_field_offset_offset, field_offset);
  45. +}
  46. +
  47. +
  48. +void java_lang_invoke_DirectMethodHandle_Accessor::compute_offsets() {
  49. + Klass* klass_oop = SystemDictionary::DirectMethodHandle_Accessor_klass();
  50. + if (klass_oop != NULL && EnableInvokeDynamic) {
  51. + compute_offset(_field_offset_offset, klass_oop, vmSymbols::field_offset_name(), vmSymbols::int_signature());
  52. + }
  53. +}
  54. +
  55. // Support for java_lang_invoke_MethodHandle
  56. int java_lang_invoke_MethodHandle::_type_offset;
  57. @@ -3343,6 +3387,9 @@
  58. java_lang_invoke_LambdaForm::compute_offsets();
  59. java_lang_invoke_MethodType::compute_offsets();
  60. java_lang_invoke_CallSite::compute_offsets();
  61. +
  62. + java_lang_invoke_DirectMethodHandle_StaticAccessor::compute_offsets();
  63. + java_lang_invoke_DirectMethodHandle_Accessor::compute_offsets();
  64. }
  65. java_security_AccessControlContext::compute_offsets();
  66. // Initialize reflection classes. The layouts of these classes
  67. diff -r a5d69314e0a8 src/share/vm/classfile/javaClasses.hpp
  68. --- a/src/share/vm/classfile/javaClasses.hpp Tue Mar 31 18:05:19 2015 -0700
  69. +++ b/src/share/vm/classfile/javaClasses.hpp Tue Mar 31 18:06:35 2015 -0700
  70. @@ -1020,6 +1020,55 @@
  71. static int member_offset_in_bytes() { return _member_offset; }
  72. };
  73. +// Interface to java.lang.invoke.DirectMethodHandle$StaticAccessor objects
  74. +
  75. +class java_lang_invoke_DirectMethodHandle_StaticAccessor: AllStatic {
  76. + friend class JavaClasses;
  77. +
  78. + private:
  79. + static int _static_offset_offset; // offset to static field
  80. +
  81. + static void compute_offsets();
  82. +
  83. + public:
  84. + // Accessors
  85. + static long static_offset(oop dmh);
  86. + static void set_static_offset(oop dmh, long value);
  87. +
  88. + // Testers
  89. + static bool is_subclass(Klass* klass) {
  90. + return klass->is_subclass_of(SystemDictionary::DirectMethodHandle_StaticAccessor_klass());
  91. + }
  92. + static bool is_instance(oop obj) {
  93. + return obj != NULL && is_subclass(obj->klass());
  94. + }
  95. +};
  96. +
  97. +// Interface to java.lang.invoke.DirectMethodHandle$Accessor objects
  98. +
  99. +class java_lang_invoke_DirectMethodHandle_Accessor: AllStatic {
  100. + friend class JavaClasses;
  101. +
  102. + private:
  103. + static int _field_offset_offset; // offset to field
  104. +
  105. + static void compute_offsets();
  106. +
  107. + public:
  108. + // Accessors
  109. + static int field_offset(oop dmh);
  110. + static void set_field_offset(oop dmh, int value);
  111. +
  112. + // Testers
  113. + static bool is_subclass(Klass* klass) {
  114. + return klass->is_subclass_of(SystemDictionary::DirectMethodHandle_Accessor_klass());
  115. + }
  116. + static bool is_instance(oop obj) {
  117. + return obj != NULL && is_subclass(obj->klass());
  118. + }
  119. +};
  120. +
  121. +
  122. // Interface to java.lang.invoke.LambdaForm objects
  123. // (These are a private interface for managing adapter code generation.)
  124. diff -r a5d69314e0a8 src/share/vm/classfile/systemDictionary.hpp
  125. --- a/src/share/vm/classfile/systemDictionary.hpp Tue Mar 31 18:05:19 2015 -0700
  126. +++ b/src/share/vm/classfile/systemDictionary.hpp Tue Mar 31 18:06:35 2015 -0700
  127. @@ -153,6 +153,8 @@
  128. \
  129. /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
  130. do_klass(DirectMethodHandle_klass, java_lang_invoke_DirectMethodHandle, Opt ) \
  131. + do_klass(DirectMethodHandle_StaticAccessor_klass, java_lang_invoke_DirectMethodHandle_StaticAccessor, Opt ) \
  132. + do_klass(DirectMethodHandle_Accessor_klass, java_lang_invoke_DirectMethodHandle_Accessor, Opt ) \
  133. do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_JSR292 ) \
  134. do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre_JSR292 ) \
  135. do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre_JSR292 ) \
  136. diff -r a5d69314e0a8 src/share/vm/classfile/vmSymbols.hpp
  137. --- a/src/share/vm/classfile/vmSymbols.hpp Tue Mar 31 18:05:19 2015 -0700
  138. +++ b/src/share/vm/classfile/vmSymbols.hpp Tue Mar 31 18:06:35 2015 -0700
  139. @@ -265,6 +265,8 @@
  140. template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
  141. template(java_lang_invoke_ConstantCallSite, "java/lang/invoke/ConstantCallSite") \
  142. template(java_lang_invoke_DirectMethodHandle, "java/lang/invoke/DirectMethodHandle") \
  143. + template(java_lang_invoke_DirectMethodHandle_StaticAccessor, "java/lang/invoke/DirectMethodHandle$StaticAccessor") \
  144. + template(java_lang_invoke_DirectMethodHandle_Accessor, "java/lang/invoke/DirectMethodHandle$Accessor") \
  145. template(java_lang_invoke_MutableCallSite, "java/lang/invoke/MutableCallSite") \
  146. template(java_lang_invoke_VolatileCallSite, "java/lang/invoke/VolatileCallSite") \
  147. template(java_lang_invoke_MethodHandle, "java/lang/invoke/MethodHandle") \
  148. @@ -414,6 +416,10 @@
  149. template(getProtectionDomain_name, "getProtectionDomain") \
  150. template(getProtectionDomain_signature, "(Ljava/security/CodeSource;)Ljava/security/ProtectionDomain;") \
  151. template(url_code_signer_array_void_signature, "(Ljava/net/URL;[Ljava/security/CodeSigner;)V") \
  152. + template(static_offset_name, "staticOffset") \
  153. + template(static_base_name, "staticBase") \
  154. + template(field_offset_name, "fieldOffset") \
  155. + template(field_type_name, "fieldType") \
  156. template(referencequeue_null_name, "NULL") \
  157. template(referencequeue_enqueued_name, "ENQUEUED") \
  158. \
  159. /* non-intrinsic name/signature pairs: */ \
  160. template(register_method_name, "register") \