< prev index next >
src/share/vm/oops/constantPool.hpp
Print this page
@@ -60,10 +60,26 @@
Symbol* get_symbol() {
return (Symbol*)(_ptr & ~_pseudo_bit);
}
};
+class CPKlassSlot VALUE_OBJ_CLASS_SPEC {
+ int _name_index;
+ int _resolved_klass_index;
+public:
+ CPKlassSlot(int n, int rk) {
+ _name_index = n;
+ _resolved_klass_index = rk;
+ }
+ int name_index() const {
+ return _name_index;
+ }
+ int resolved_klass_index() const {
+ return _resolved_klass_index;
+ }
+};
+
class KlassSizeStats;
class ConstantPool : public Metadata {
friend class VMStructs;
friend class JVMCIVMStructs;
@@ -79,11 +95,11 @@
Array<Klass*>* _resolved_klasses;
enum {
_has_preresolution = 1, // Flags
_on_stack = 2,
- _is_shared_quick = 4
+ _is_shared = 4
};
enum {
_invalid_resolved_klass_index = 0xffff
};
@@ -160,11 +176,11 @@
Array<u1>* tags() const { return _tags; }
Array<u2>* operands() const { return _operands; }
bool has_preresolution() const { return (_flags & _has_preresolution) != 0; }
void set_has_preresolution() {
- assert(!is_shared_quick(), "should never be called on shared ConstantPools");
+ assert(!is_shared(), "should never be called on shared ConstantPools");
_flags |= _has_preresolution;
}
// Redefine classes support. If a method refering to this constant pool
// is on the executing stack, or as a handle in vm code, this constant pool
@@ -172,12 +188,11 @@
// class.
bool on_stack() const { return (_flags &_on_stack) != 0; }
void set_on_stack(const bool value);
// Faster than MetaspaceObj::is_shared() - used by set_on_stack()
- bool is_shared_quick() const { return (_flags & _is_shared_quick) != 0; }
- void set_is_shared_quick() { _flags |= _is_shared_quick; }
+ bool is_shared() const { return (_flags & _is_shared) != 0; }
// Klass holding pool
InstanceKlass* pool_holder() const { return _pool_holder; }
void set_pool_holder(InstanceKlass* k) { _pool_holder = k; }
InstanceKlass** pool_holder_addr() { return &_pool_holder; }
@@ -352,23 +367,32 @@
Klass* klass_at_ignore_error(int which, TRAPS) {
constantPoolHandle h_this(THREAD, this);
return klass_at_impl(h_this, which, false, THREAD);
}
+ CPKlassSlot klass_slot_at(int which) const {
+ assert(tag_at(which).is_unresolved_klass() || tag_at(which).is_klass(),
+ "Corrupted constant pool");
+ int value = *int_at_addr(which);
+ int name_index = extract_high_short_from_int(value);
+ int resolved_klass_index = extract_low_short_from_int(value);
+ return CPKlassSlot(name_index, resolved_klass_index);
+ }
+
Symbol* klass_name_at(int which) const; // Returns the name, w/o resolving.
- int klass_name_index_at(int which) const;
+ int klass_name_index_at(int which) const {
+ return klass_slot_at(which).name_index();
+ }
Klass* resolved_klass_at(int which) const { // Used by Compiler
guarantee(tag_at(which).is_klass(), "Corrupted constant pool");
// Must do an acquire here in case another thread resolved the klass
// behind our back, lest we later load stale values thru the oop.
- int value = *int_at_addr(which);
- int resolved_klass_index = extract_low_short_from_int(value);
- int name_index = extract_high_short_from_int(value);
- assert(tag_at(name_index).is_symbol(), "sanity");
+ CPKlassSlot kslot = klass_slot_at(which);
+ assert(tag_at(kslot.name_index()).is_symbol(), "sanity");
- Klass** adr = resolved_klasses()->adr_at(resolved_klass_index);
+ Klass** adr = resolved_klasses()->adr_at(kslot.resolved_klass_index());
return (Klass*)OrderAccess::load_ptr_acquire(adr);
}
// RedefineClasses() API support:
Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
< prev index next >