src/share/vm/oops/constMethod.cpp
Print this page
@@ -114,11 +114,15 @@
extra_bytes += sizes->exception_table_length() * sizeof(ExceptionTableElement);
}
if (sizes->generic_signature_index() != 0) {
extra_bytes += sizeof(u2);
}
- if (sizes->method_parameters_length() > 0) {
+ // This has to be a less-than-or-equal check, because we might be
+ // storing information from a zero-length MethodParameters
+ // attribute. We have to store these, because in some cases, they
+ // cause the reflection API to throw a MalformedParametersException.
+ if (sizes->method_parameters_length() >= 0) {
extra_bytes += sizeof(u2);
extra_bytes += sizes->method_parameters_length() * sizeof(MethodParametersElement);
}
// Align sizes up to a word.
@@ -235,11 +239,11 @@
_flags = 0;
if (sizes->compressed_linenumber_size() > 0)
_flags |= _has_linenumber_table;
if (sizes->generic_signature_index() != 0)
_flags |= _has_generic_signature;
- if (sizes->method_parameters_length() > 0)
+ if (sizes->method_parameters_length() >= 0)
_flags |= _has_method_parameters;
if (sizes->checked_exceptions_length() > 0)
_flags |= _has_checked_exceptions;
if (sizes->exception_table_length() > 0)
_flags |= _has_exception_table;
@@ -270,22 +274,22 @@
// anything is added here. It might be advisable to have some sort
// of indication of this inline.
if (sizes->generic_signature_index() != 0)
*(generic_signature_index_addr()) = sizes->generic_signature_index();
// New data should probably go here.
- if (sizes->method_parameters_length() > 0)
+ if (sizes->method_parameters_length() >= 0)
*(method_parameters_length_addr()) = sizes->method_parameters_length();
if (sizes->checked_exceptions_length() > 0)
*(checked_exceptions_length_addr()) = sizes->checked_exceptions_length();
if (sizes->exception_table_length() > 0)
*(exception_table_length_addr()) = sizes->exception_table_length();
if (sizes->localvariable_table_length() > 0)
*(localvariable_table_length_addr()) = sizes->localvariable_table_length();
}
int ConstMethod::method_parameters_length() const {
- return has_method_parameters() ? *(method_parameters_length_addr()) : 0;
+ return has_method_parameters() ? *(method_parameters_length_addr()) : -1;
}
MethodParametersElement* ConstMethod::method_parameters_start() const {
u2* addr = method_parameters_length_addr();
u2 length = *addr;