提交 6f7ef75c 编写于 作者: C cjplummer

Merge

...@@ -48,6 +48,7 @@ public class ConstMethod extends VMObject { ...@@ -48,6 +48,7 @@ public class ConstMethod extends VMObject {
private static int HAS_CHECKED_EXCEPTIONS; private static int HAS_CHECKED_EXCEPTIONS;
private static int HAS_LOCALVARIABLE_TABLE; private static int HAS_LOCALVARIABLE_TABLE;
private static int HAS_EXCEPTION_TABLE; private static int HAS_EXCEPTION_TABLE;
private static int HAS_GENERIC_SIGNATURE;
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
Type type = db.lookupType("ConstMethod"); Type type = db.lookupType("ConstMethod");
...@@ -60,13 +61,14 @@ public class ConstMethod extends VMObject { ...@@ -60,13 +61,14 @@ public class ConstMethod extends VMObject {
HAS_CHECKED_EXCEPTIONS = db.lookupIntConstant("ConstMethod::_has_checked_exceptions").intValue(); HAS_CHECKED_EXCEPTIONS = db.lookupIntConstant("ConstMethod::_has_checked_exceptions").intValue();
HAS_LOCALVARIABLE_TABLE = db.lookupIntConstant("ConstMethod::_has_localvariable_table").intValue(); HAS_LOCALVARIABLE_TABLE = db.lookupIntConstant("ConstMethod::_has_localvariable_table").intValue();
HAS_EXCEPTION_TABLE = db.lookupIntConstant("ConstMethod::_has_exception_table").intValue(); HAS_EXCEPTION_TABLE = db.lookupIntConstant("ConstMethod::_has_exception_table").intValue();
HAS_GENERIC_SIGNATURE = db.lookupIntConstant("ConstMethod::_has_generic_signature").intValue();
// Size of Java bytecodes allocated immediately after ConstMethod*. // Size of Java bytecodes allocated immediately after ConstMethod*.
codeSize = new CIntField(type.getCIntegerField("_code_size"), 0); codeSize = new CIntField(type.getCIntegerField("_code_size"), 0);
nameIndex = new CIntField(type.getCIntegerField("_name_index"), 0); nameIndex = new CIntField(type.getCIntegerField("_name_index"), 0);
signatureIndex = new CIntField(type.getCIntegerField("_signature_index"), 0); signatureIndex = new CIntField(type.getCIntegerField("_signature_index"), 0);
genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"),0);
idnum = new CIntField(type.getCIntegerField("_method_idnum"), 0); idnum = new CIntField(type.getCIntegerField("_method_idnum"), 0);
maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0);
// start of byte code // start of byte code
bytecodeOffset = type.getSize(); bytecodeOffset = type.getSize();
...@@ -92,8 +94,8 @@ public class ConstMethod extends VMObject { ...@@ -92,8 +94,8 @@ public class ConstMethod extends VMObject {
private static CIntField codeSize; private static CIntField codeSize;
private static CIntField nameIndex; private static CIntField nameIndex;
private static CIntField signatureIndex; private static CIntField signatureIndex;
private static CIntField genericSignatureIndex;
private static CIntField idnum; private static CIntField idnum;
private static CIntField maxStack;
// start of bytecode // start of bytecode
private static long bytecodeOffset; private static long bytecodeOffset;
...@@ -134,13 +136,21 @@ public class ConstMethod extends VMObject { ...@@ -134,13 +136,21 @@ public class ConstMethod extends VMObject {
} }
public long getGenericSignatureIndex() { public long getGenericSignatureIndex() {
return genericSignatureIndex.getValue(this); if (hasGenericSignature()) {
return getAddress().getCIntegerAt(offsetOfGenericSignatureIndex(), 2, true);
} else {
return 0;
}
} }
public long getIdNum() { public long getIdNum() {
return idnum.getValue(this); return idnum.getValue(this);
} }
public long getMaxStack() {
return maxStack.getValue(this);
}
public Symbol getName() { public Symbol getName() {
return getMethod().getName(); return getMethod().getName();
} }
...@@ -235,8 +245,8 @@ public class ConstMethod extends VMObject { ...@@ -235,8 +245,8 @@ public class ConstMethod extends VMObject {
visitor.doCInt(codeSize, true); visitor.doCInt(codeSize, true);
visitor.doCInt(nameIndex, true); visitor.doCInt(nameIndex, true);
visitor.doCInt(signatureIndex, true); visitor.doCInt(signatureIndex, true);
visitor.doCInt(genericSignatureIndex, true);
visitor.doCInt(codeSize, true); visitor.doCInt(codeSize, true);
visitor.doCInt(maxStack, true);
} }
// Accessors // Accessors
...@@ -353,6 +363,10 @@ public class ConstMethod extends VMObject { ...@@ -353,6 +363,10 @@ public class ConstMethod extends VMObject {
return ret; return ret;
} }
private boolean hasGenericSignature() {
return (getFlags() & HAS_GENERIC_SIGNATURE) != 0;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Internals only below this point // Internals only below this point
...@@ -377,10 +391,16 @@ public class ConstMethod extends VMObject { ...@@ -377,10 +391,16 @@ public class ConstMethod extends VMObject {
return getSize() * VM.getVM().getObjectHeap().getOopSize() - 2; return getSize() * VM.getVM().getObjectHeap().getOopSize() - 2;
} }
private long offsetOfCheckedExceptionsLength() { // Offset of the generic signature index
private long offsetOfGenericSignatureIndex() {
return offsetOfLastU2Element(); return offsetOfLastU2Element();
} }
private long offsetOfCheckedExceptionsLength() {
return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
offsetOfLastU2Element();
}
private int getCheckedExceptionsLength() { private int getCheckedExceptionsLength() {
if (hasCheckedExceptions()) { if (hasCheckedExceptions()) {
return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true); return (int) getAddress().getCIntegerAt(offsetOfCheckedExceptionsLength(), 2, true);
...@@ -431,7 +451,8 @@ public class ConstMethod extends VMObject { ...@@ -431,7 +451,8 @@ public class ConstMethod extends VMObject {
} else if (hasCheckedExceptions()) { } else if (hasCheckedExceptions()) {
return offsetOfCheckedExceptions() - 2; return offsetOfCheckedExceptions() - 2;
} else { } else {
return offsetOfLastU2Element(); return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
offsetOfLastU2Element();
} }
} }
...@@ -460,7 +481,8 @@ public class ConstMethod extends VMObject { ...@@ -460,7 +481,8 @@ public class ConstMethod extends VMObject {
if (hasCheckedExceptions()) { if (hasCheckedExceptions()) {
return offsetOfCheckedExceptions() - 2; return offsetOfCheckedExceptions() - 2;
} else { } else {
return offsetOfLastU2Element(); return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
offsetOfLastU2Element();
} }
} }
......
...@@ -50,7 +50,6 @@ public class Method extends Metadata { ...@@ -50,7 +50,6 @@ public class Method extends Metadata {
constMethod = type.getAddressField("_constMethod"); constMethod = type.getAddressField("_constMethod");
methodData = type.getAddressField("_method_data"); methodData = type.getAddressField("_method_data");
methodSize = new CIntField(type.getCIntegerField("_method_size"), 0); methodSize = new CIntField(type.getCIntegerField("_method_size"), 0);
maxStack = new CIntField(type.getCIntegerField("_max_stack"), 0);
maxLocals = new CIntField(type.getCIntegerField("_max_locals"), 0); maxLocals = new CIntField(type.getCIntegerField("_max_locals"), 0);
sizeOfParameters = new CIntField(type.getCIntegerField("_size_of_parameters"), 0); sizeOfParameters = new CIntField(type.getCIntegerField("_size_of_parameters"), 0);
accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0); accessFlags = new CIntField(type.getCIntegerField("_access_flags"), 0);
...@@ -84,7 +83,6 @@ public class Method extends Metadata { ...@@ -84,7 +83,6 @@ public class Method extends Metadata {
private static AddressField constMethod; private static AddressField constMethod;
private static AddressField methodData; private static AddressField methodData;
private static CIntField methodSize; private static CIntField methodSize;
private static CIntField maxStack;
private static CIntField maxLocals; private static CIntField maxLocals;
private static CIntField sizeOfParameters; private static CIntField sizeOfParameters;
private static CIntField accessFlags; private static CIntField accessFlags;
...@@ -135,7 +133,7 @@ public class Method extends Metadata { ...@@ -135,7 +133,7 @@ public class Method extends Metadata {
} }
/** WARNING: this is in words, not useful in this system; use getObjectSize() instead */ /** WARNING: this is in words, not useful in this system; use getObjectSize() instead */
public long getMethodSize() { return methodSize.getValue(this); } public long getMethodSize() { return methodSize.getValue(this); }
public long getMaxStack() { return maxStack.getValue(this); } public long getMaxStack() { return getConstMethod().getMaxStack(); }
public long getMaxLocals() { return maxLocals.getValue(this); } public long getMaxLocals() { return maxLocals.getValue(this); }
public long getSizeOfParameters() { return sizeOfParameters.getValue(this); } public long getSizeOfParameters() { return sizeOfParameters.getValue(this); }
public long getNameIndex() { return getConstMethod().getNameIndex(); } public long getNameIndex() { return getConstMethod().getNameIndex(); }
...@@ -284,7 +282,6 @@ public class Method extends Metadata { ...@@ -284,7 +282,6 @@ public class Method extends Metadata {
public void iterateFields(MetadataVisitor visitor) { public void iterateFields(MetadataVisitor visitor) {
visitor.doCInt(methodSize, true); visitor.doCInt(methodSize, true);
visitor.doCInt(maxStack, true);
visitor.doCInt(maxLocals, true); visitor.doCInt(maxLocals, true);
visitor.doCInt(sizeOfParameters, true); visitor.doCInt(sizeOfParameters, true);
visitor.doCInt(accessFlags, true); visitor.doCInt(accessFlags, true);
......
...@@ -1048,7 +1048,6 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register ...@@ -1048,7 +1048,6 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
const Address constMethod (G5_method, 0, in_bytes(Method::const_offset())); const Address constMethod (G5_method, 0, in_bytes(Method::const_offset()));
const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset())); const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset()));
const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset())); const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset()));
const Address max_stack (G5_method, 0, in_bytes(Method::max_stack_offset()));
const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset())); const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset()));
// slop factor is two extra slots on the expression stack so that // slop factor is two extra slots on the expression stack so that
...@@ -1070,7 +1069,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register ...@@ -1070,7 +1069,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
__ lduh( size_of_parameters, Gtmp ); __ lduh( size_of_parameters, Gtmp );
__ calc_mem_param_words(Gtmp, Gtmp); // space for native call parameters passed on the stack in words __ calc_mem_param_words(Gtmp, Gtmp); // space for native call parameters passed on the stack in words
} else { } else {
__ lduh(max_stack, Gtmp); // Full size expression stack // Full size expression stack
__ ld_ptr(constMethod, Gtmp);
__ lduh(Gtmp, in_bytes(ConstMethod::max_stack_offset()), Gtmp);
} }
__ add(Gtmp, fixed_size, Gtmp); // plus the fixed portion __ add(Gtmp, fixed_size, Gtmp); // plus the fixed portion
...@@ -1206,7 +1207,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register ...@@ -1206,7 +1207,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
__ sub(O2, wordSize, O2); // prepush __ sub(O2, wordSize, O2); // prepush
__ st_ptr(O2, XXX_STATE(_stack)); // PREPUSH __ st_ptr(O2, XXX_STATE(_stack)); // PREPUSH
__ lduh(max_stack, O3); // Full size expression stack // Full size expression stack
__ ld_ptr(constMethod, O3);
__ lduh(O3, in_bytes(ConstMethod::max_stack_offset()), O3);
guarantee(!EnableInvokeDynamic, "no support yet for java.lang.invoke.MethodHandle"); //6815692 guarantee(!EnableInvokeDynamic, "no support yet for java.lang.invoke.MethodHandle"); //6815692
//6815692//if (EnableInvokeDynamic) //6815692//if (EnableInvokeDynamic)
//6815692// __ inc(O3, Method::extra_stack_entries()); //6815692// __ inc(O3, Method::extra_stack_entries());
...@@ -1539,7 +1542,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) { ...@@ -1539,7 +1542,6 @@ address InterpreterGenerator::generate_normal_entry(bool synchronized) {
const Address constMethod (G5_method, 0, in_bytes(Method::const_offset())); const Address constMethod (G5_method, 0, in_bytes(Method::const_offset()));
const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset())); const Address access_flags (G5_method, 0, in_bytes(Method::access_flags_offset()));
const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset())); const Address size_of_parameters(G5_method, 0, in_bytes(Method::size_of_parameters_offset()));
const Address max_stack (G5_method, 0, in_bytes(Method::max_stack_offset()));
const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset())); const Address size_of_locals (G5_method, 0, in_bytes(Method::size_of_locals_offset()));
address entry_point = __ pc(); address entry_point = __ pc();
......
...@@ -518,7 +518,8 @@ void InterpreterMacroAssembler::empty_expression_stack() { ...@@ -518,7 +518,8 @@ void InterpreterMacroAssembler::empty_expression_stack() {
delayed()->nop(); delayed()->nop();
// Compute max expression stack+register save area // Compute max expression stack+register save area
lduh(Lmethod, in_bytes(Method::max_stack_offset()), Gframe_size); // Load max stack. ld_ptr(Lmethod, in_bytes(Method::const_offset()), Gframe_size);
lduh(Gframe_size, in_bytes(ConstMethod::max_stack_offset()), Gframe_size); // Load max stack.
add( Gframe_size, frame::memory_parameter_word_sp_offset, Gframe_size ); add( Gframe_size, frame::memory_parameter_word_sp_offset, Gframe_size );
// //
......
...@@ -496,7 +496,7 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { ...@@ -496,7 +496,7 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
const Address size_of_parameters(G5_method, Method::size_of_parameters_offset()); const Address size_of_parameters(G5_method, Method::size_of_parameters_offset());
const Address size_of_locals (G5_method, Method::size_of_locals_offset()); const Address size_of_locals (G5_method, Method::size_of_locals_offset());
const Address max_stack (G5_method, Method::max_stack_offset()); const Address constMethod (G5_method, Method::const_offset());
int rounded_vm_local_words = round_to( frame::interpreter_frame_vm_local_words, WordsPerLong ); int rounded_vm_local_words = round_to( frame::interpreter_frame_vm_local_words, WordsPerLong );
const int extra_space = const int extra_space =
...@@ -538,7 +538,8 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) { ...@@ -538,7 +538,8 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
// see if the frame is greater than one page in size. If so, // see if the frame is greater than one page in size. If so,
// then we need to verify there is enough stack space remaining // then we need to verify there is enough stack space remaining
// Frame_size = (max_stack + extra_space) * BytesPerWord; // Frame_size = (max_stack + extra_space) * BytesPerWord;
__ lduh( max_stack, Gframe_size ); __ ld_ptr( constMethod, Gframe_size );
__ lduh( Gframe_size, in_bytes(ConstMethod::max_stack_offset()), Gframe_size );
__ add( Gframe_size, extra_space, Gframe_size ); __ add( Gframe_size, extra_space, Gframe_size );
__ round_to( Gframe_size, WordsPerLong ); __ round_to( Gframe_size, WordsPerLong );
__ sll( Gframe_size, Interpreter::logStackElementSize, Gframe_size); __ sll( Gframe_size, Interpreter::logStackElementSize, Gframe_size);
......
...@@ -538,9 +538,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register ...@@ -538,9 +538,9 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(const Register
// compute full expression stack limit // compute full expression stack limit
const Address size_of_stack (rbx, Method::max_stack_offset());
const int extra_stack = 0; //6815692//Method::extra_stack_words(); const int extra_stack = 0; //6815692//Method::extra_stack_words();
__ load_unsigned_short(rdx, size_of_stack); // get size of expression stack in words __ movptr(rdx, Address(rbx, Method::const_offset()));
__ load_unsigned_short(rdx, Address(rdx, ConstMethod::max_stack_offset())); // get size of expression stack in words
__ negptr(rdx); // so we can subtract in next step __ negptr(rdx); // so we can subtract in next step
// Allocate expression stack // Allocate expression stack
__ lea(rsp, Address(rsp, rdx, Address::times_ptr, -extra_stack)); __ lea(rsp, Address(rsp, rdx, Address::times_ptr, -extra_stack));
...@@ -682,12 +682,12 @@ void InterpreterGenerator::generate_stack_overflow_check(void) { ...@@ -682,12 +682,12 @@ void InterpreterGenerator::generate_stack_overflow_check(void) {
const Address stack_size(thread, Thread::stack_size_offset()); const Address stack_size(thread, Thread::stack_size_offset());
// locals + overhead, in bytes // locals + overhead, in bytes
const Address size_of_stack (rbx, Method::max_stack_offset()); // Always give one monitor to allow us to start interp if sync method.
// Always give one monitor to allow us to start interp if sync method. // Any additional monitors need a check when moving the expression stack
// Any additional monitors need a check when moving the expression stack const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize;
const int one_monitor = frame::interpreter_frame_monitor_size() * wordSize; const int extra_stack = 0; //6815692//Method::extra_stack_entries();
const int extra_stack = 0; //6815692//Method::extra_stack_entries(); __ movptr(rax, Address(rbx, Method::const_offset()));
__ load_unsigned_short(rax, size_of_stack); // get size of expression stack in words __ load_unsigned_short(rax, Address(rax, ConstMethod::max_stack_offset())); // get size of expression stack in words
__ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), extra_stack + one_monitor)); __ lea(rax, Address(noreg, rax, Interpreter::stackElementScale(), extra_stack + one_monitor));
__ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size)); __ lea(rax, Address(rax, rdx, Interpreter::stackElementScale(), overhead_size));
......
...@@ -2184,7 +2184,7 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, ...@@ -2184,7 +2184,7 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
Method* m = Method::allocate( Method* m = Method::allocate(
loader_data, code_length, access_flags, linenumber_table_length, loader_data, code_length, access_flags, linenumber_table_length,
total_lvt_length, exception_table_length, checked_exceptions_length, total_lvt_length, exception_table_length, checked_exceptions_length,
ConstMethod::NORMAL, CHECK_(nullHandle)); generic_signature_index, ConstMethod::NORMAL, CHECK_(nullHandle));
ClassLoadingService::add_class_method_size(m->size()*HeapWordSize); ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
...@@ -2192,7 +2192,6 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, ...@@ -2192,7 +2192,6 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
m->set_constants(cp()); m->set_constants(cp());
m->set_name_index(name_index); m->set_name_index(name_index);
m->set_signature_index(signature_index); m->set_signature_index(signature_index);
m->set_generic_signature_index(generic_signature_index);
#ifdef CC_INTERP #ifdef CC_INTERP
// hmm is there a gc issue here?? // hmm is there a gc issue here??
ResultTypeFinder rtf(cp->symbol_at(signature_index)); ResultTypeFinder rtf(cp->symbol_at(signature_index));
......
...@@ -1148,12 +1148,11 @@ static Method* new_method( ...@@ -1148,12 +1148,11 @@ static Method* new_method(
int code_length = bytecodes->length(); int code_length = bytecodes->length();
Method* m = Method::allocate(cp->pool_holder()->class_loader_data(), Method* m = Method::allocate(cp->pool_holder()->class_loader_data(),
code_length, flags, 0, 0, 0, 0, mt, CHECK_NULL); code_length, flags, 0, 0, 0, 0, 0, mt, CHECK_NULL);
m->set_constants(NULL); // This will get filled in later m->set_constants(NULL); // This will get filled in later
m->set_name_index(cp->utf8(name)); m->set_name_index(cp->utf8(name));
m->set_signature_index(cp->utf8(sig)); m->set_signature_index(cp->utf8(sig));
m->set_generic_signature_index(0);
#ifdef CC_INTERP #ifdef CC_INTERP
ResultTypeFinder rtf(sig); ResultTypeFinder rtf(sig);
m->set_result_index(rtf.type()); m->set_result_index(rtf.type());
......
...@@ -39,16 +39,19 @@ ConstMethod* ConstMethod::allocate(ClassLoaderData* loader_data, ...@@ -39,16 +39,19 @@ ConstMethod* ConstMethod::allocate(ClassLoaderData* loader_data,
int localvariable_table_length, int localvariable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length, int checked_exceptions_length,
u2 generic_signature_index,
MethodType method_type, MethodType method_type,
TRAPS) { TRAPS) {
int size = ConstMethod::size(byte_code_size, int size = ConstMethod::size(byte_code_size,
compressed_line_number_size, compressed_line_number_size,
localvariable_table_length, localvariable_table_length,
exception_table_length, exception_table_length,
checked_exceptions_length); checked_exceptions_length,
generic_signature_index);
return new (loader_data, size, true, THREAD) ConstMethod( return new (loader_data, size, true, THREAD) ConstMethod(
byte_code_size, compressed_line_number_size, localvariable_table_length, byte_code_size, compressed_line_number_size, localvariable_table_length,
exception_table_length, checked_exceptions_length, method_type, size); exception_table_length, checked_exceptions_length, generic_signature_index,
method_type, size);
} }
ConstMethod::ConstMethod(int byte_code_size, ConstMethod::ConstMethod(int byte_code_size,
...@@ -56,6 +59,7 @@ ConstMethod::ConstMethod(int byte_code_size, ...@@ -56,6 +59,7 @@ ConstMethod::ConstMethod(int byte_code_size,
int localvariable_table_length, int localvariable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length, int checked_exceptions_length,
u2 generic_signature_index,
MethodType method_type, MethodType method_type,
int size) { int size) {
...@@ -66,7 +70,8 @@ ConstMethod::ConstMethod(int byte_code_size, ...@@ -66,7 +70,8 @@ ConstMethod::ConstMethod(int byte_code_size,
set_stackmap_data(NULL); set_stackmap_data(NULL);
set_code_size(byte_code_size); set_code_size(byte_code_size);
set_constMethod_size(size); set_constMethod_size(size);
set_inlined_tables_length(checked_exceptions_length, set_inlined_tables_length(generic_signature_index,
checked_exceptions_length,
compressed_line_number_size, compressed_line_number_size,
localvariable_table_length, localvariable_table_length,
exception_table_length); exception_table_length);
...@@ -90,7 +95,8 @@ int ConstMethod::size(int code_size, ...@@ -90,7 +95,8 @@ int ConstMethod::size(int code_size,
int compressed_line_number_size, int compressed_line_number_size,
int local_variable_table_length, int local_variable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length) { int checked_exceptions_length,
u2 generic_signature_index) {
int extra_bytes = code_size; int extra_bytes = code_size;
if (compressed_line_number_size > 0) { if (compressed_line_number_size > 0) {
extra_bytes += compressed_line_number_size; extra_bytes += compressed_line_number_size;
...@@ -108,6 +114,9 @@ int ConstMethod::size(int code_size, ...@@ -108,6 +114,9 @@ int ConstMethod::size(int code_size,
extra_bytes += sizeof(u2); extra_bytes += sizeof(u2);
extra_bytes += exception_table_length * sizeof(ExceptionTableElement); extra_bytes += exception_table_length * sizeof(ExceptionTableElement);
} }
if (generic_signature_index != 0) {
extra_bytes += sizeof(u2);
}
int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord; int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord;
return align_object_size(header_size() + extra_words); return align_object_size(header_size() + extra_words);
} }
...@@ -125,20 +134,29 @@ u_char* ConstMethod::compressed_linenumber_table() const { ...@@ -125,20 +134,29 @@ u_char* ConstMethod::compressed_linenumber_table() const {
return code_end(); return code_end();
} }
u2* ConstMethod::checked_exceptions_length_addr() const { u2* ConstMethod::generic_signature_index_addr() const {
// Located at the end of the constMethod. // Located at the end of the constMethod.
assert(has_checked_exceptions(), "called only if table is present"); assert(has_generic_signature(), "called only if generic signature exists");
return last_u2_element(); return last_u2_element();
} }
u2* ConstMethod::checked_exceptions_length_addr() const {
// Located immediately before the generic signature index.
assert(has_checked_exceptions(), "called only if table is present");
return has_generic_signature() ? (last_u2_element() - 1) :
last_u2_element();
}
u2* ConstMethod::exception_table_length_addr() const { u2* ConstMethod::exception_table_length_addr() const {
assert(has_exception_handler(), "called only if table is present"); assert(has_exception_handler(), "called only if table is present");
if (has_checked_exceptions()) { if (has_checked_exceptions()) {
// If checked_exception present, locate immediately before them. // If checked_exception present, locate immediately before them.
return (u2*) checked_exceptions_start() - 1; return (u2*) checked_exceptions_start() - 1;
} else { } else {
// Else, the exception table is at the end of the constMethod. // Else, the exception table is at the end of the constMethod or
return last_u2_element(); // immediately before the generic signature index.
return has_generic_signature() ? (last_u2_element() - 1) :
last_u2_element();
} }
} }
...@@ -152,25 +170,30 @@ u2* ConstMethod::localvariable_table_length_addr() const { ...@@ -152,25 +170,30 @@ u2* ConstMethod::localvariable_table_length_addr() const {
// If checked_exception present, locate immediately before them. // If checked_exception present, locate immediately before them.
return (u2*) checked_exceptions_start() - 1; return (u2*) checked_exceptions_start() - 1;
} else { } else {
// Else, the linenumber table is at the end of the constMethod. // Else, the linenumber table is at the end of the constMethod or
return last_u2_element(); // immediately before the generic signature index.
return has_generic_signature() ? (last_u2_element() - 1) :
last_u2_element();
} }
} }
} }
// Update the flags to indicate the presence of these optional fields. // Update the flags to indicate the presence of these optional fields.
void ConstMethod::set_inlined_tables_length( void ConstMethod::set_inlined_tables_length(u2 generic_signature_index,
int checked_exceptions_len, int checked_exceptions_len,
int compressed_line_number_size, int compressed_line_number_size,
int localvariable_table_len, int localvariable_table_len,
int exception_table_len) { int exception_table_len) {
// Must be done in the order below, otherwise length_addr accessors // Must be done in the order below, otherwise length_addr accessors
// will not work. Only set bit in header if length is positive. // will not work. Only set bit in header if length is positive.
assert(_flags == 0, "Error"); assert(_flags == 0, "Error");
if (compressed_line_number_size > 0) { if (compressed_line_number_size > 0) {
_flags |= _has_linenumber_table; _flags |= _has_linenumber_table;
} }
if (generic_signature_index != 0) {
_flags |= _has_generic_signature;
*(generic_signature_index_addr()) = generic_signature_index;
}
if (checked_exceptions_len > 0) { if (checked_exceptions_len > 0) {
_flags |= _has_checked_exceptions; _flags |= _has_checked_exceptions;
*(checked_exceptions_length_addr()) = checked_exceptions_len; *(checked_exceptions_length_addr()) = checked_exceptions_len;
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
// | constMethod_size | // | constMethod_size |
// | interp_kind | flags | code_size | // | interp_kind | flags | code_size |
// | name index | signature index | // | name index | signature index |
// | method_idnum | generic_signature_index | // | method_idnum | max_stack |
// |------------------------------------------------------| // |------------------------------------------------------|
// | | // | |
// | byte codes | // | byte codes |
...@@ -55,26 +55,29 @@ ...@@ -55,26 +55,29 @@
// | (see class CompressedLineNumberReadStream) | // | (see class CompressedLineNumberReadStream) |
// | (note that length is unknown until decompressed) | // | (note that length is unknown until decompressed) |
// | (access flags bit tells whether table is present) | // | (access flags bit tells whether table is present) |
// | (indexed from start of ConstMethod*) | // | (indexed from start of ConstMethod*) |
// | (elements not necessarily sorted!) | // | (elements not necessarily sorted!) |
// |------------------------------------------------------| // |------------------------------------------------------|
// | localvariable table elements + length (length last) | // | localvariable table elements + length (length last) |
// | (length is u2, elements are 6-tuples of u2) | // | (length is u2, elements are 6-tuples of u2) |
// | (see class LocalVariableTableElement) | // | (see class LocalVariableTableElement) |
// | (access flags bit tells whether table is present) | // | (access flags bit tells whether table is present) |
// | (indexed from end of ConstMethod*) | // | (indexed from end of ConstMethod*) |
// |------------------------------------------------------| // |------------------------------------------------------|
// | exception table + length (length last) | // | exception table + length (length last) |
// | (length is u2, elements are 4-tuples of u2) | // | (length is u2, elements are 4-tuples of u2) |
// | (see class ExceptionTableElement) | // | (see class ExceptionTableElement) |
// | (access flags bit tells whether table is present) | // | (access flags bit tells whether table is present) |
// | (indexed from end of ConstMethod*) | // | (indexed from end of ConstMethod*) |
// |------------------------------------------------------| // |------------------------------------------------------|
// | checked exceptions elements + length (length last) | // | checked exceptions elements + length (length last) |
// | (length is u2, elements are u2) | // | (length is u2, elements are u2) |
// | (see class CheckedExceptionElement) | // | (see class CheckedExceptionElement) |
// | (access flags bit tells whether table is present) | // | (access flags bit tells whether table is present) |
// | (indexed from end of ConstMethod*) | // | (indexed from end of ConstMethod*) |
// |------------------------------------------------------|
// | generic signature index (u2) |
// | (indexed from start of constMethodOop) |
// |------------------------------------------------------| // |------------------------------------------------------|
...@@ -118,7 +121,8 @@ private: ...@@ -118,7 +121,8 @@ private:
_has_checked_exceptions = 2, _has_checked_exceptions = 2,
_has_localvariable_table = 4, _has_localvariable_table = 4,
_has_exception_table = 8, _has_exception_table = 8,
_is_overpass = 16 _has_generic_signature = 16,
_is_overpass = 32
}; };
// Bit vector of signature // Bit vector of signature
...@@ -145,7 +149,7 @@ private: ...@@ -145,7 +149,7 @@ private:
u2 _method_idnum; // unique identification number for the method within the class u2 _method_idnum; // unique identification number for the method within the class
// initially corresponds to the index into the methods array. // initially corresponds to the index into the methods array.
// but this may change with redefinition // but this may change with redefinition
u2 _generic_signature_index; // Generic signature (index in constant pool, 0 if absent) u2 _max_stack; // Maximum number of entries on the expression stack
// Constructor // Constructor
...@@ -154,6 +158,7 @@ private: ...@@ -154,6 +158,7 @@ private:
int localvariable_table_length, int localvariable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length, int checked_exceptions_length,
u2 generic_signature_index,
MethodType is_overpass, MethodType is_overpass,
int size); int size);
public: public:
...@@ -164,17 +169,22 @@ public: ...@@ -164,17 +169,22 @@ public:
int localvariable_table_length, int localvariable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length, int checked_exceptions_length,
u2 generic_signature_index,
MethodType mt, MethodType mt,
TRAPS); TRAPS);
bool is_constMethod() const { return true; } bool is_constMethod() const { return true; }
// Inlined tables // Inlined tables
void set_inlined_tables_length(int checked_exceptions_len, void set_inlined_tables_length(u2 generic_signature_index,
int checked_exceptions_len,
int compressed_line_number_size, int compressed_line_number_size,
int localvariable_table_len, int localvariable_table_len,
int exception_table_len); int exception_table_len);
bool has_generic_signature() const
{ return (_flags & _has_generic_signature) != 0; }
bool has_linenumber_table() const bool has_linenumber_table() const
{ return (_flags & _has_linenumber_table) != 0; } { return (_flags & _has_linenumber_table) != 0; }
...@@ -252,8 +262,18 @@ public: ...@@ -252,8 +262,18 @@ public:
void set_signature_index(int index) { _signature_index = index; } void set_signature_index(int index) { _signature_index = index; }
// generics support // generics support
int generic_signature_index() const { return _generic_signature_index; } int generic_signature_index() const {
void set_generic_signature_index(int index) { _generic_signature_index = index; } if (has_generic_signature()) {
return *generic_signature_index_addr();
} else {
return 0;
}
}
void set_generic_signature_index(u2 index) {
assert(has_generic_signature(), "");
u2* addr = generic_signature_index_addr();
*addr = index;
}
// Sizing // Sizing
static int header_size() { static int header_size() {
...@@ -264,7 +284,8 @@ public: ...@@ -264,7 +284,8 @@ public:
static int size(int code_size, int compressed_line_number_size, static int size(int code_size, int compressed_line_number_size,
int local_variable_table_length, int local_variable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length); int checked_exceptions_length,
u2 generic_signature_index);
int size() const { return _constMethod_size;} int size() const { return _constMethod_size;}
void set_constMethod_size(int size) { _constMethod_size = size; } void set_constMethod_size(int size) { _constMethod_size = size; }
...@@ -281,6 +302,7 @@ public: ...@@ -281,6 +302,7 @@ public:
// linenumber table - note that length is unknown until decompression, // linenumber table - note that length is unknown until decompression,
// see class CompressedLineNumberReadStream. // see class CompressedLineNumberReadStream.
u_char* compressed_linenumber_table() const; // not preserved by gc u_char* compressed_linenumber_table() const; // not preserved by gc
u2* generic_signature_index_addr() const;
u2* checked_exceptions_length_addr() const; u2* checked_exceptions_length_addr() const;
u2* localvariable_table_length_addr() const; u2* localvariable_table_length_addr() const;
u2* exception_table_length_addr() const; u2* exception_table_length_addr() const;
...@@ -314,12 +336,19 @@ public: ...@@ -314,12 +336,19 @@ public:
static ByteSize constants_offset() static ByteSize constants_offset()
{ return byte_offset_of(ConstMethod, _constants); } { return byte_offset_of(ConstMethod, _constants); }
static ByteSize max_stack_offset()
{ return byte_offset_of(ConstMethod, _max_stack); }
// Unique id for the method // Unique id for the method
static const u2 MAX_IDNUM; static const u2 MAX_IDNUM;
static const u2 UNSET_IDNUM; static const u2 UNSET_IDNUM;
u2 method_idnum() const { return _method_idnum; } u2 method_idnum() const { return _method_idnum; }
void set_method_idnum(u2 idnum) { _method_idnum = idnum; } void set_method_idnum(u2 idnum) { _method_idnum = idnum; }
// max stack
int max_stack() const { return _max_stack; }
void set_max_stack(int size) { _max_stack = size; }
// Deallocation for RedefineClasses // Deallocation for RedefineClasses
void deallocate_contents(ClassLoaderData* loader_data); void deallocate_contents(ClassLoaderData* loader_data);
bool is_klass() const { return false; } bool is_klass() const { return false; }
......
...@@ -64,6 +64,7 @@ Method* Method::allocate(ClassLoaderData* loader_data, ...@@ -64,6 +64,7 @@ Method* Method::allocate(ClassLoaderData* loader_data,
int localvariable_table_length, int localvariable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length, int checked_exceptions_length,
u2 generic_signature_index,
ConstMethod::MethodType method_type, ConstMethod::MethodType method_type,
TRAPS) { TRAPS) {
assert(!access_flags.is_native() || byte_code_size == 0, assert(!access_flags.is_native() || byte_code_size == 0,
...@@ -74,6 +75,7 @@ Method* Method::allocate(ClassLoaderData* loader_data, ...@@ -74,6 +75,7 @@ Method* Method::allocate(ClassLoaderData* loader_data,
localvariable_table_length, localvariable_table_length,
exception_table_length, exception_table_length,
checked_exceptions_length, checked_exceptions_length,
generic_signature_index,
method_type, method_type,
CHECK_NULL); CHECK_NULL);
...@@ -1034,7 +1036,7 @@ methodHandle Method::make_method_handle_intrinsic(vmIntrinsics::ID iid, ...@@ -1034,7 +1036,7 @@ methodHandle Method::make_method_handle_intrinsic(vmIntrinsics::ID iid,
methodHandle m; methodHandle m;
{ {
Method* m_oop = Method::allocate(loader_data, 0, accessFlags_from(flags_bits), Method* m_oop = Method::allocate(loader_data, 0, accessFlags_from(flags_bits),
0, 0, 0, 0, ConstMethod::NORMAL, CHECK_(empty)); 0, 0, 0, 0, 0, ConstMethod::NORMAL, CHECK_(empty));
m = methodHandle(THREAD, m_oop); m = methodHandle(THREAD, m_oop);
} }
m->set_constants(cp()); m->set_constants(cp());
...@@ -1082,6 +1084,7 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n ...@@ -1082,6 +1084,7 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n
assert(!m->is_native(), "cannot rewrite native methods"); assert(!m->is_native(), "cannot rewrite native methods");
// Allocate new Method* // Allocate new Method*
AccessFlags flags = m->access_flags(); AccessFlags flags = m->access_flags();
u2 generic_signature_index = m->generic_signature_index();
int checked_exceptions_len = m->checked_exceptions_length(); int checked_exceptions_len = m->checked_exceptions_length();
int localvariable_len = m->localvariable_table_length(); int localvariable_len = m->localvariable_table_length();
int exception_table_len = m->exception_table_length(); int exception_table_len = m->exception_table_length();
...@@ -1094,6 +1097,7 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n ...@@ -1094,6 +1097,7 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n
localvariable_len, localvariable_len,
exception_table_len, exception_table_len,
checked_exceptions_len, checked_exceptions_len,
generic_signature_index,
m->method_type(), m->method_type(),
CHECK_(methodHandle())); CHECK_(methodHandle()));
methodHandle newm (THREAD, newm_oop); methodHandle newm (THREAD, newm_oop);
......
...@@ -73,12 +73,10 @@ ...@@ -73,12 +73,10 @@
// |------------------------------------------------------| // |------------------------------------------------------|
// | result_index (C++ interpreter only) | // | result_index (C++ interpreter only) |
// |------------------------------------------------------| // |------------------------------------------------------|
// | method_size | max_stack | // | method_size | max_locals |
// | max_locals | size_of_parameters | // | size_of_parameters | intrinsic_id| flags |
// |------------------------------------------------------| // |------------------------------------------------------|
// |intrinsic_id| flags | throwout_count | // | throwout_count | num_breakpoints |
// |------------------------------------------------------|
// | num_breakpoints | (unused) |
// |------------------------------------------------------| // |------------------------------------------------------|
// | invocation_counter | // | invocation_counter |
// | backedge_counter | // | backedge_counter |
...@@ -118,7 +116,6 @@ class Method : public Metadata { ...@@ -118,7 +116,6 @@ class Method : public Metadata {
int _result_index; // C++ interpreter needs for converting results to/from stack int _result_index; // C++ interpreter needs for converting results to/from stack
#endif #endif
u2 _method_size; // size of this object u2 _method_size; // size of this object
u2 _max_stack; // Maximum number of entries on the expression stack
u2 _max_locals; // Number of local variables used by this method u2 _max_locals; // Number of local variables used by this method
u2 _size_of_parameters; // size of the parameter block (receiver + arguments) in words u2 _size_of_parameters; // size of the parameter block (receiver + arguments) in words
u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none) u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none)
...@@ -166,6 +163,7 @@ class Method : public Metadata { ...@@ -166,6 +163,7 @@ class Method : public Metadata {
int localvariable_table_length, int localvariable_table_length,
int exception_table_length, int exception_table_length,
int checked_exceptions_length, int checked_exceptions_length,
u2 generic_signature_index,
ConstMethod::MethodType method_type, ConstMethod::MethodType method_type,
TRAPS); TRAPS);
...@@ -289,9 +287,9 @@ class Method : public Metadata { ...@@ -289,9 +287,9 @@ class Method : public Metadata {
// max stack // max stack
// return original max stack size for method verification // return original max stack size for method verification
int verifier_max_stack() const { return _max_stack; } int verifier_max_stack() const { return constMethod()->max_stack(); }
int max_stack() const { return _max_stack + extra_stack_entries(); } int max_stack() const { return constMethod()->max_stack() + extra_stack_entries(); }
void set_max_stack(int size) { _max_stack = size; } void set_max_stack(int size) { constMethod()->set_max_stack(size); }
// max locals // max locals
int max_locals() const { return _max_locals; } int max_locals() const { return _max_locals; }
...@@ -607,7 +605,6 @@ class Method : public Metadata { ...@@ -607,7 +605,6 @@ class Method : public Metadata {
static ByteSize from_interpreted_offset() { return byte_offset_of(Method, _from_interpreted_entry ); } static ByteSize from_interpreted_offset() { return byte_offset_of(Method, _from_interpreted_entry ); }
static ByteSize interpreter_entry_offset() { return byte_offset_of(Method, _i2i_entry ); } static ByteSize interpreter_entry_offset() { return byte_offset_of(Method, _i2i_entry ); }
static ByteSize signature_handler_offset() { return in_ByteSize(sizeof(Method) + wordSize); } static ByteSize signature_handler_offset() { return in_ByteSize(sizeof(Method) + wordSize); }
static ByteSize max_stack_offset() { return byte_offset_of(Method, _max_stack ); }
// for code generation // for code generation
static int method_data_offset_in_bytes() { return offset_of(Method, _method_data); } static int method_data_offset_in_bytes() { return offset_of(Method, _method_data); }
......
...@@ -355,7 +355,6 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary; ...@@ -355,7 +355,6 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary;
nonstatic_field(Method, _access_flags, AccessFlags) \ nonstatic_field(Method, _access_flags, AccessFlags) \
nonstatic_field(Method, _vtable_index, int) \ nonstatic_field(Method, _vtable_index, int) \
nonstatic_field(Method, _method_size, u2) \ nonstatic_field(Method, _method_size, u2) \
nonstatic_field(Method, _max_stack, u2) \
nonstatic_field(Method, _max_locals, u2) \ nonstatic_field(Method, _max_locals, u2) \
nonstatic_field(Method, _size_of_parameters, u2) \ nonstatic_field(Method, _size_of_parameters, u2) \
nonstatic_field(Method, _interpreter_throwout_count, u2) \ nonstatic_field(Method, _interpreter_throwout_count, u2) \
...@@ -378,7 +377,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary; ...@@ -378,7 +377,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary;
nonstatic_field(ConstMethod, _name_index, u2) \ nonstatic_field(ConstMethod, _name_index, u2) \
nonstatic_field(ConstMethod, _signature_index, u2) \ nonstatic_field(ConstMethod, _signature_index, u2) \
nonstatic_field(ConstMethod, _method_idnum, u2) \ nonstatic_field(ConstMethod, _method_idnum, u2) \
nonstatic_field(ConstMethod, _generic_signature_index, u2) \ nonstatic_field(ConstMethod, _max_stack, u2) \
nonstatic_field(ObjArrayKlass, _element_klass, Klass*) \ nonstatic_field(ObjArrayKlass, _element_klass, Klass*) \
nonstatic_field(ObjArrayKlass, _bottom_klass, Klass*) \ nonstatic_field(ObjArrayKlass, _bottom_klass, Klass*) \
volatile_nonstatic_field(Symbol, _refcount, int) \ volatile_nonstatic_field(Symbol, _refcount, int) \
...@@ -2280,6 +2279,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary; ...@@ -2280,6 +2279,7 @@ typedef BinaryTreeDictionary<Metablock, FreeList> MetablockTreeDictionary;
declare_constant(ConstMethod::_has_checked_exceptions) \ declare_constant(ConstMethod::_has_checked_exceptions) \
declare_constant(ConstMethod::_has_localvariable_table) \ declare_constant(ConstMethod::_has_localvariable_table) \
declare_constant(ConstMethod::_has_exception_table) \ declare_constant(ConstMethod::_has_exception_table) \
declare_constant(ConstMethod::_has_generic_signature) \
\ \
/*************************************/ \ /*************************************/ \
/* InstanceKlass enum */ \ /* InstanceKlass enum */ \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册