This commit is contained in:
Daniel D. Daugherty 2013-04-19 13:48:54 -07:00
commit dec02ae201
10 changed files with 54 additions and 21 deletions

View File

@ -436,14 +436,19 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) {
ref_index, CHECK_(nullHandle)); ref_index, CHECK_(nullHandle));
break; break;
case JVM_REF_invokeVirtual: case JVM_REF_invokeVirtual:
case JVM_REF_invokeStatic:
case JVM_REF_invokeSpecial:
case JVM_REF_newInvokeSpecial: case JVM_REF_newInvokeSpecial:
check_property( check_property(
tag.is_method(), tag.is_method(),
"Invalid constant pool index %u in class file %s (not a method)", "Invalid constant pool index %u in class file %s (not a method)",
ref_index, CHECK_(nullHandle)); ref_index, CHECK_(nullHandle));
break; break;
case JVM_REF_invokeStatic:
case JVM_REF_invokeSpecial:
check_property(
tag.is_method() || tag.is_interface_method(),
"Invalid constant pool index %u in class file %s (not a method)",
ref_index, CHECK_(nullHandle));
break;
case JVM_REF_invokeInterface: case JVM_REF_invokeInterface:
check_property( check_property(
tag.is_interface_method(), tag.is_interface_method(),
@ -3837,7 +3842,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name,
} }
if (TraceClassLoadingPreorder) { if (TraceClassLoadingPreorder) {
tty->print("[Loading %s", name->as_klass_external_name()); tty->print("[Loading %s", (name != NULL) ? name->as_klass_external_name() : "NoName");
if (cfs->source() != NULL) tty->print(" from %s", cfs->source()); if (cfs->source() != NULL) tty->print(" from %s", cfs->source());
tty->print_cr("]"); tty->print_cr("]");
} }

View File

