--- old/src/share/vm/interpreter/linkResolver.hpp 2016-06-02 16:54:07.545745504 +0200 +++ new/src/share/vm/interpreter/linkResolver.hpp 2016-06-02 16:54:07.273745512 +0200 @@ -131,27 +131,33 @@ // resolved_klass = specified class (i.e., static receiver class) // current_klass = sending method holder (i.e., class containing the method // containing the call being resolved) +// current_method = sending method (relevant for field resolution) class LinkInfo : public StackObj { - Symbol* _name; // extracted from JVM_CONSTANT_NameAndType - Symbol* _signature; - KlassHandle _resolved_klass; // class that the constant pool entry points to - KlassHandle _current_klass; // class that owns the constant pool - bool _check_access; + Symbol* _name; // extracted from JVM_CONSTANT_NameAndType + Symbol* _signature; + KlassHandle _resolved_klass; // class that the constant pool entry points to + KlassHandle _current_klass; // class that owns the constant pool + methodHandle _current_method; // sending method + bool _check_access; public: - LinkInfo(const constantPoolHandle& pool, int index, TRAPS); + LinkInfo(const constantPoolHandle& pool, int index, methodHandle current_method, TRAPS); // Condensed information from other call sites within the vm. - LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature, - KlassHandle current_klass, bool check_access = true) : + LinkInfo(KlassHandle resolved_klass, + Symbol* name, Symbol* signature, // field or method signature + KlassHandle current_klass, methodHandle current_method, + bool check_access = true) : _resolved_klass(resolved_klass), - _name(name), _signature(signature), _current_klass(current_klass), + _name(name), _signature(signature), + _current_klass(current_klass), _current_method(current_method), _check_access(check_access) {} // accessors - Symbol* name() const { return _name; } - Symbol* signature() const { return _signature; } - KlassHandle resolved_klass() const { return _resolved_klass; } - KlassHandle current_klass() const { return _current_klass; } - bool check_access() const { return _check_access; } + Symbol* name() const { return _name; } + Symbol* signature() const { return _signature; } + KlassHandle resolved_klass() const { return _resolved_klass; } + KlassHandle current_klass() const { return _current_klass; } + methodHandle current_method() const { return _current_method; } + bool check_access() const { return _check_access; } char* method_string() const; void print() PRODUCT_RETURN; @@ -251,7 +257,9 @@ static void resolve_field_access(fieldDescriptor& result, const constantPoolHandle& pool, - int index, Bytecodes::Code byte, TRAPS); + int index, + const methodHandle& method, + Bytecodes::Code byte, TRAPS); static void resolve_field(fieldDescriptor& result, const LinkInfo& link_info, Bytecodes::Code access_kind, bool initialize_class, TRAPS);