src/share/vm/interpreter/linkResolver.hpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/interpreter/linkResolver.hpp Fri Jun 10 17:18:54 2016
--- new/src/share/vm/interpreter/linkResolver.hpp Fri Jun 10 17:18:53 2016
*** 129,172 ****
--- 129,184 ----
// Condensed information from constant pool to use to resolve the method or field.
// 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
+ methodHandle _current_method; // sending method
bool _check_access;
constantTag _tag;
+
public:
enum AccessCheck {
needs_access_check,
skip_access_check
};
+ LinkInfo(const constantPoolHandle& pool, int index, methodHandle current_method, TRAPS);
LinkInfo(const constantPoolHandle& pool, int index, TRAPS);
// Condensed information from other call sites within the vm.
LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature, KlassHandle current_klass,
AccessCheck check_access = needs_access_check,
constantTag tag = JVM_CONSTANT_Invalid) :
_resolved_klass(resolved_klass),
! _name(name), _signature(signature), _current_klass(current_klass), _current_method(NULL),
+ _check_access(check_access == needs_access_check), _tag(tag) {}
+
+ LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature, methodHandle current_method,
+ AccessCheck check_access = needs_access_check,
+ constantTag tag = JVM_CONSTANT_Invalid) :
+ _resolved_klass(resolved_klass),
+ _name(name), _signature(signature), _current_klass(current_method->method_holder()), _current_method(current_method),
_check_access(check_access == needs_access_check), _tag(tag) {}
// Case where we just find the method and don't check access against the current class
LinkInfo(KlassHandle resolved_klass, Symbol*name, Symbol* signature) :
_resolved_klass(resolved_klass),
! _name(name), _signature(signature), _current_klass(NULL), _current_method(NULL),
_check_access(false), _tag(JVM_CONSTANT_Invalid) {}
// 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; }
+ methodHandle current_method() const { return _current_method; }
constantTag tag() const { return _tag; }
bool check_access() const { return _check_access; }
char* method_string() const;
void print() PRODUCT_RETURN;
*** 264,274 ****
--- 276,288 ----
const constantPoolHandle& pool,
int index, TRAPS);
static void resolve_field_access(fieldDescriptor& result,
const constantPoolHandle& pool,
- int index, Bytecodes::Code byte, TRAPS);
+ 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);
static void resolve_static_call (CallInfo& result,
src/share/vm/interpreter/linkResolver.hpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File