@ -268,8 +268,15 @@ ClassDescriptor* ClassDescriptor::parse_generic_signature(
Klass* outer = SystemDictionary::find( Klass* outer = SystemDictionary::find(
outer_name, class_loader, protection_domain, CHECK_NULL); outer_name, class_loader, protection_domain, CHECK_NULL);
if (outer == NULL && !THREAD->is_Compiler_thread()) { if (outer == NULL && !THREAD->is_Compiler_thread()) {
outer = SystemDictionary::resolve_super_or_fail(original_name, if (outer_name == ik->super()->name()) {
outer_name, class_loader, protection_domain, false, CHECK_NULL); outer = SystemDictionary::resolve_super_or_fail(original_name, outer_name,
class_loader, protection_domain,
false, CHECK_NULL);
}
else {
outer = SystemDictionary::resolve_or_fail(outer_name, class_loader,
protection_domain, false, CHECK_NULL);
}
} }
InstanceKlass* outer_ik; InstanceKlass* outer_ik;

View File

@ -1014,7 +1014,21 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHand
resolved_method->name(), resolved_method->name(),
resolved_method->signature())); resolved_method->signature()));
} }
// check if public // check access
if (sel_method->method_holder()->is_interface()) {
// Method holder is an interface. Throw Illegal Access Error if sel_method
// is neither public nor private.
if (!(sel_method->is_public() || sel_method->is_private())) {
ResourceMark rm(THREAD);
THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
Method::name_and_sig_as_C_string(recv_klass(),
sel_method->name(),
sel_method->signature()));
}
}
else {
// Method holder is a class. Throw Illegal Access Error if sel_method
// is not public.
if (!sel_method->is_public()) { if (!sel_method->is_public()) {
ResourceMark rm(THREAD); ResourceMark rm(THREAD);
THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
@ -1022,6 +1036,7 @@ void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHand
sel_method->name(), sel_method->name(),
sel_method->signature())); sel_method->signature()));
} }
}
// check if abstract // check if abstract
if (check_null_and_abstract && sel_method->is_abstract()) { if (check_null_and_abstract && sel_method->is_abstract()) {
ResourceMark rm(THREAD); ResourceMark rm(THREAD);

View File

@ -187,6 +187,11 @@ oop MethodHandles::init_method_MemberName(oop mname_oop, Method* m, bool do_disp
flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT); flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
} else if (mods.is_static()) { } else if (mods.is_static()) {
flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT); flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT);
// Check if this method is a lambda method that is generated as
// private static method.
if (m->is_private() && m->method_holder()->is_interface()) {
vmindex = klassItable::compute_itable_index(m);
}
} else if (receiver_limit != mklass && } else if (receiver_limit != mklass &&
!receiver_limit->is_subtype_of(mklass)) { !receiver_limit->is_subtype_of(mklass)) {
return NULL; // bad receiver limit return NULL; // bad receiver limit

View File

@ -1901,7 +1901,7 @@ bool Arguments::check_vm_args_consistency() {
// Divide by bucket size to prevent a large size from causing rollover when // Divide by bucket size to prevent a large size from causing rollover when
// calculating amount of memory needed to be allocated for the String table. // calculating amount of memory needed to be allocated for the String table.
status = status && verify_interval(StringTableSize, defaultStringTableSize, status = status && verify_interval(StringTableSize, minimumStringTableSize,
(max_uintx / StringTable::bucket_size()), "StringTable size"); (max_uintx / StringTable::bucket_size()), "StringTable size");
if (MinHeapFreeRatio > MaxHeapFreeRatio) { if (MinHeapFreeRatio > MaxHeapFreeRatio) {

View File

@ -133,7 +133,7 @@ typedef struct _memType2Name {
// This class aggregates malloc'd records by memory type // This class aggregates malloc'd records by memory type
class MallocMem : public _ValueObj { class MallocMem VALUE_OBJ_CLASS_SPEC {
private: private:
MEMFLAGS _type; MEMFLAGS _type;
@ -211,7 +211,7 @@ class ArenaMem : public MallocMem {
}; };
// This class aggregates virtual memory by its memory type // This class aggregates virtual memory by its memory type
class VMMem : public _ValueObj { class VMMem VALUE_OBJ_CLASS_SPEC {
private: private:
MEMFLAGS _type; MEMFLAGS _type;
@ -296,7 +296,7 @@ class BaselineComparisonReporter;
* aggregates memory usage by callsites when detail tracking * aggregates memory usage by callsites when detail tracking
* is on. * is on.
*/ */
class MemBaseline : public _ValueObj { class MemBaseline VALUE_OBJ_CLASS_SPEC {
friend class BaselineReporter; friend class BaselineReporter;
friend class BaselineComparisonReporter; friend class BaselineComparisonReporter;

View File

@ -89,7 +89,7 @@ class SequenceGenerator : AllStatic {
* the memory pointer either points to a malloc'd * the memory pointer either points to a malloc'd
* memory block, or a mmap'd memory block * memory block, or a mmap'd memory block
*/ */
class MemPointer : public _ValueObj { class MemPointer VALUE_OBJ_CLASS_SPEC {
public: public:
MemPointer(): _addr(0) { } MemPointer(): _addr(0) { }
MemPointer(address addr): _addr(addr) { } MemPointer(address addr): _addr(addr) { }

View File

@ -308,7 +308,7 @@ class VMRecordIterator : public MemPointerArrayIterator {
} }
}; };
class StagingArea : public _ValueObj { class StagingArea VALUE_OBJ_CLASS_SPEC {
private: private:
MemPointerArray* _malloc_data; MemPointerArray* _malloc_data;
MemPointerArray* _vm_data; MemPointerArray* _vm_data;

View File

@ -32,7 +32,7 @@
// Maximum MAX_GENERATIONS generation data can be tracked. // Maximum MAX_GENERATIONS generation data can be tracked.
#define MAX_GENERATIONS 512 #define MAX_GENERATIONS 512
class GenerationData : public _ValueObj { class GenerationData VALUE_OBJ_CLASS_SPEC {
private: private:
int _number_of_classes; int _number_of_classes;
MemRecorder* _recorder_list; MemRecorder* _recorder_list;

View File

@ -328,9 +328,10 @@ const int max_method_code_size = 64*K - 1; // JVM spec, 2nd ed. section 4.8.1 (
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
// Minimum StringTableSize value // Default and minimum StringTableSize values
const int defaultStringTableSize=1009; const int defaultStringTableSize = NOT_LP64(1009) LP64_ONLY(60013);
const int minimumStringTableSize=1009;
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------