[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