[openjdk-7-jre-dcevm] 02/05: Imported the DCEVM patches for Java 7u79-b15
Emmanuel Bourg
ebourg-guest at moszumanska.debian.org
Tue Sep 22 09:49:09 UTC 2015
This is an automated email from the git hooks/post-receive script.
ebourg-guest pushed a commit to branch master
in repository openjdk-7-jre-dcevm.
commit 8978ee482081cca65a06725049b573ed60081aac
Author: Emmanuel Bourg <ebourg at apache.org>
Date: Tue Sep 22 10:40:27 2015 +0200
Imported the DCEVM patches for Java 7u79-b15
---
debian/changelog | 3 +-
debian/orig-tar.sh | 2 +-
debian/patches/full-jdk7u60-deopt-cp.patch | 230 ++++++++++++++
.../patches/full-jdk7u79-b15-method-handles.patch | 335 +++++++++++++++++++++
...ll-jdk7u60-b09.patch => full-jdk7u79-b15.patch} | 293 +++++++++---------
debian/patches/java7u71-compatibility.patch | 146 ---------
debian/patches/series | 5 +-
7 files changed, 718 insertions(+), 296 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 0f765fe..9d0dcbb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,5 +1,6 @@
-openjdk-7-jre-dcevm (7u60-4) UNRELEASED; urgency=medium
+openjdk-7-jre-dcevm (7u79-1) UNRELEASED; urgency=medium
+ * New upstream release
* Updated debian/watch
-- Emmanuel Bourg <ebourg at apache.org> Tue, 22 Sep 2015 09:45:15 +0200
diff --git a/debian/orig-tar.sh b/debian/orig-tar.sh
index ed88c03..fbf81c6 100755
--- a/debian/orig-tar.sh
+++ b/debian/orig-tar.sh
@@ -2,7 +2,7 @@
VERSION=$2
TAR=../openjdk-7-jre-dcevm_$VERSION.orig.tar.gz
-TAG=jdk7u60-b09
+TAG=jdk7u79-b15
rm -f $3
diff --git a/debian/patches/full-jdk7u60-deopt-cp.patch b/debian/patches/full-jdk7u60-deopt-cp.patch
new file mode 100644
index 0000000..00a5836
--- /dev/null
+++ b/debian/patches/full-jdk7u60-deopt-cp.patch
@@ -0,0 +1,230 @@
+--- a/src/share/vm/classfile/classFileParser.cpp
++++ b/src/share/vm/classfile/classFileParser.cpp
+@@ -3977,6 +3977,11 @@
+ }
+ }
+
++ if (cfs->source() != NULL && HotswapDeoptClassPath != NULL) {
++ if (strstr(cfs->source(), HotswapDeoptClassPath) != NULL)
++ this_klass->set_deoptimization_incl(true);
++ }
++
+ if (TraceClassResolution) {
+ // print out the superclass.
+ const char * from = Klass::cast(this_klass())->external_name();
+--- a/src/share/vm/classfile/systemDictionary.cpp
++++ b/src/share/vm/classfile/systemDictionary.cpp
+@@ -1255,6 +1255,11 @@
+ }
+ }
+
++ if (HotswapDeoptClassPath != NULL) {
++ if (strstr(HotswapDeoptClassPath, ik->external_name()) != NULL)
++ ik->set_deoptimization_incl(true);
++ }
++
+ if (TraceClassLoading) {
+ ResourceMark rm;
+ tty->print("[Loaded %s", ik->external_name());
+--- a/src/share/vm/code/codeCache.cpp
++++ b/src/share/vm/code/codeCache.cpp
+@@ -715,6 +715,14 @@
+
+
+ // Deoptimize all methods
++void CodeCache::mark_all_incl_nmethods_for_deoptimization() {
++ MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
++ FOR_ALL_ALIVE_NMETHODS(nm) {
++ nm->mark_for_deoptimization_incl();
++ }
++}
++
++// Deoptimize all methods
+ void CodeCache::mark_all_nmethods_for_deoptimization() {
+ MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+ FOR_ALL_ALIVE_NMETHODS(nm) {
+--- a/src/share/vm/code/codeCache.hpp
++++ b/src/share/vm/code/codeCache.hpp
+@@ -186,6 +186,7 @@
+ #endif // HOTSWAP
+
+ static void mark_all_nmethods_for_deoptimization();
++ static void mark_all_incl_nmethods_for_deoptimization();
+ static int mark_for_deoptimization(methodOop dependee);
+ static void make_marked_nmethods_zombies();
+ static void make_marked_nmethods_not_entrant();
+--- a/src/share/vm/code/nmethod.cpp
++++ b/src/share/vm/code/nmethod.cpp
+@@ -465,6 +465,7 @@
+ _lazy_critical_native = 0;
+ _has_wide_vectors = 0;
+ _marked_for_deoptimization = 0;
++ _deoptimization_incl = false;
+ _lock_count = 0;
+ _stack_traversal_mark = 0;
+ _unload_reported = false; // jvmti state
+@@ -673,6 +674,9 @@
+ _exception_cache = NULL;
+ _pc_desc_cache.reset_to(NULL);
+
++ if (method != NULL)
++ _deoptimization_incl = Klass::cast(method->method_holder())->is_deoptimization_incl();
++
+ code_buffer->copy_oops_to(this);
+ if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
+ CodeCache::add_scavenge_root_nmethod(this);
+@@ -756,6 +760,9 @@
+ _exception_cache = NULL;
+ _pc_desc_cache.reset_to(NULL);
+
++ if (method != NULL)
++ _deoptimization_incl = Klass::cast(method->method_holder())->is_deoptimization_incl();
++
+ code_buffer->copy_oops_to(this);
+ debug_only(verify_scavenge_root_oops());
+ CodeCache::commit(this);
+@@ -864,6 +871,9 @@
+ _exception_cache = NULL;
+ _pc_desc_cache.reset_to(scopes_pcs_begin());
+
++ if (method != NULL)
++ _deoptimization_incl = Klass::cast(method->method_holder())->is_deoptimization_incl();
++
+ // Copy contents of ScopeDescRecorder to nmethod
+ code_buffer->copy_oops_to(this);
+ debug_info->copy_to(this);
+--- a/src/share/vm/code/nmethod.hpp
++++ b/src/share/vm/code/nmethod.hpp
+@@ -169,6 +169,8 @@
+ bool _marked_for_reclamation; // Used by NMethodSweeper (set only by sweeper)
+ bool _marked_for_deoptimization; // Used for stack deoptimization
+
++ bool _deoptimization_incl;
++
+ // used by jvmti to track if an unload event has been posted for this nmethod.
+ bool _unload_reported;
+
+@@ -412,6 +414,11 @@
+ bool is_marked_for_deoptimization() const { return _marked_for_deoptimization; }
+ void mark_for_deoptimization() { _marked_for_deoptimization = true; }
+
++ bool is_deoptimization_incl() const { return _deoptimization_incl; }
++ void set_deoptimization_incl(bool z) { _deoptimization_incl = z; }
++
++ void mark_for_deoptimization_incl() { if (_deoptimization_incl) _marked_for_deoptimization = true; }
++
+ void make_unloaded(BoolObjectClosure* is_alive, oop cause);
+
+ bool has_dependencies() { return dependencies_size() != 0; }
+--- a/src/share/vm/oops/klass.cpp
++++ b/src/share/vm/oops/klass.cpp
+@@ -57,7 +57,11 @@
+
+ void Klass::update_supers_to_newest_version() {
+
+- if (super() != NULL) set_super(super()->klass_part()->newest_version());
++ if (super() != NULL) {
++ set_super(super()->klass_part()->newest_version());
++ if (super()->klass_part()->is_deoptimization_incl())
++ set_deoptimization_incl(true);
++ }
+
+ for (uint i=0; i<primary_super_limit(); i++) {
+ klassOop cur = _primary_supers[i];
+@@ -192,6 +196,7 @@
+
+ kl->set_redefinition_flags(Klass::NoRedefinition);
+ kl->set_redefining(false);
++ kl->set_deoptimization_incl(false);
+ kl->set_new_version(NULL);
+ kl->set_old_version(NULL);
+ kl->set_redefinition_index(-1);
+@@ -265,6 +270,8 @@
+ if (FastSuperclassLimit == 0) {
+ // None of the other machinery matters.
+ set_super(k);
++ if (k != NULL && k->klass_part()->is_deoptimization_incl())
++ set_deoptimization_incl(true);
+ return;
+ }
+ if (k == NULL) {
+@@ -276,6 +283,8 @@
+ "initialize this only once to a non-trivial value");
+ set_super(k);
+ Klass* sup = k->klass_part();
++ if (sup->is_deoptimization_incl())
++ set_deoptimization_incl(true);
+ int sup_depth = sup->super_depth();
+ juint my_depth = MIN2(sup_depth + 1, (int)primary_super_limit());
+ if (!can_be_primary_super_slow())
+--- a/src/share/vm/oops/klass.hpp
++++ b/src/share/vm/oops/klass.hpp
+@@ -304,6 +304,7 @@
+ char _field_redefinition_policy;
+ char _static_field_redefinition_policy;
+ bool _is_redefining;
++ bool _deoptimization_incl; // True if class methods are included in deoptimization
+
+ #ifndef PRODUCT
+ int _verify_count; // to avoid redundant verifies
+@@ -388,6 +389,9 @@
+ else { return _old_version->klass_part()->is_same_or_older_version(klass); }
+ }
+
++ bool is_deoptimization_incl() const { return _deoptimization_incl; }
++ void set_deoptimization_incl(bool z) { _deoptimization_incl = z; }
++
+ // Revision number for redefined classes, -1 for originally loaded classes
+ jint revision_number() const {
+ return _revision_number;
+--- a/src/share/vm/prims/jvmtiRedefineClasses.cpp
++++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp
+@@ -435,6 +435,8 @@
+
+ new_class->set_redefinition_flags(redefinition_flags);
+
++ new_class->set_deoptimization_incl(true);
++
+ _max_redefinition_flags = _max_redefinition_flags | redefinition_flags;
+
+ if ((redefinition_flags & Klass::ModifyInstances) != 0) {
+@@ -2580,7 +2582,8 @@
+ }*/
+
+ Klass *k = k_oop->klass_part();
+- if (k->oop_is_instance()) {
++
++ if (k->oop_is_instance() && (HotswapDeoptClassPath == NULL || k->is_deoptimization_incl())) {
+ HandleMark hm(THREAD);
+ instanceKlass *ik = (instanceKlass *) k;
+
+@@ -2683,7 +2686,11 @@
+ if (0 && JvmtiExport::all_dependencies_are_recorded()) {
+ Universe::flush_evol_dependents_on(k_h);
+ } else {
+- CodeCache::mark_all_nmethods_for_deoptimization();
++
++ if (HotswapDeoptClassPath == NULL)
++ CodeCache::mark_all_nmethods_for_deoptimization();
++ else
++ CodeCache::mark_all_incl_nmethods_for_deoptimization();
+
+ ResourceMark rm(THREAD);
+ DeoptimizationMarker dm;
+--- a/src/share/vm/runtime/globals.hpp
++++ b/src/share/vm/runtime/globals.hpp
+@@ -3682,7 +3682,13 @@
+ product(bool, EnableTracing, false, \
+ "Enable event-based tracing") \
+ product(bool, UseLockedTracing, false, \
+- "Use locked-tracing when doing event-based tracing")
++ "Use locked-tracing when doing event-based tracing") \
++ product(ccstr, HotswapDeoptClassPath, NULL, \
++ "Class path or fragment of the class path to a folder with " \
++ "classes allowed to be deoptimized on hotswap. If is not " \
++ "defined then all classes will be deoptimized on hotswap. " \
++ "That's default behaviour. Using this option the performance " \
++ "of hotswap can be considerably increased. ")
+
+ /*
+ * Macros for factoring of globals
diff --git a/debian/patches/full-jdk7u79-b15-method-handles.patch b/debian/patches/full-jdk7u79-b15-method-handles.patch
new file mode 100644
index 0000000..b6e5a64
--- /dev/null
+++ b/debian/patches/full-jdk7u79-b15-method-handles.patch
@@ -0,0 +1,335 @@
+# HG changeset patch
+# Parent a51cdc4778871d65e004c6858c2d4afa806dbe42
+
+--- a/src/share/vm/classfile/javaClasses.cpp
++++ b/src/share/vm/classfile/javaClasses.cpp
+@@ -2409,6 +2409,52 @@
+ }
+ }
+
++// 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() {
++ klassOop 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() {
++ klassOop 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;
+@@ -3028,6 +3074,8 @@
+ if (EnableInvokeDynamic) {
+ java_lang_invoke_MethodHandle::compute_offsets();
+ java_lang_invoke_DirectMethodHandle::compute_offsets();
++ java_lang_invoke_DirectMethodHandle_StaticAccessor::compute_offsets();
++ java_lang_invoke_DirectMethodHandle_Accessor::compute_offsets();
+ java_lang_invoke_MemberName::compute_offsets();
+ java_lang_invoke_LambdaForm::compute_offsets();
+ java_lang_invoke_MethodType::compute_offsets();
+--- a/src/share/vm/classfile/javaClasses.hpp
++++ b/src/share/vm/classfile/javaClasses.hpp
+@@ -940,6 +940,54 @@
+ 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(klassOop klass) {
++ return Klass::cast(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(klassOop klass) {
++ return Klass::cast(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.)
+
+--- a/src/share/vm/classfile/systemDictionary.hpp
++++ b/src/share/vm/classfile/systemDictionary.hpp
+@@ -148,6 +148,8 @@
+ do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15 ) \
+ \
+ /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
++ 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 ) \
+--- a/src/share/vm/classfile/vmSymbols.hpp
++++ b/src/share/vm/classfile/vmSymbols.hpp
+@@ -248,6 +248,8 @@
+ /* Support for JSR 292 & invokedynamic (JDK 1.7 and above) */ \
+ template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
+ template(java_lang_invoke_ConstantCallSite, "java/lang/invoke/ConstantCallSite") \
++ 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_DirectMethodHandle, "java/lang/invoke/DirectMethodHandle") \
+ template(java_lang_invoke_MutableCallSite, "java/lang/invoke/MutableCallSite") \
+ template(java_lang_invoke_VolatileCallSite, "java/lang/invoke/VolatileCallSite") \
+@@ -485,6 +487,10 @@
+ template(int_StringBuffer_signature, "(I)Ljava/lang/StringBuffer;") \
+ template(char_StringBuffer_signature, "(C)Ljava/lang/StringBuffer;") \
+ template(int_String_signature, "(I)Ljava/lang/String;") \
++ template(static_offset_name, "staticOffset") \
++ template(static_base_name, "staticBase") \
++ template(field_offset_name, "fieldOffset") \
++ template(field_type_name, "fieldType") \
+ /* signature symbols needed by intrinsics */ \
+ VM_INTRINSICS_DO(VM_INTRINSIC_IGNORE, VM_SYMBOL_IGNORE, VM_SYMBOL_IGNORE, template, VM_ALIAS_IGNORE) \
+ \
+--- a/src/share/vm/prims/jvmtiRedefineClasses.cpp
++++ b/src/share/vm/prims/jvmtiRedefineClasses.cpp
+@@ -2110,6 +2110,120 @@
+
+ }
+
++// import java_lang_invoke_MemberName.*
++enum {
++ REFERENCE_KIND_SHIFT = java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT,
++ REFERENCE_KIND_MASK = java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK,
++};
++
++static oop field_name_or_null(Symbol* s) {
++ if (s == NULL) return NULL;
++ return StringTable::lookup(s);
++}
++
++static oop object_java_mirror() {
++ return Klass::cast(SystemDictionary::Object_klass())->java_mirror();
++}
++
++static oop field_signature_type_or_null(Symbol* s) {
++ if (s == NULL) return NULL;
++ BasicType bt = FieldType::basic_type(s);
++ if (is_java_primitive(bt)) {
++ assert(s->utf8_length() == 1, "");
++ return java_lang_Class::primitive_mirror(bt);
++ }
++ // Here are some more short cuts for common types.
++ // They are optional, since reference types can be resolved lazily.
++ if (bt == T_OBJECT) {
++ if (s == vmSymbols::object_signature()) {
++ return object_java_mirror();
++ } else if (s == vmSymbols::class_signature()) {
++ return Klass::cast(SystemDictionary::Class_klass())->java_mirror();
++ } else if (s == vmSymbols::string_signature()) {
++ return Klass::cast(SystemDictionary::String_klass())->java_mirror();
++ }
++ }
++ return NULL;
++}
++
++bool update_member_name(oop obj) {
++ int flags = java_lang_invoke_MemberName::flags(obj);
++ int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
++ if (MethodHandles::ref_kind_is_method(ref_kind)) {
++ methodOop m = (methodOop) java_lang_invoke_MemberName::vmtarget(obj);
++ if (m != NULL && !instanceKlass::cast(m->method_holder())->is_newest_version()) {
++ // Let's try to re-resolve method
++ KlassHandle newest = instanceKlass::cast(m->method_holder())->newest_version();
++ methodOop new_method = instanceKlass::cast(newest())->find_method(m->name(), m->signature());
++
++ // Note: we might set NULL at this point, which should force AbstractMethodError at runtime
++ bool do_dispatch = (ref_kind != JVM_REF_invokeSpecial);
++ MethodHandles::init_method_MemberName(obj, new_method, do_dispatch, newest);
++ }
++ } else if (MethodHandles::ref_kind_is_field(ref_kind)) {
++ klassOop k = (klassOop) java_lang_invoke_MemberName::vmtarget(obj);
++ if (k == NULL) {
++ return false; // Was cleared before, this MemberName is invalid.
++ }
++
++ if (k != NULL && !Klass::cast(k)->is_newest_version()) {
++ // Let's try to re-resolve field
++ fieldDescriptor fd;
++ int offset = java_lang_invoke_MemberName::vmindex(obj);
++ bool is_static = MethodHandles::ref_kind_is_static(ref_kind);
++ instanceKlass *ik = instanceKlass::cast(k);
++ if (ik->find_local_field_from_offset(offset, is_static, &fd)) {
++ KlassHandle newest = Klass::cast(k)->newest_version();
++ fieldDescriptor fd_new;
++ if (instanceKlass::cast(newest())->find_local_field(fd.name(), fd.signature(), &fd_new)) {
++ bool is_setter = MethodHandles::ref_kind_is_setter(ref_kind);
++ oop type = field_signature_type_or_null(fd_new.signature());
++ oop name = field_name_or_null(fd_new.name());
++ MethodHandles::init_field_MemberName(obj, newest, fd_new.access_flags(), type, name, fd_new.offset(), is_setter);
++ } else {
++ // Matching field is not found in new version, not much we can do here.
++ // JVM will crash once faulty MH is invoked.
++ // However, to avoid that all DMH's using this faulty MH are cleared (set to NULL)
++ // Eventually, we probably want to replace them with something more meaningful,
++ // like instance throwing NoSuchFieldError or DMH that will resort to dynamic
++ // field resolution (with possibility of type conversion)
++ java_lang_invoke_MemberName::set_vmtarget(obj, NULL);
++ java_lang_invoke_MemberName::set_vmindex(obj, 0);
++ return false;
++ }
++ }
++ }
++ }
++ return true;
++}
++
++bool update_direct_method_handle(oop obj) {
++ // Always update member name first.
++ oop mem_name = java_lang_invoke_DirectMethodHandle::member(obj);
++ if (!update_member_name(mem_name)) {
++ return false;
++ }
++
++ // Here we rely on DirectMethodHandle implementation.
++ // The current implementation caches field offset in $StaticAccessor/$Accessor
++ int flags = java_lang_invoke_MemberName::flags(mem_name);
++ int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
++ if (MethodHandles::ref_kind_is_field(ref_kind)) {
++ // Note: we don't care about staticBase field (which is java.lang.Class)
++ // It should be processed during normal object update.
++ // Update offset in StaticAccessor
++ int offset = java_lang_invoke_MemberName::vmindex(mem_name);
++ if (offset != 0) { // index of 0 means that field no longer exist
++ if (java_lang_invoke_DirectMethodHandle_StaticAccessor::is_instance(obj)) {
++ java_lang_invoke_DirectMethodHandle_StaticAccessor::set_static_offset(obj, offset);
++ } else if (java_lang_invoke_DirectMethodHandle_Accessor::is_instance(obj)) {
++ java_lang_invoke_DirectMethodHandle_Accessor::set_field_offset(obj, offset);
++ }
++ }
++ }
++ return true;
++}
++
+ template <class T> void VM_RedefineClasses::do_oop_work(T* p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop)) {
+@@ -2148,6 +2262,18 @@
+ }
+ }
+ }
++ } else {
++ // JSR 292 support, uptade java.lang.invoke.MemberName instances
++ if (java_lang_invoke_MemberName::is_instance(obj)) {
++ update_member_name(obj);
++ } else if (java_lang_invoke_DirectMethodHandle::is_instance(obj)) {
++ if (!update_direct_method_handle(obj)) {
++ // DMH is no longer valid, replace it with null reference.
++ // See note above. We probably want to replace this with something more meaningful.
++ oopDesc::encode_store_heap_oop(p, NULL);
++ //S::oop_store(p, NULL);
++ }
++ }
+ }
+ }
+ }
+@@ -2245,6 +2371,12 @@
+
+ virtual void do_object(oop obj) {
+ if (!obj->is_instanceKlass()) {
++ // JSR 292 support, uptade java.lang.invoke.MemberName instances
++ // Update before we update its fields, so if it is a field ref, its vmtarget still points at old klass
++ if (java_lang_invoke_MemberName::is_instance(obj)) {
++ update_member_name(obj);
++ }
++
+ obj->oop_iterate(_closure);
+
+ if (obj->blueprint()->is_redefining()) {
+@@ -2822,6 +2954,11 @@
+ // TODO:
+ transfer_old_native_function_registrations(the_old_class);
+
++ // Swap method handles
++ MemberNameTable* mnt = the_old_class->member_names();
++ assert(the_new_class->member_names() == NULL, "");
++ the_new_class->set_member_names(mnt);
++ the_old_class->set_member_names(NULL);
+
+ #ifdef ASSERT
+
+--- a/src/share/vm/runtime/mutexLocker.cpp
++++ b/src/share/vm/runtime/mutexLocker.cpp
+@@ -267,7 +267,7 @@
+ def(Heap_lock , Monitor, nonleaf+1, false);
+ def(JfieldIdCreation_lock , Mutex , nonleaf+1, true ); // jfieldID, Used in VM_Operation
+ def(JNICachedItableIndex_lock , Mutex , nonleaf+1, false); // Used to cache an itable index during JNI invoke
+- def(MemberNameTable_lock , Mutex , nonleaf+1, false); // Used to protect MemberNameTable
++ def(MemberNameTable_lock , Mutex , nonleaf+1, true); // Used to protect MemberNameTable
+
+ def(CompiledIC_lock , Mutex , nonleaf+2, false); // locks VtableStubs_lock, InlineCacheBuffer_lock
+ def(CompileTaskAlloc_lock , Mutex , nonleaf+2, true );
diff --git a/debian/patches/full-jdk7u60-b09.patch b/debian/patches/full-jdk7u79-b15.patch
similarity index 99%
rename from debian/patches/full-jdk7u60-b09.patch
rename to debian/patches/full-jdk7u79-b15.patch
index 4c7dedd..97d6f74 100644
--- a/debian/patches/full-jdk7u60-b09.patch
+++ b/debian/patches/full-jdk7u79-b15.patch
@@ -1,3 +1,6 @@
+# HG changeset patch
+# Parent 882f6c762ac5352a0d94efcea46c8f9a917ceb08
+
--- a/make/bsd/makefiles/gcc.make
+++ b/make/bsd/makefiles/gcc.make
@@ -117,7 +117,10 @@
@@ -486,7 +489,7 @@
interf = KlassHandle(THREAD, k);
}
-@@ -1912,6 +1919,8 @@
+@@ -1923,6 +1930,8 @@
int runtime_invisible_parameter_annotations_length = 0;
u1* annotation_default = NULL;
int annotation_default_length = 0;
@@ -495,7 +498,7 @@
// Parse code and exceptions attribute
u2 method_attributes_count = cfs->get_u2_fast();
-@@ -2081,6 +2090,24 @@
+@@ -2092,6 +2101,24 @@
parse_stackmap_table(code_attribute_length, CHECK_(nullHandle));
stackmap_data = typeArrayHandle(THREAD, sm);
parsed_stackmap_attribute = true;
@@ -520,7 +523,7 @@
} else {
// Skip unknown attributes
cfs->skip_u1(code_attribute_length, CHECK_(nullHandle));
-@@ -2206,6 +2233,18 @@
+@@ -2216,6 +2243,18 @@
}
#endif
@@ -539,7 +542,7 @@
// Fill in code attribute information
m->set_max_stack(max_stack);
m->set_max_locals(max_locals);
-@@ -2219,6 +2258,8 @@
+@@ -2229,6 +2268,8 @@
*/
m->constMethod()->set_stackmap_data(stackmap_data());
@@ -548,7 +551,7 @@
// Copy byte codes
m->set_code(code_start);
-@@ -2792,6 +2833,15 @@
+@@ -2825,6 +2866,15 @@
"Invalid Deprecated classfile attribute length %u in class file %s",
attribute_length, CHECK);
}
@@ -564,7 +567,7 @@
} else if (_major_version >= JAVA_1_5_VERSION) {
if (tag == vmSymbols::tag_signature()) {
if (attribute_length != 2) {
-@@ -2895,6 +2945,17 @@
+@@ -2929,6 +2979,17 @@
}
k->set_inner_classes(_inner_classes());
k->set_class_annotations(_annotations());
@@ -582,7 +585,7 @@
}
typeArrayHandle ClassFileParser::assemble_annotations(u1* runtime_visible_annotations,
-@@ -2918,9 +2979,126 @@
+@@ -2952,9 +3013,126 @@
}
@@ -709,7 +712,7 @@
KlassHandle host_klass,
GrowableArray<Handle>* cp_patches,
TempNewSymbol& parsed_name,
-@@ -2971,10 +3149,13 @@
+@@ -3005,10 +3183,13 @@
unsigned char* ptr = cfs->buffer();
unsigned char* end_ptr = cfs->buffer() + cfs->length();
@@ -723,7 +726,7 @@
if (ptr != cfs->buffer()) {
// JVMTI agent has modified class file data.
-@@ -3130,7 +3311,11 @@
+@@ -3164,7 +3345,11 @@
// However, make sure it is not an array type.
bool is_array = false;
if (cp->tag_at(super_class_index).is_klass()) {
@@ -736,7 +739,7 @@
if (_need_verify)
is_array = super_klass->oop_is_array();
} else if (_need_verify) {
-@@ -3148,7 +3333,7 @@
+@@ -3182,7 +3367,7 @@
if (itfs_len == 0) {
local_interfaces = objArrayHandle(THREAD, Universe::the_empty_system_obj_array());
} else {
@@ -745,7 +748,7 @@
}
u2 java_fields_count = 0;
-@@ -3202,7 +3387,9 @@
+@@ -3237,7 +3422,9 @@
protection_domain,
true,
CHECK_(nullHandle));
@@ -756,7 +759,7 @@
KlassHandle kh (THREAD, k);
super_klass = instanceKlassHandle(THREAD, kh());
}
-@@ -3591,6 +3778,19 @@
+@@ -3626,6 +3813,19 @@
rt = REF_NONE;
} else {
rt = super_klass->reference_type();
@@ -776,7 +779,7 @@
}
// We can now create the basic klassOop for this klass
-@@ -3691,7 +3891,7 @@
+@@ -3726,7 +3926,7 @@
fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_counts);
// Fill in has_finalizer, has_vanilla_constructor, and layout_helper
@@ -785,7 +788,7 @@
// reinitialize modifiers, using the InnerClasses attribute
int computed_modifiers = this_klass->compute_modifier_flags(CHECK_(nullHandle));
-@@ -3714,6 +3914,10 @@
+@@ -3749,6 +3949,10 @@
// Allocate mirror and initialize static fields
java_lang_Class::create_mirror(this_klass, CHECK_(nullHandle));
@@ -796,7 +799,7 @@
ClassLoadingService::notify_class_loaded(instanceKlass::cast(this_klass()),
false /* not shared class */);
-@@ -3856,7 +4060,7 @@
+@@ -3891,7 +4095,7 @@
}
@@ -805,7 +808,7 @@
klassOop super = k->super();
// Check if this klass has an empty finalize method (i.e. one with return bytecode only),
-@@ -3864,7 +4068,9 @@
+@@ -3899,7 +4103,9 @@
if (!_has_empty_finalizer) {
if (_has_finalizer ||
(super != NULL && super->klass_part()->has_finalizer())) {
@@ -816,7 +819,7 @@
}
}
-@@ -3880,7 +4086,7 @@
+@@ -3915,7 +4121,7 @@
// Check if this klass supports the java.lang.Cloneable interface
if (SystemDictionary::Cloneable_klass_loaded()) {
@@ -845,7 +848,7 @@
TRAPS);
// Field parsing
-@@ -237,7 +241,7 @@
+@@ -239,7 +243,7 @@
unsigned int nonstatic_oop_map_count,
int* nonstatic_oop_offsets,
unsigned int* nonstatic_oop_counts);
@@ -854,7 +857,7 @@
objArrayHandle compute_transitive_interfaces(instanceKlassHandle super,
objArrayHandle local_ifs, TRAPS);
-@@ -337,7 +341,12 @@
+@@ -345,7 +349,12 @@
public:
// Constructor
@@ -868,7 +871,7 @@
// Parse .class file and return new klassOop. The klassOop is not hooked up
// to the system dictionary or any other structures, so a .class file can
-@@ -349,21 +358,33 @@
+@@ -357,21 +366,33 @@
instanceKlassHandle parseClassFile(Symbol* name,
Handle class_loader,
Handle protection_domain,
@@ -1293,9 +1296,9 @@
+ // (tw) This is now done in parseClassFile in order to support class redefinition
+ // instanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass));
- initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK);
+ initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Cleaner_klass), scan, CHECK);
instanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT);
-@@ -1956,7 +2024,11 @@
+@@ -1957,7 +2025,11 @@
// also holds array classes
assert(check->klass_part()->oop_is_instance(), "noninstance in systemdictionary");
@@ -1310,7 +1313,7 @@
} else {
--- a/src/share/vm/classfile/systemDictionary.hpp
+++ b/src/share/vm/classfile/systemDictionary.hpp
-@@ -269,7 +269,7 @@
+@@ -270,7 +270,7 @@
// Resolve from stream (called by jni_DefineClass and JVM_DefineClass)
static klassOop resolve_from_stream(Symbol* class_name, Handle class_loader,
Handle protection_domain,
@@ -1319,7 +1322,7 @@
// Lookup an already loaded class. If not found NULL is returned.
static klassOop find(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS);
-@@ -310,6 +310,8 @@
+@@ -311,6 +311,8 @@
// Iterate over all klasses in dictionary
// Just the classes from defining class loaders
static void classes_do(void f(klassOop));
@@ -1328,7 +1331,7 @@
// Added for initialize_itable_for_klass to handle exceptions
static void classes_do(void f(klassOop, TRAPS), TRAPS);
// All classes, and their class loaders
-@@ -416,6 +418,8 @@
+@@ -417,6 +419,8 @@
initialize_wk_klasses_until((WKID) limit, start_id, THREAD);
}
@@ -1337,7 +1340,7 @@
public:
#define WK_KLASS_DECLARE(name, symbol, option) \
static klassOop name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); }
-@@ -597,11 +601,11 @@
+@@ -598,11 +602,11 @@
// after waiting, but before reentering SystemDictionary_lock
// to preserve lock order semantics.
static void double_lock_wait(Handle lockObject, TRAPS);
@@ -1351,7 +1354,7 @@
Handle class_loader, TRAPS);
static instanceKlassHandle load_shared_class(instanceKlassHandle ik,
Handle class_loader, TRAPS);
-@@ -616,12 +620,16 @@
+@@ -617,12 +621,16 @@
// Setup link to hierarchy
static void add_to_hierarchy(instanceKlassHandle k, TRAPS);
@@ -1443,7 +1446,7 @@
int num_methods = methods->length();
for (int index = 0; index < num_methods; index++) {
-@@ -2444,7 +2450,10 @@
+@@ -2668,7 +2674,10 @@
VerificationType stack_object_type =
current_frame->pop_stack(ref_class_type, CHECK_VERIFY(this));
if (current_type() != stack_object_type) {
@@ -1457,7 +1460,7 @@
// See the comments in verify_field_instructions() for
--- a/src/share/vm/classfile/verifier.hpp
+++ b/src/share/vm/classfile/verifier.hpp
-@@ -47,7 +47,7 @@
+@@ -48,7 +48,7 @@
* Otherwise, no exception is thrown and the return indicates the
* error.
*/
@@ -1466,7 +1469,7 @@
// Return false if the class is loaded by the bootstrap loader,
// or if defineClass was called requesting skipping verification
-@@ -256,7 +256,10 @@
+@@ -257,7 +257,10 @@
ErrorContext _error_context; // contains information about an error
@@ -1477,7 +1480,7 @@
char* generate_code_data(methodHandle m, u4 code_length, TRAPS);
void verify_exception_handler_table(u4 code_length, char* code_data,
int& min, int& max, TRAPS);
-@@ -329,6 +332,7 @@
+@@ -341,6 +344,7 @@
VerificationType object_type() const;
@@ -1487,7 +1490,7 @@
VerificationType _this_type; // the verification type of the current class
--- a/src/share/vm/classfile/vmSymbols.hpp
+++ b/src/share/vm/classfile/vmSymbols.hpp
-@@ -138,6 +138,10 @@
+@@ -139,6 +139,10 @@
template(tag_annotation_default, "AnnotationDefault") \
template(tag_enclosing_method, "EnclosingMethod") \
template(tag_bootstrap_methods, "BootstrapMethods") \
@@ -1498,7 +1501,7 @@
\
/* exception klasses: at least all exceptions thrown by the VM have entries here */ \
template(java_lang_ArithmeticException, "java/lang/ArithmeticException") \
-@@ -379,6 +383,10 @@
+@@ -380,6 +384,10 @@
template(oop_size_name, "oop_size") \
template(static_oop_field_count_name, "static_oop_field_count") \
\
@@ -1551,7 +1554,7 @@
}
}
}
-@@ -2164,3 +2176,15 @@
+@@ -2165,3 +2177,15 @@
st->cr();
#endif
}
@@ -1855,7 +1858,7 @@
true)) {
ResourceMark rm(THREAD);
Exceptions::fthrow(
-@@ -338,7 +338,7 @@
+@@ -346,7 +346,7 @@
// We'll check for the method name first, as that's most likely
// to be false (so we'll short-circuit out of these tests).
if (sel_method->name() == vmSymbols::clone_name() &&
@@ -1864,11 +1867,20 @@
resolved_klass->oop_is_array()) {
// We need to change "protected" to "public".
assert(flags.is_protected(), "clone not protected?");
-@@ -404,6 +404,156 @@
+@@ -412,48 +412,169 @@
}
}
-+
+-void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
+- Symbol* method_name, Symbol* method_signature,
+- KlassHandle current_klass, bool check_access, TRAPS) {
+
+- // 1. check if klass is not interface
+- if (resolved_klass->is_interface()) {
+- ResourceMark rm(THREAD);
+- char buf[200];
+- jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name());
+- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+void LinkResolver::lookup_method(methodHandle& resolved_method, KlassHandle resolved_klass,
+ Symbol* method_name, Symbol* method_signature, bool is_interface, KlassHandle current_klass, TRAPS) {
+
@@ -1878,7 +1890,7 @@
+ // lookup method in this interface or its super, java.lang.Object
+ lookup_instance_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+
-+ if (resolved_method.is_null()) {
++ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) {
+ // lookup method in all the super-interfaces
+ lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+ }
@@ -1890,7 +1902,7 @@
+ // 2. lookup method in resolved klass and its super klasses
+ lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+
-+ if (resolved_method.is_null()) { // not found in the class hierarchy
++ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy
+ // 3. lookup method in all the interfaces implemented by the resolved klass
+ lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+
@@ -1904,15 +1916,20 @@
+ }
+ }
+ }
-+ }
+ }
+}
-+
+
+- Handle nested_exception;
+void LinkResolver::lookup_correct_field(fieldDescriptor &fd, KlassHandle &sel_klass, KlassHandle resolved_klass, KlassHandle current_klass, Symbol* field_name, Symbol* field_sig, bool is_static) {
-+
+
+- // 2. lookup method in resolved klass and its super klasses
+- lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+ // First attempt unversioned
-+ sel_klass = KlassHandle(Thread::current(), instanceKlass::cast(resolved_klass())->find_field(field_name, field_sig, &fd));
-+
-+
++ sel_klass = KlassHandle(Thread::current(), resolved_klass->find_field(field_name, field_sig, &fd));
+
+- if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy
+- // 3. lookup method in all the interfaces implemented by the resolved klass
+- lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+ if (!current_klass.is_null() && !current_klass->is_newest_version()) {
+
+ // Look for the policy defined in the new version of the class (_not_ in the newest, but only in the newer relative to current klass).
@@ -1924,7 +1941,14 @@
+ assert(redefinition_policy != Klass::StaticCheck, "if the policy is static check, then we can never reach here");
+
+ if (redefinition_policy != Klass::DynamicCheck) {
-+
+
+- if (resolved_method.is_null()) {
+- // JSR 292: see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
+- lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
+- current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
+- if (HAS_PENDING_EXCEPTION) {
+- nested_exception = Handle(THREAD, PENDING_EXCEPTION);
+- CLEAR_PENDING_EXCEPTION;
+ if (redefinition_policy == Klass::AccessOldMembers) {
+ // Forget looked up fields
+ sel_klass = KlassHandle(Thread::current(), (oop)NULL);
@@ -1946,9 +1970,9 @@
+ // assert(sel_klass->new_version() != NULL, "must be old class!");
+ // TRACE_RC2("Resolved a field in the old universe (%s)!", field_name->as_C_string());
+ //}
-+ }
-+ }
-+ }
+ }
+ }
+ }
+}
+
+void LinkResolver::lookup_correct_method(methodHandle& resolved_method, KlassHandle resolved_klass, KlassHandle current_klass,
@@ -2017,71 +2041,44 @@
+ resolved_klass = KlassHandle(Thread::current(), resolved_klass->old_version());
+ }
+}
-+
- void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature,
- KlassHandle current_klass, bool check_access, TRAPS) {
-@@ -416,35 +566,8 @@
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
++void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
++ Symbol* method_name, Symbol* method_signature,
++ KlassHandle current_klass, bool check_access, TRAPS) {
+
+- if (resolved_method.is_null()) {
+- // 4. method lookup failed
++ // 1. check if klass is not interface
++ if (resolved_klass->is_interface()) {
+ ResourceMark rm(THREAD);
+- THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
+- methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
+- method_name,
+- method_signature),
+- nested_exception);
++ char buf[200];
++ jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name());
++ THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
-- Handle nested_exception;
--
-- // 2. lookup method in resolved klass and its super klasses
-- lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
--
-- if (resolved_method.is_null()) { // not found in the class hierarchy
-- // 3. lookup method in all the interfaces implemented by the resolved klass
-- lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
--
-- if (resolved_method.is_null()) {
-- // JSR 292: see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
-- lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
-- current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
-- if (HAS_PENDING_EXCEPTION) {
-- nested_exception = Handle(THREAD, PENDING_EXCEPTION);
-- CLEAR_PENDING_EXCEPTION;
-- }
-- }
--
-- if (resolved_method.is_null()) {
-- // 4. method lookup failed
-- ResourceMark rm(THREAD);
-- THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
-- methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
-- method_name,
-- method_signature),
-- nested_exception);
-- }
-- }
+ // 2. and 3. and 4. lookup method in resolved klass and its super klasses
+ lookup_correct_method(resolved_method, resolved_klass, current_klass, method_name, method_signature, false, CHECK);
-
++
// 5. check if method is concrete
if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) {
-@@ -512,20 +635,7 @@
+ ResourceMark rm(THREAD);
+@@ -520,7 +641,10 @@
}
// lookup method in this interface or its super, java.lang.Object
- lookup_instance_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK);
--
-- if (resolved_method.is_null()) {
-- // lookup method in all the super-interfaces
-- lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
-- if (resolved_method.is_null()) {
-- // no method found
-- ResourceMark rm(THREAD);
-- THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
-- methodOopDesc::name_and_sig_as_C_string(Klass::cast(resolved_klass()),
-- method_name,
-- method_signature));
-- }
-- }
+ lookup_correct_method(resolved_method, resolved_klass, current_klass, method_name, method_signature, true, CHECK);
++
++
++
- if (check_access) {
- HandleMark hm(THREAD);
-@@ -612,9 +722,14 @@
+ if (resolved_method.is_null() && !resolved_klass->oop_is_array()) {
+ // lookup method in all the super-interfaces
+@@ -621,9 +745,14 @@
THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
}
@@ -2089,7 +2086,7 @@
+
// Resolve instance field
fieldDescriptor fd; // find_field initializes fd if found
-- KlassHandle sel_klass(THREAD, instanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
+- KlassHandle sel_klass(THREAD, resolved_klass->find_field(field, sig, &fd));
+
+ KlassHandle sel_klass;
+ lookup_correct_field(fd, sel_klass, resolved_klass, ref_klass, field, sig, is_static);
@@ -2097,7 +2094,7 @@
// check if field exists; i.e., if a klass containing the field def has been selected
if (sel_klass.is_null()){
ResourceMark rm(THREAD);
-@@ -622,7 +737,6 @@
+@@ -631,7 +760,6 @@
}
// check access
@@ -2105,7 +2102,7 @@
check_field_accessability(ref_klass, resolved_klass, sel_klass, fd, CHECK);
// check for errors
-@@ -634,7 +748,7 @@
+@@ -643,7 +771,7 @@
}
// Final fields can only be accessed from its own class.
@@ -2114,7 +2111,7 @@
THROW(vmSymbols::java_lang_IllegalAccessError());
}
-@@ -839,7 +953,7 @@
+@@ -848,7 +976,7 @@
bool check_access, bool check_null_and_abstract, TRAPS) {
methodHandle resolved_method;
linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
@@ -2123,7 +2120,7 @@
}
// throws linktime exceptions
-@@ -869,6 +983,7 @@
+@@ -878,6 +1006,7 @@
KlassHandle resolved_klass,
Handle recv,
KlassHandle recv_klass,
@@ -2131,12 +2128,13 @@
bool check_null_and_abstract,
TRAPS) {
-@@ -917,7 +1032,40 @@
+@@ -926,10 +1055,44 @@
// recv_klass might be an arrayKlassOop but all vtables start at
// the same place. The cast is to avoid virtual call and assertion.
instanceKlass* inst = (instanceKlass*)recv_klass()->klass_part();
+- selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
+
-+ // (tw) The type of the virtual method call and the type of the receiver do not need to
++ // (tw) The type of the virtual method call and the type of the receiver do not need to
+ // have anything in common, as the receiver type could've been hotswapped.
+ // Does not always work (method could be resolved with correct dynamic type and later
+ // be called at the same place with a wrong dynamic type).
@@ -2155,7 +2153,7 @@
+ }
+
+ if (inst->is_subtype_of(method_holder)) {
- selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
++ selected_method = methodHandle(THREAD, inst->method_at_vtable(vtable_index));
+ } else {
+
+ tty->print_cr("Failure:");
@@ -2172,6 +2170,10 @@
}
}
++
+ // check if method exists
+ if (selected_method.is_null()) {
+ ResourceMark rm(THREAD);
--- a/src/share/vm/interpreter/linkResolver.hpp
+++ b/src/share/vm/interpreter/linkResolver.hpp
@@ -110,7 +110,11 @@
@@ -2941,7 +2943,7 @@
verify(VerifyOption_Default, prefix, silent);
--- a/src/share/vm/oops/arrayKlass.cpp
+++ b/src/share/vm/oops/arrayKlass.cpp
-@@ -129,9 +129,9 @@
+@@ -136,9 +136,9 @@
bool arrayKlass::compute_is_subtype_of(klassOop k) {
// An array is a subtype of Serializable, Clonable, and Object
@@ -3296,7 +3298,7 @@
+ // (tw) TODO: Update only field offsets and modify only constant pool entries that
+ // point to changed fields
+ entry_at(i)->initialize_entry(entry_at(i)->constant_pool_index());
-+ } else if(entry_at(i)->is_method_entry()) {
++ } else if(entry_at(i)->is_method_entry() && !entry_at(i)->is_secondary_entry()) {
+ entry_at(i)->adjust_method_entry(NULL, NULL);
}
}
@@ -3332,7 +3334,7 @@
oop_store(&_f1, f1);
}
void release_set_f1(oop f1);
-@@ -167,6 +168,7 @@
+@@ -174,6 +175,7 @@
tos_state_mask = right_n_bits(tos_state_bits),
tos_state_shift = BitsPerInt - tos_state_bits, // see verify_tos_state_shift below
// misc. option bits; can be any bit position in [16..27]
@@ -3340,7 +3342,7 @@
is_vfinal_shift = 20,
is_volatile_shift = 21,
is_final_shift = 22,
-@@ -200,6 +202,8 @@
+@@ -207,6 +209,8 @@
void initialize_entry(int original_index); // initialize primary entry
void initialize_secondary_entry(int main_index); // initialize secondary entry
@@ -3349,7 +3351,7 @@
void set_field( // sets entry to resolved field state
Bytecodes::Code get_code, // the bytecode used for reading the field
Bytecodes::Code put_code, // the bytecode used for writing the field
-@@ -361,10 +365,7 @@
+@@ -368,10 +372,7 @@
// trace_name_printed is set to true if the current call has
// printed the klass name so that other routines in the adjust_*
// group don't print the klass name.
@@ -3361,7 +3363,7 @@
// Debugging & Printing
void print (outputStream* st, int index) const;
-@@ -485,16 +486,9 @@
+@@ -492,16 +493,9 @@
return (base_offset() + ConstantPoolCacheEntry::size_in_bytes() * index);
}
@@ -3919,7 +3921,7 @@
bool Klass::search_secondary_supers(klassOop k) const {
// Put some extra logic here out-of-line, before the search proper.
// This cuts down the size of the inline method.
-@@ -161,6 +181,16 @@
+@@ -170,6 +190,16 @@
kl->set_alloc_size(0);
TRACE_INIT_ID(kl);
@@ -3936,7 +3938,7 @@
kl->set_prototype_header(markOopDesc::prototype());
kl->set_biased_lock_revocation_count(0);
kl->set_last_biased_lock_bulk_revocation_time(0);
-@@ -232,7 +262,7 @@
+@@ -241,7 +271,7 @@
set_super(NULL);
oop_store_without_check((oop*) &_primary_supers[0], (oop) this->as_klassOop());
assert(super_depth() == 0, "Object must already be initialized properly");
@@ -3947,7 +3949,7 @@
set_super(k);
--- a/src/share/vm/oops/klass.hpp
+++ b/src/share/vm/oops/klass.hpp
-@@ -170,6 +170,7 @@
+@@ -171,6 +171,7 @@
void* operator new(size_t ignored, KlassHandle& klass, int size, TRAPS);
};
@@ -3955,7 +3957,7 @@
class Klass : public Klass_vtbl {
friend class VMStructs;
-@@ -222,6 +223,39 @@
+@@ -223,6 +224,39 @@
oop* oop_block_beg() const { return adr_secondary_super_cache(); }
oop* oop_block_end() const { return adr_next_sibling() + 1; }
@@ -3995,7 +3997,7 @@
protected:
//
// The oop block. All oop fields must be declared here and only oop fields
-@@ -241,6 +275,10 @@
+@@ -242,6 +276,10 @@
oop _java_mirror;
// Superclass
klassOop _super;
@@ -4006,7 +4008,7 @@
// First subclass (NULL if none); _subklass->next_sibling() is next one
klassOop _subklass;
// Sibling link (or NULL); links all subklasses of a klass
-@@ -253,6 +291,19 @@
+@@ -254,6 +292,19 @@
jint _modifier_flags; // Processed access flags, for use by Class.getModifiers.
AccessFlags _access_flags; // Access flags. The class/interface distinction is stored here.
@@ -4026,7 +4028,7 @@
#ifndef PRODUCT
int _verify_count; // to avoid redundant verifies
#endif
-@@ -301,6 +352,99 @@
+@@ -302,6 +353,99 @@
klassOop secondary_super_cache() const { return _secondary_super_cache; }
void set_secondary_super_cache(klassOop k) { oop_store_without_check((oop*) &_secondary_super_cache, (oop) k); }
@@ -4126,7 +4128,7 @@
objArrayOop secondary_supers() const { return _secondary_supers; }
void set_secondary_supers(objArrayOop k) { oop_store_without_check((oop*) &_secondary_supers, (oop) k); }
-@@ -361,6 +505,8 @@
+@@ -362,6 +506,8 @@
void set_next_sibling(klassOop s);
oop* adr_super() const { return (oop*)&_super; }
@@ -4135,7 +4137,7 @@
oop* adr_primary_supers() const { return (oop*)&_primary_supers[0]; }
oop* adr_secondary_super_cache() const { return (oop*)&_secondary_super_cache; }
oop* adr_secondary_supers()const { return (oop*)&_secondary_supers; }
-@@ -490,6 +636,7 @@
+@@ -491,6 +637,7 @@
return search_secondary_supers(k);
}
}
@@ -4143,7 +4145,7 @@
bool search_secondary_supers(klassOop k) const;
// Find LCA in class hierarchy
-@@ -816,6 +963,8 @@
+@@ -818,6 +965,8 @@
inline oop klassOopDesc::java_mirror() const { return klass_part()->java_mirror(); }
@@ -4248,7 +4250,7 @@
}
int klassVtable::index_of(methodOop m, int len) const {
-@@ -657,20 +658,6 @@
+@@ -678,20 +679,6 @@
return true;
}
@@ -4269,7 +4271,7 @@
// CDS/RedefineClasses support - clear vtables so they can be reinitialized
void klassVtable::clear_vtable() {
for (int i = 0; i < _length; i++) table()[i].clear();
-@@ -1241,6 +1228,7 @@
+@@ -1262,6 +1249,7 @@
void klassVtable::verify_against(outputStream* st, klassVtable* vt, int index) {
vtableEntry* vte = &vt->table()[index];
@@ -4277,7 +4279,7 @@
if (vte->method()->name() != table()[index].method()->name() ||
vte->method()->signature() != table()[index].method()->signature()) {
fatal("mismatched name/signature of vtable entries");
-@@ -1260,6 +1248,8 @@
+@@ -1281,6 +1269,8 @@
void vtableEntry::verify(klassVtable* vt, outputStream* st) {
NOT_PRODUCT(FlagSetting fs(IgnoreLockingAssertions, true));
@@ -4286,7 +4288,7 @@
assert(method() != NULL, "must have set method");
method()->verify();
// we sub_type, because it could be a miranda method
-@@ -1267,7 +1257,13 @@
+@@ -1288,7 +1278,13 @@
#ifndef PRODUCT
print();
#endif
@@ -4301,7 +4303,7 @@
}
}
-@@ -1275,7 +1271,7 @@
+@@ -1296,7 +1292,7 @@
void vtableEntry::print() {
ResourceMark rm;
@@ -4310,7 +4312,7 @@
if (Verbose) {
tty->print("m %#lx ", (address)method());
}
-@@ -1342,6 +1338,33 @@
+@@ -1363,6 +1359,33 @@
tty->print_cr("%6d bytes total", total);
}
@@ -4657,7 +4659,7 @@
if (TraceClassResolution && k != NULL) {
--- a/src/share/vm/prims/jvm.cpp
+++ b/src/share/vm/prims/jvm.cpp
-@@ -872,7 +872,7 @@
+@@ -932,7 +932,7 @@
Handle protection_domain (THREAD, JNIHandles::resolve(pd));
klassOop k = SystemDictionary::resolve_from_stream(class_name, class_loader,
protection_domain, &st,
@@ -11129,7 +11131,7 @@
// Figure out which new methods match old methods in name and signature,
// which methods have been added, and which are no longer present
void compute_added_deleted_matching_methods();
-@@ -414,103 +100,100 @@
+@@ -414,103 +100,99 @@
// Change jmethodIDs to point to the new methods
void update_jmethod_ids();
@@ -11143,16 +11145,16 @@
- int * emcp_method_count_p);
- void transfer_old_native_function_registrations(instanceKlassHandle the_class);
+ class FindAffectedKlassesClosure : public ObjectClosure {
-+
-+ private:
-+ GrowableArray<instanceKlassHandle> *_original_klasses;
-+ GrowableArray<instanceKlassHandle> *_result;
- // Unevolving classes may point to methods of the_class directly
- // from their constant pool caches, itables, and/or vtables. We
- // use the SystemDictionary::classes_do() facility and this helper
- // to fix up these pointers.
- static void adjust_cpool_cache_and_vtable(klassOop k_oop, oop loader, TRAPS);
++ private:
++ GrowableArray<instanceKlassHandle> *_original_klasses;
++ GrowableArray<instanceKlassHandle> *_result;
++
+ public:
+ FindAffectedKlassesClosure(GrowableArray<instanceKlassHandle> *original_klasses, GrowableArray<instanceKlassHandle> *result);
+
@@ -11256,9 +11258,7 @@
void doit();
void doit_epilogue();
+ void rollback();
-
-- bool allow_nested_vm_operations() const { return true; }
-- jvmtiError check_error() { return _res; }
++
+ jvmtiError check_exception() const;
+ VMOp_Type type() const { return VMOp_RedefineClasses; }
+ bool skip_operation() const { return false; }
@@ -11278,7 +11278,9 @@
+ static Symbol* signature_to_class_name(Symbol* signature);
+
+ void method_forwarding();
-+
+
+- bool allow_nested_vm_operations() const { return true; }
+- jvmtiError check_error() { return _res; }
+ void update_array_classes_to_newest_version(klassOop smallest_dimension);
// Modifiable test must be shared between IsModifiableClass query
@@ -11305,7 +11307,6 @@
};
#endif // SHARE_VM_PRIMS_JVMTIREDEFINECLASSES_HPP
-+
--- a/src/share/vm/prims/methodComparator.cpp
+++ b/src/share/vm/prims/methodComparator.cpp
@@ -65,6 +65,7 @@
@@ -11387,7 +11388,7 @@
KlassHandle klass (THREAD, SystemDictionary::ClassLoader_klass());
--- a/src/share/vm/runtime/arguments.cpp
+++ b/src/share/vm/runtime/arguments.cpp
-@@ -1831,6 +1831,15 @@
+@@ -1874,6 +1874,15 @@
status = false;
}
@@ -11506,7 +11507,7 @@
#ifdef PPC
--- a/src/share/vm/runtime/globals.hpp
+++ b/src/share/vm/runtime/globals.hpp
-@@ -1227,9 +1227,23 @@
+@@ -1229,9 +1229,23 @@
product(bool, StressLdcRewrite, false, \
"Force ldc -> ldc_w rewrite during RedefineClasses") \
\
@@ -11924,7 +11925,7 @@
--- a/src/share/vm/runtime/vmThread.cpp
+++ b/src/share/vm/runtime/vmThread.cpp
-@@ -691,6 +691,10 @@
+@@ -694,6 +694,10 @@
void VMThread::oops_do(OopClosure* f, CodeBlobClosure* cf) {
Thread::oops_do(f, cf);
_vm_queue->oops_do(f);
diff --git a/debian/patches/java7u71-compatibility.patch b/debian/patches/java7u71-compatibility.patch
deleted file mode 100644
index b3fe730..0000000
--- a/debian/patches/java7u71-compatibility.patch
+++ /dev/null
@@ -1,146 +0,0 @@
-Description: Improve protection domain check in forName() (JDK-8015256)
-Origin: backport, http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot/rev/61d1e75e0a58
-Bug-Debian: https://bugs.debian.org/768715
---- a/make/bsd/makefiles/mapfile-vers-debug
-+++ b/make/bsd/makefiles/mapfile-vers-debug
-@@ -82,6 +82,7 @@
- _JVM_EnableCompiler
- _JVM_Exit
- _JVM_FillInStackTrace
-+ _JVM_FindClassFromCaller
- _JVM_FindClassFromClass
- _JVM_FindClassFromClassLoader
- _JVM_FindClassFromBootLoader
---- a/make/bsd/makefiles/mapfile-vers-product
-+++ b/make/bsd/makefiles/mapfile-vers-product
-@@ -82,6 +82,7 @@
- _JVM_EnableCompiler
- _JVM_Exit
- _JVM_FillInStackTrace
-+ _JVM_FindClassFromCaller
- _JVM_FindClassFromClass
- _JVM_FindClassFromClassLoader
- _JVM_FindClassFromBootLoader
---- a/make/linux/makefiles/mapfile-vers-debug
-+++ b/make/linux/makefiles/mapfile-vers-debug
-@@ -84,6 +84,7 @@
- JVM_EnableCompiler;
- JVM_Exit;
- JVM_FillInStackTrace;
-+ JVM_FindClassFromCaller;
- JVM_FindClassFromClass;
- JVM_FindClassFromClassLoader;
- JVM_FindClassFromBootLoader;
---- a/make/linux/makefiles/mapfile-vers-product
-+++ b/make/linux/makefiles/mapfile-vers-product
-@@ -84,6 +84,7 @@
- JVM_EnableCompiler;
- JVM_Exit;
- JVM_FillInStackTrace;
-+ JVM_FindClassFromCaller;
- JVM_FindClassFromClass;
- JVM_FindClassFromClassLoader;
- JVM_FindClassFromBootLoader;
---- a/make/solaris/makefiles/mapfile-vers
-+++ b/make/solaris/makefiles/mapfile-vers
-@@ -84,6 +84,7 @@
- JVM_EnableCompiler;
- JVM_Exit;
- JVM_FillInStackTrace;
-+ JVM_FindClassFromCaller;
- JVM_FindClassFromClass;
- JVM_FindClassFromClassLoader;
- JVM_FindClassFromBootLoader;
---- a/src/share/vm/prims/jvm.cpp
-+++ b/src/share/vm/prims/jvm.cpp
-@@ -746,6 +746,7 @@
- return (jclass) JNIHandles::make_local(env, Klass::cast(k)->java_mirror());
- JVM_END
-
-+// Not used; JVM_FindClassFromCaller replaces this.
- JVM_ENTRY(jclass, JVM_FindClassFromClassLoader(JNIEnv* env, const char* name,
- jboolean init, jobject loader,
- jboolean throwError))
-@@ -772,6 +773,42 @@
- return result;
- JVM_END
-
-+// Find a class with this name in this loader, using the caller's protection domain.
-+JVM_ENTRY(jclass, JVM_FindClassFromCaller(JNIEnv* env, const char* name,
-+ jboolean init, jobject loader,
-+ jclass caller))
-+ JVMWrapper2("JVM_FindClassFromCaller %s throws ClassNotFoundException", name);
-+ // Java libraries should ensure that name is never null...
-+ if (name == NULL || (int)strlen(name) > Symbol::max_length()) {
-+ // It's impossible to create this class; the name cannot fit
-+ // into the constant pool.
-+ THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), name);
-+ }
-+
-+ TempNewSymbol h_name = SymbolTable::new_symbol(name, CHECK_NULL);
-+
-+ oop loader_oop = JNIHandles::resolve(loader);
-+ oop from_class = JNIHandles::resolve(caller);
-+ oop protection_domain = NULL;
-+ // If loader is null, shouldn't call ClassLoader.checkPackageAccess; otherwise get
-+ // NPE. Put it in another way, the bootstrap class loader has all permission and
-+ // thus no checkPackageAccess equivalence in the VM class loader.
-+ // The caller is also passed as NULL by the java code if there is no security
-+ // manager to avoid the performance cost of getting the calling class.
-+ if (from_class != NULL && loader_oop != NULL) {
-+ protection_domain = instanceKlass::cast(java_lang_Class::as_klassOop(from_class))->protection_domain();
-+ }
-+
-+ Handle h_loader(THREAD, loader_oop);
-+ Handle h_prot(THREAD, protection_domain);
-+ jclass result = find_class_from_class_loader(env, h_name, init, h_loader,
-+ h_prot, false, THREAD);
-+
-+ if (TraceClassResolution && result != NULL) {
-+ trace_class_resolution(java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(result)));
-+ }
-+ return result;
-+JVM_END
-
- JVM_ENTRY(jclass, JVM_FindClassFromClass(JNIEnv *env, const char *name,
- jboolean init, jclass from))
-@@ -4098,10 +4135,15 @@
-
- // Shared JNI/JVM entry points //////////////////////////////////////////////////////////////
-
--jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init, Handle loader, Handle protection_domain, jboolean throwError, TRAPS) {
-+jclass find_class_from_class_loader(JNIEnv* env, Symbol* name, jboolean init,
-+ Handle loader, Handle protection_domain,
-+ jboolean throwError, TRAPS) {
- // Security Note:
- // The Java level wrapper will perform the necessary security check allowing
-- // us to pass the NULL as the initiating class loader.
-+ // us to pass the NULL as the initiating class loader. The VM is responsible for
-+ // the checkPackageAccess relative to the initiating class loader via the
-+ // protection_domain. The protection_domain is passed as NULL by the java code
-+ // if there is no security manager in 3-arg Class.forName().
- klassOop klass = SystemDictionary::resolve_or_fail(name, loader, protection_domain, throwError != 0, CHECK_NULL);
-
- KlassHandle klass_handle(THREAD, klass);
---- a/src/share/vm/prims/jvm.h
-+++ b/src/share/vm/prims/jvm.h
-@@ -415,6 +415,19 @@
- JVM_FindClassFromBootLoader(JNIEnv *env, const char *name);
-
- /*
-+ * Find a class from a given class loader. Throws ClassNotFoundException.
-+ * name: name of class
-+ * init: whether initialization is done
-+ * loader: class loader to look up the class. This may not be the same as the caller's
-+ * class loader.
-+ * caller: initiating class. The initiating class may be null when a security
-+ * manager is not installed.
-+ */
-+JNIEXPORT jclass JNICALL
-+JVM_FindClassFromCaller(JNIEnv *env, const char *name, jboolean init,
-+ jobject loader, jclass caller);
-+
-+/*
- * Find a class from a given class.
- */
- JNIEXPORT jclass JNICALL
diff --git a/debian/patches/series b/debian/patches/series
index d140ccc..5a1d70b 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,4 @@
distro-name.patch
-full-jdk7u60-b09.patch
-java7u71-compatibility.patch
+full-jdk7u79-b15.patch
+full-jdk7u60-deopt-cp.patch
+full-jdk7u79-b15-method-handles.patch
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/openjdk-7-jre-dcevm.git
More information about the pkg-java-commits
mailing list