8021948: Change InstanceKlass::_source_file_name and _generic_signature from Symbol* to constant pool indexes.
Summary: Change InstanceKlass::_source_file_name and _generic_signature to u2 fields.
Reviewed-by: coleenp, iklam
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java Fri Aug 16 10:06:58 2013 -0700
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java Mon Aug 19 14:59:54 2013 -0400
@@ -75,19 +75,19 @@
javaFieldsCount = new CIntField(type.getCIntegerField("_java_fields_count"), 0);
constants = new MetadataField(type.getAddressField("_constants"), 0);
classLoaderData = type.getAddressField("_class_loader_data");
- sourceFileName = type.getAddressField("_source_file_name");
sourceDebugExtension = type.getAddressField("_source_debug_extension");
innerClasses = type.getAddressField("_inner_classes");
+ sourceFileNameIndex = new CIntField(type.getCIntegerField("_source_file_name_index"), 0);
nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), 0);
staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), 0);
- staticOopFieldCount = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
+ staticOopFieldCount = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), 0);
initState = new CIntField(type.getCIntegerField("_init_state"), 0);
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
itableLen = new CIntField(type.getCIntegerField("_itable_len"), 0);
breakpoints = type.getAddressField("_breakpoints");
- genericSignature = type.getAddressField("_generic_signature");
+ genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"), 0);
majorVersion = new CIntField(type.getCIntegerField("_major_version"), 0);
minorVersion = new CIntField(type.getCIntegerField("_minor_version"), 0);
headerSize = Oop.alignObjectOffset(type.getSize());
@@ -134,9 +134,9 @@
private static CIntField javaFieldsCount;
private static MetadataField constants;
private static AddressField classLoaderData;
- private static AddressField sourceFileName;
private static AddressField sourceDebugExtension;
private static AddressField innerClasses;
+ private static CIntField sourceFileNameIndex;
private static CIntField nonstaticFieldSize;
private static CIntField staticFieldSize;
private static CIntField staticOopFieldCount;
@@ -146,7 +146,7 @@
private static CIntField vtableLen;
private static CIntField itableLen;
private static AddressField breakpoints;
- private static AddressField genericSignature;
+ private static CIntField genericSignatureIndex;
private static CIntField majorVersion;
private static CIntField minorVersion;
@@ -346,7 +346,7 @@
public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
public ClassLoaderData getClassLoaderData() { return ClassLoaderData.instantiateWrapperFor(classLoaderData.getValue(getAddress())); }
public Oop getClassLoader() { return getClassLoaderData().getClassLoader(); }
- public Symbol getSourceFileName() { return getSymbol(sourceFileName); }
+ public Symbol getSourceFileName() { return getConstants().getSymbolAt(sourceFileNameIndex.getValue(this)); }
public String getSourceDebugExtension(){ return CStringUtilities.getString(sourceDebugExtension.getValue(getAddress())); }
public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); }
public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); }
@@ -354,7 +354,7 @@
public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
public long getVtableLen() { return vtableLen.getValue(this); }
public long getItableLen() { return itableLen.getValue(this); }
- public Symbol getGenericSignature() { return getSymbol(genericSignature); }
+ public Symbol getGenericSignature() { return getConstants().getSymbolAt(genericSignatureIndex.getValue(this)); }
public long majorVersion() { return majorVersion.getValue(this); }
public long minorVersion() { return minorVersion.getValue(this); }
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Fri Aug 16 10:06:58 2013 -0700
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Mon Aug 19 14:59:54 2013 -0400
@@ -2590,7 +2590,7 @@
valid_symbol_at(sourcefile_index),
"Invalid SourceFile attribute at constant pool index %u in class file %s",
sourcefile_index, CHECK);
- set_class_sourcefile(_cp->symbol_at(sourcefile_index));
+ set_class_sourcefile_index(sourcefile_index);
}
@@ -2728,7 +2728,7 @@
valid_symbol_at(signature_index),
"Invalid constant pool index %u in Signature attribute in class file %s",
signature_index, CHECK);
- set_class_generic_signature(_cp->symbol_at(signature_index));
+ set_class_generic_signature_index(signature_index);
}
void ClassFileParser::parse_classfile_bootstrap_methods_attribute(u4 attribute_byte_length, TRAPS) {
@@ -2975,13 +2975,11 @@
void ClassFileParser::apply_parsed_class_attributes(instanceKlassHandle k) {
if (_synthetic_flag)
k->set_is_synthetic();
- if (_sourcefile != NULL) {
- _sourcefile->increment_refcount();
- k->set_source_file_name(_sourcefile);
+ if (_sourcefile_index != 0) {
+ k->set_source_file_name_index(_sourcefile_index);
}
- if (_generic_signature != NULL) {
- _generic_signature->increment_refcount();
- k->set_generic_signature(_generic_signature);
+ if (_generic_signature_index != 0) {
+ k->set_generic_signature_index(_generic_signature_index);
}
if (_sde_buffer != NULL) {
k->set_source_debug_extension(_sde_buffer, _sde_length);
--- a/hotspot/src/share/vm/classfile/classFileParser.hpp Fri Aug 16 10:06:58 2013 -0700
+++ b/hotspot/src/share/vm/classfile/classFileParser.hpp Mon Aug 19 14:59:54 2013 -0400
@@ -62,8 +62,8 @@
bool _synthetic_flag;
int _sde_length;
char* _sde_buffer;
- Symbol* _sourcefile;
- Symbol* _generic_signature;
+ u2 _sourcefile_index;
+ u2 _generic_signature_index;
// Metadata created before the instance klass is created. Must be deallocated
// if not transferred to the InstanceKlass upon successful class loading
@@ -81,16 +81,16 @@
Array<AnnotationArray*>* _fields_type_annotations;
InstanceKlass* _klass; // InstanceKlass once created.
- void set_class_synthetic_flag(bool x) { _synthetic_flag = x; }
- void set_class_sourcefile(Symbol* x) { _sourcefile = x; }
- void set_class_generic_signature(Symbol* x) { _generic_signature = x; }
- void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
+ void set_class_synthetic_flag(bool x) { _synthetic_flag = x; }
+ void set_class_sourcefile_index(u2 x) { _sourcefile_index = x; }
+ void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; }
+ void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; }
void init_parsed_class_attributes(ClassLoaderData* loader_data) {
_loader_data = loader_data;
_synthetic_flag = false;
- _sourcefile = NULL;
- _generic_signature = NULL;
+ _sourcefile_index = 0;
+ _generic_signature_index = 0;
_sde_buffer = NULL;
_sde_length = 0;
// initialize the other flags too:
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Fri Aug 16 10:06:58 2013 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Mon Aug 19 14:59:54 2013 -0400
@@ -269,7 +269,7 @@
set_fields(NULL, 0);
set_constants(NULL);
set_class_loader_data(NULL);
- set_source_file_name(NULL);
+ set_source_file_name_index(0);
set_source_debug_extension(NULL, 0);
set_array_name(NULL);
set_inner_classes(NULL);
@@ -284,7 +284,7 @@
set_osr_nmethods_head(NULL);
set_breakpoints(NULL);
init_previous_versions();
- set_generic_signature(NULL);
+ set_generic_signature_index(0);
release_set_methods_jmethod_ids(NULL);
release_set_methods_cached_itable_indices(NULL);
set_annotations(NULL);
@@ -2368,18 +2368,12 @@
// unreference array name derived from this class name (arrays of an unloaded
// class can't be referenced anymore).
if (_array_name != NULL) _array_name->decrement_refcount();
- if (_source_file_name != NULL) _source_file_name->decrement_refcount();
if (_source_debug_extension != NULL) FREE_C_HEAP_ARRAY(char, _source_debug_extension, mtClass);
assert(_total_instanceKlass_count >= 1, "Sanity check");
Atomic::dec(&_total_instanceKlass_count);
}
-void InstanceKlass::set_source_file_name(Symbol* n) {
- _source_file_name = n;
- if (_source_file_name != NULL) _source_file_name->increment_refcount();
-}
-
void InstanceKlass::set_source_debug_extension(char* array, int length) {
if (array == NULL) {
_source_debug_extension = NULL;
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Fri Aug 16 10:06:58 2013 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Mon Aug 19 14:59:54 2013 -0400
@@ -201,14 +201,10 @@
// number_of_inner_classes * 4 + enclosing_method_attribute_size.
Array<jushort>* _inner_classes;
- // Name of source file containing this klass, NULL if not specified.
- Symbol* _source_file_name;
// the source debug extension for this klass, NULL if not specified.
// Specified as UTF-8 string without terminating zero byte in the classfile,
// it is stored in the instanceklass as a NULL-terminated UTF-8 string
char* _source_debug_extension;
- // Generic signature, or null if none.
- Symbol* _generic_signature;
// Array name derived from this class which needs unreferencing
// if this class is unloaded.
Symbol* _array_name;
@@ -217,6 +213,12 @@
// (including inherited fields but after header_size()).
int _nonstatic_field_size;
int _static_field_size; // number words used by static fields (oop and non-oop) in this klass
+ // Constant pool index to the utf8 entry of the Generic signature,
+ // or 0 if none.
+ u2 _generic_signature_index;
+ // Constant pool index to the utf8 entry for the name of source file
+ // containing this klass, 0 if not specified.
+ u2 _source_file_name_index;
u2 _static_oop_field_count;// number of static oop fields in this klass
u2 _java_fields_count; // The number of declared Java fields
int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks
@@ -570,8 +572,16 @@
}
// source file name
- Symbol* source_file_name() const { return _source_file_name; }
- void set_source_file_name(Symbol* n);
+ Symbol* source_file_name() const {
+ return (_source_file_name_index == 0) ?
+ (Symbol*)NULL : _constants->symbol_at(_source_file_name_index);
+ }
+ u2 source_file_name_index() const {
+ return _source_file_name_index;
+ }
+ void set_source_file_name_index(u2 sourcefile_index) {
+ _source_file_name_index = sourcefile_index;
+ }
// minor and major version numbers of class file
u2 minor_version() const { return _minor_version; }
@@ -648,8 +658,16 @@
void set_initial_method_idnum(u2 value) { _idnum_allocated_count = value; }
// generics support
- Symbol* generic_signature() const { return _generic_signature; }
- void set_generic_signature(Symbol* sig) { _generic_signature = sig; }
+ Symbol* generic_signature() const {
+ return (_generic_signature_index == 0) ?
+ (Symbol*)NULL : _constants->symbol_at(_generic_signature_index);
+ }
+ u2 generic_signature_index() const {
+ return _generic_signature_index;
+ }
+ void set_generic_signature_index(u2 sig_index) {
+ _generic_signature_index = sig_index;
+ }
u2 enclosing_method_data(int offset);
u2 enclosing_method_class_index() {
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Fri Aug 16 10:06:58 2013 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Mon Aug 19 14:59:54 2013 -0400
@@ -1554,6 +1554,20 @@
return false;
}
+ // rewrite sourc file name index:
+ u2 source_file_name_idx = scratch_class->source_file_name_index();
+ if (source_file_name_idx != 0) {
+ u2 new_source_file_name_idx = find_new_index(source_file_name_idx);
+ scratch_class->set_source_file_name_index(new_source_file_name_idx);
+ }
+
+ // rewrite class generic signature index:
+ u2 generic_signature_index = scratch_class->generic_signature_index();
+ if (generic_signature_index != 0) {
+ u2 new_generic_signature_index = find_new_index(generic_signature_index);
+ scratch_class->set_generic_signature_index(new_generic_signature_index);
+ }
+
return true;
} // end rewrite_cp_refs()
@@ -3370,7 +3384,8 @@
// Leave arrays of jmethodIDs and itable index cache unchanged
// Copy the "source file name" attribute from new class version
- the_class->set_source_file_name(scratch_class->source_file_name());
+ the_class->set_source_file_name_index(
+ scratch_class->source_file_name_index());
// Copy the "source debug extension" attribute from new class version
the_class->set_source_debug_extension(
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Fri Aug 16 10:06:58 2013 -0700
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Aug 19 14:59:54 2013 -0400
@@ -294,7 +294,7 @@
nonstatic_field(InstanceKlass, _java_fields_count, u2) \
nonstatic_field(InstanceKlass, _constants, ConstantPool*) \
nonstatic_field(InstanceKlass, _class_loader_data, ClassLoaderData*) \
- nonstatic_field(InstanceKlass, _source_file_name, Symbol*) \
+ nonstatic_field(InstanceKlass, _source_file_name_index, u2) \
nonstatic_field(InstanceKlass, _source_debug_extension, char*) \
nonstatic_field(InstanceKlass, _inner_classes, Array<jushort>*) \
nonstatic_field(InstanceKlass, _nonstatic_field_size, int) \
@@ -313,7 +313,7 @@
nonstatic_field(InstanceKlass, _jni_ids, JNIid*) \
nonstatic_field(InstanceKlass, _osr_nmethods_head, nmethod*) \
nonstatic_field(InstanceKlass, _breakpoints, BreakpointInfo*) \
- nonstatic_field(InstanceKlass, _generic_signature, Symbol*) \
+ nonstatic_field(InstanceKlass, _generic_signature_index, u2) \
nonstatic_field(InstanceKlass, _methods_jmethod_ids, jmethodID*) \
nonstatic_field(InstanceKlass, _methods_cached_itable_indices, int*) \
volatile_nonstatic_field(InstanceKlass, _idnum_allocated_count, u2) \