tweak API
authorjrose
Fri Aug 15 23:49:17 2008 -0700 (15 months ago)
changeset 11a421ed0ab619
parent 10ad4e40228a6a
child 128610ea7f96a6
tweak API
anonk.patch
--- a/anonk.patch Thu Jul 31 03:58:45 2008 -0700
+++ b/anonk.patch Fri Aug 15 23:49:17 2008 -0700
@@ -1,7 +1,7 @@ diff --git a/src/share/vm/ci/ciEnv.cpp b
diff --git a/src/share/vm/ci/ciEnv.cpp b/src/share/vm/ci/ciEnv.cpp
--- a/src/share/vm/ci/ciEnv.cpp
+++ b/src/share/vm/ci/ciEnv.cpp
-@@ -484,7 +484,7 @@ ciConstant ciEnv::get_constant_by_index_
+@@ -484,7 +484,7 @@
} else if (tag.is_double()) {
return ciConstant((jdouble)cpool->double_at(index));
} else if (tag.is_string() || tag.is_unresolved_string()) {
@@ -13,7 +13,7 @@ diff --git a/src/share/vm/classfile/clas
diff --git a/src/share/vm/classfile/classFileParser.cpp b/src/share/vm/classfile/classFileParser.cpp
--- a/src/share/vm/classfile/classFileParser.cpp
+++ b/src/share/vm/classfile/classFileParser.cpp
-@@ -168,9 +168,21 @@ void ClassFileParser::parse_constant_poo
+@@ -168,9 +168,21 @@
// Got utf8 string, guarantee utf8_length+1 bytes, set stream position forward.
cfs->guarantee_more(utf8_length+1, CHECK); // utf8 string, tag/access_flags
cfs->skip_u1_fast(utf8_length);
@@ -35,7 +35,7 @@ diff --git a/src/share/vm/classfile/clas
}
unsigned int hash;
-@@ -301,7 +313,13 @@ constantPoolHandle ClassFileParser::pars
+@@ -301,7 +313,13 @@
cp->tag_at(class_index).is_utf8(),
"Invalid constant pool index %u in class file %s",
class_index, CHECK_(nullHandle));
@@ -50,7 +50,7 @@ diff --git a/src/share/vm/classfile/clas
}
break;
case JVM_CONSTANT_UnresolvedString :
-@@ -326,16 +344,45 @@ constantPoolHandle ClassFileParser::pars
+@@ -326,16 +344,45 @@
} // end of switch
} // end of for
@@ -96,7 +96,7 @@ diff --git a/src/share/vm/classfile/clas
verify_legal_class_name(class_name, CHECK_(nullHandle));
break;
}
-@@ -378,6 +425,71 @@ constantPoolHandle ClassFileParser::pars
+@@ -378,6 +425,71 @@
}
@@ -168,7 +168,7 @@ diff --git a/src/share/vm/classfile/clas
class NameSigHash: public ResourceObj {
public:
symbolOop _name; // name
-@@ -448,25 +560,32 @@ objArrayHandle ClassFileParser::parse_in
+@@ -448,25 +560,32 @@
int index;
for (index = 0; index < length; index++) {
u2 interface_index = cfs->get_u2(CHECK_(nullHandle));
@@ -216,7 +216,7 @@ diff --git a/src/share/vm/classfile/clas
if (!Klass::cast(interf())->is_interface()) {
THROW_MSG_(vmSymbols::java_lang_IncompatibleClassChangeError(), "Implementing class", nullHandle);
-@@ -877,8 +996,7 @@ typeArrayHandle ClassFileParser::parse_e
+@@ -877,8 +996,7 @@
"Illegal exception table handler in class file %s", CHECK_(nullHandle));
if (catch_type_index != 0) {
guarantee_property(valid_cp_range(catch_type_index, cp->length()) &&
@@ -226,7 +226,7 @@ diff --git a/src/share/vm/classfile/clas
"Catch type in exception table has bad constant type in class file %s", CHECK_(nullHandle));
}
}
-@@ -1117,7 +1235,7 @@ void ClassFileParser::parse_type_array(u
+@@ -1117,7 +1235,7 @@
} else if (tag == ITEM_Object) {
u2 class_index = u2_array[i2++] = cfs->get_u2(CHECK);
guarantee_property(valid_cp_range(class_index, cp->length()) &&
@@ -235,7 +235,7 @@ diff --git a/src/share/vm/classfile/clas
"Bad class index %u in StackMap in class file %s",
class_index, CHECK);
} else if (tag == ITEM_Uninitialized) {
-@@ -2349,6 +2467,7 @@ instanceKlassHandle ClassFileParser::par
+@@ -2349,6 +2467,7 @@
instanceKlassHandle ClassFileParser::parseClassFile(symbolHandle name,
Handle class_loader,
Handle protection_domain,
@@ -243,7 +243,7 @@ diff --git a/src/share/vm/classfile/clas
symbolHandle& parsed_name,
TRAPS) {
// So that JVMTI can cache class file in the state before retransformable agents
-@@ -2380,6 +2499,7 @@ instanceKlassHandle ClassFileParser::par
+@@ -2380,6 +2499,7 @@
}
}
@@ -251,7 +251,7 @@ diff --git a/src/share/vm/classfile/clas
instanceKlassHandle nullHandle;
-@@ -2510,14 +2630,22 @@ instanceKlassHandle ClassFileParser::par
+@@ -2510,14 +2630,22 @@
CHECK_(nullHandle));
} else {
check_property(valid_cp_range(super_class_index, cp_size) &&
@@ -262,6 +262,8 @@ diff --git a/src/share/vm/classfile/clas
CHECK_(nullHandle));
// The class name should be legal because it is checked when parsing constant pool.
// However, make sure it is not an array type.
+- if (_need_verify) {
+- guarantee_property(cp->unresolved_klass_at(super_class_index)->byte_at(0) != JVM_SIGNATURE_ARRAY,
+ bool is_array = false;
+ if (cp->tag_at(super_class_index).is_klass()) {
+ super_klass = instanceKlassHandle(THREAD, cp->resolved_klass_at(super_class_index));
@@ -270,13 +272,12 @@ diff --git a/src/share/vm/classfile/clas
+ } else if (_need_verify) {
+ is_array = (cp->unresolved_klass_at(super_class_index)->byte_at(0) == JVM_SIGNATURE_ARRAY);
+ }
- if (_need_verify) {
-- guarantee_property(cp->unresolved_klass_at(super_class_index)->byte_at(0) != JVM_SIGNATURE_ARRAY,
++ if (_need_verify) {
+ guarantee_property(!is_array,
"Bad superclass name in class file %s", CHECK_(nullHandle));
}
}
-@@ -2557,7 +2685,7 @@ instanceKlassHandle ClassFileParser::par
+@@ -2557,7 +2685,7 @@
objArrayHandle methods_default_annotations(THREAD, methods_default_annotations_oop);
// We check super class after class file is parsed and format is checked
@@ -285,7 +286,7 @@ diff --git a/src/share/vm/classfile/clas
symbolHandle sk (THREAD, cp->klass_name_at(super_class_index));
if (access_flags.is_interface()) {
// Before attempting to resolve the superclass, check for class format
-@@ -2574,6 +2702,9 @@ instanceKlassHandle ClassFileParser::par
+@@ -2574,6 +2702,9 @@
CHECK_(nullHandle));
KlassHandle kh (THREAD, k);
super_klass = instanceKlassHandle(THREAD, kh());
@@ -295,7 +296,7 @@ diff --git a/src/share/vm/classfile/clas
if (super_klass->is_interface()) {
ResourceMark rm(THREAD);
Exceptions::fthrow(
-@@ -3000,6 +3131,7 @@ instanceKlassHandle ClassFileParser::par
+@@ -3000,6 +3131,7 @@
this_klass->set_method_ordering(method_ordering());
this_klass->set_initial_method_idnum(methods->length());
this_klass->set_name(cp->klass_name_at(this_class_index));
@@ -306,7 +307,7 @@ diff --git a/src/share/vm/classfile/clas
diff --git a/src/share/vm/classfile/classFileParser.hpp b/src/share/vm/classfile/classFileParser.hpp
--- a/src/share/vm/classfile/classFileParser.hpp
+++ b/src/share/vm/classfile/classFileParser.hpp
-@@ -33,6 +33,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SP
+@@ -33,6 +33,7 @@
u2 _major_version;
u2 _minor_version;
symbolHandle _class_name;
@@ -314,7 +315,7 @@ diff --git a/src/share/vm/classfile/clas
bool _has_finalizer;
bool _has_empty_finalizer;
-@@ -203,6 +204,24 @@ class ClassFileParser VALUE_OBJ_CLASS_SP
+@@ -203,6 +204,24 @@
char* skip_over_field_name(char* name, bool slash_ok, unsigned int length);
char* skip_over_field_signature(char* signature, bool void_ok, unsigned int length, TRAPS);
@@ -339,7 +340,7 @@ diff --git a/src/share/vm/classfile/clas
public:
// Constructor
ClassFileParser(ClassFileStream* st) { set_stream(st); }
-@@ -218,6 +237,14 @@ class ClassFileParser VALUE_OBJ_CLASS_SP
+@@ -218,6 +237,14 @@
Handle class_loader,
Handle protection_domain,
symbolHandle& parsed_name,
@@ -357,7 +358,7 @@ diff --git a/src/share/vm/classfile/syst
diff --git a/src/share/vm/classfile/systemDictionary.cpp b/src/share/vm/classfile/systemDictionary.cpp
--- a/src/share/vm/classfile/systemDictionary.cpp
+++ b/src/share/vm/classfile/systemDictionary.cpp
-@@ -937,6 +937,8 @@ klassOop SystemDictionary::parse_stream(
+@@ -937,6 +937,8 @@
Handle class_loader,
Handle protection_domain,
ClassFileStream* st,
@@ -366,7 +367,7 @@ diff --git a/src/share/vm/classfile/syst
TRAPS) {
symbolHandle parsed_name;
-@@ -953,9 +955,9 @@ klassOop SystemDictionary::parse_stream(
+@@ -953,9 +955,9 @@
instanceKlassHandle k = ClassFileParser(st).parseClassFile(class_name,
class_loader,
protection_domain,
@@ -377,7 +378,7 @@ diff --git a/src/share/vm/classfile/syst
// We don't redefine the class, so we just need to clean up whether there
// was an error or not (don't want to modify any system dictionary
-@@ -970,6 +972,29 @@ klassOop SystemDictionary::parse_stream(
+@@ -970,6 +972,29 @@
MutexLocker mu(SystemDictionary_lock, THREAD);
placeholders()->find_and_remove(p_index, p_hash, parsed_name, class_loader, THREAD);
SystemDictionary_lock->notify_all();
@@ -410,7 +411,7 @@ diff --git a/src/share/vm/classfile/syst
diff --git a/src/share/vm/classfile/systemDictionary.hpp b/src/share/vm/classfile/systemDictionary.hpp
--- a/src/share/vm/classfile/systemDictionary.hpp
+++ b/src/share/vm/classfile/systemDictionary.hpp
-@@ -228,6 +228,16 @@ public:
+@@ -228,6 +228,16 @@
Handle class_loader,
Handle protection_domain,
ClassFileStream* st,
@@ -427,7 +428,7 @@ diff --git a/src/share/vm/classfile/syst
TRAPS);
// Resolve from stream (called by jni_DefineClass and JVM_DefineClass)
-@@ -388,9 +398,13 @@ public:
+@@ -388,9 +398,13 @@
// Local definition for direct access to the private array:
#define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]
@@ -446,7 +447,7 @@ diff --git a/src/share/vm/classfile/veri
diff --git a/src/share/vm/classfile/verifier.cpp b/src/share/vm/classfile/verifier.cpp
--- a/src/share/vm/classfile/verifier.cpp
+++ b/src/share/vm/classfile/verifier.cpp
-@@ -1600,7 +1600,11 @@ void ClassVerifier::verify_ldc(
+@@ -1600,7 +1600,11 @@
types = (1 << JVM_CONSTANT_Double) | (1 << JVM_CONSTANT_Long);
verify_cp_type(index, cp, types, CHECK_VERIFY(this));
}
@@ -462,18 +463,18 @@ diff --git a/src/share/vm/oops/constantP
diff --git a/src/share/vm/oops/constantPoolKlass.cpp b/src/share/vm/oops/constantPoolKlass.cpp
--- a/src/share/vm/oops/constantPoolKlass.cpp
+++ b/src/share/vm/oops/constantPoolKlass.cpp
-@@ -381,6 +381,7 @@ void constantPoolKlass::oop_verify_on(oo
+@@ -381,6 +381,7 @@
guarantee((*base)->is_symbol() || (*base)->is_instance(),
"should be symbol or instance");
}
-+ if (false) // @@@@ pseudo strings can be in non-perm
++ if (false) // %%% pseudo strings can be in non-perm
if (cp->tag_at(i).is_string()) {
guarantee((*base)->is_perm(), "should be in permspace");
guarantee((*base)->is_instance(), "should be instance");
diff --git a/src/share/vm/oops/constantPoolOop.cpp b/src/share/vm/oops/constantPoolOop.cpp
--- a/src/share/vm/oops/constantPoolOop.cpp
+++ b/src/share/vm/oops/constantPoolOop.cpp
-@@ -333,8 +333,11 @@ char* constantPoolOopDesc::string_at_nor
+@@ -333,8 +333,11 @@
oop entry = *(obj_at_addr(which));
if (entry->is_symbol()) {
return ((symbolOop)entry)->as_C_string();
@@ -486,7 +487,7 @@ diff --git a/src/share/vm/oops/constantP
}
}
-@@ -366,7 +369,7 @@ void constantPoolOopDesc::resolve_string
+@@ -366,7 +369,7 @@
}
}
@@ -495,7 +496,7 @@ diff --git a/src/share/vm/oops/constantP
oop entry = *(this_oop->obj_at_addr(which));
if (entry->is_symbol()) {
ObjectLocker ol(this_oop, THREAD);
-@@ -380,8 +383,21 @@ oop constantPoolOopDesc::string_at_impl(
+@@ -380,8 +383,21 @@
entry = this_oop->resolved_string_at(which);
}
}
@@ -521,7 +522,7 @@ diff --git a/src/share/vm/oops/constantP
diff --git a/src/share/vm/oops/constantPoolOop.hpp b/src/share/vm/oops/constantPoolOop.hpp
--- a/src/share/vm/oops/constantPoolOop.hpp
+++ b/src/share/vm/oops/constantPoolOop.hpp
-@@ -269,7 +269,14 @@ class constantPoolOopDesc : public oopDe
+@@ -269,7 +269,14 @@
oop string_at(int which, TRAPS) {
constantPoolHandle h_this(THREAD, this);
@@ -537,7 +538,7 @@ diff --git a/src/share/vm/oops/constantP
}
// only called when we are sure a string entry is already resolved (via an
-@@ -293,6 +300,7 @@ class constantPoolOopDesc : public oopDe
+@@ -293,6 +300,7 @@
// UTF8 char* representation was chosen to avoid conversion of
// java_lang_Strings at resolved entries into symbolOops
// or vice versa.
@@ -545,7 +546,7 @@ diff --git a/src/share/vm/oops/constantP
char* string_at_noresolve(int which);
jint name_and_type_at(int which) {
-@@ -404,7 +412,7 @@ class constantPoolOopDesc : public oopDe
+@@ -404,7 +412,7 @@
// Implementation of methods that needs an exposed 'this' pointer, in order to
// handle GC while executing the method
static klassOop klass_at_impl(constantPoolHandle this_oop, int which, TRAPS);
@@ -557,7 +558,7 @@ diff --git a/src/share/vm/oops/instanceK
diff --git a/src/share/vm/oops/instanceKlass.hpp b/src/share/vm/oops/instanceKlass.hpp
--- a/src/share/vm/oops/instanceKlass.hpp
+++ b/src/share/vm/oops/instanceKlass.hpp
-@@ -147,6 +147,8 @@ class instanceKlass: public Klass {
+@@ -147,6 +147,8 @@
oop _class_loader;
// Protection domain.
oop _protection_domain;
@@ -566,19 +567,19 @@ diff --git a/src/share/vm/oops/instanceK
// Class signers.
objArrayOop _signers;
// Name of source file containing this klass, NULL if not specified.
-@@ -375,6 +377,11 @@ class instanceKlass: public Klass {
+@@ -374,6 +376,11 @@
+ // protection domain
oop protection_domain() { return _protection_domain; }
void set_protection_domain(oop pd) { oop_store((oop*) &_protection_domain, pd); }
-
++
+ // host class
+ oop host_klass() const { return _host_klass; }
+ void set_host_klass(oop host) { oop_store((oop*) &_host_klass, host); }
+ bool is_anonymous() const { return _host_klass != NULL; }
-+
+
// signers
objArrayOop signers() const { return _signers; }
- void set_signers(objArrayOop s) { oop_store((oop*) &_signers, oop(s)); }
-@@ -701,6 +708,7 @@ private:
+@@ -701,6 +708,7 @@
oop* adr_constants() const { return (oop*)&this->_constants;}
oop* adr_class_loader() const { return (oop*)&this->_class_loader;}
oop* adr_protection_domain() const { return (oop*)&this->_protection_domain;}
@@ -589,7 +590,7 @@ diff --git a/src/share/vm/oops/instanceK
diff --git a/src/share/vm/oops/instanceKlassKlass.cpp b/src/share/vm/oops/instanceKlassKlass.cpp
--- a/src/share/vm/oops/instanceKlassKlass.cpp
+++ b/src/share/vm/oops/instanceKlassKlass.cpp
-@@ -81,6 +81,7 @@ void instanceKlassKlass::oop_follow_cont
+@@ -81,6 +81,7 @@
MarkSweep::mark_and_push(ik->adr_source_debug_extension());
MarkSweep::mark_and_push(ik->adr_inner_classes());
MarkSweep::mark_and_push(ik->adr_protection_domain());
@@ -597,7 +598,7 @@ diff --git a/src/share/vm/oops/instanceK
MarkSweep::mark_and_push(ik->adr_signers());
MarkSweep::mark_and_push(ik->adr_generic_signature());
MarkSweep::mark_and_push(ik->adr_class_annotations());
-@@ -120,6 +121,7 @@ void instanceKlassKlass::oop_follow_cont
+@@ -120,6 +121,7 @@
PSParallelCompact::mark_and_push(cm, ik->adr_source_debug_extension());
PSParallelCompact::mark_and_push(cm, ik->adr_inner_classes());
PSParallelCompact::mark_and_push(cm, ik->adr_protection_domain());
@@ -605,7 +606,7 @@ diff --git a/src/share/vm/oops/instanceK
PSParallelCompact::mark_and_push(cm, ik->adr_signers());
PSParallelCompact::mark_and_push(cm, ik->adr_generic_signature());
PSParallelCompact::mark_and_push(cm, ik->adr_class_annotations());
-@@ -159,6 +161,7 @@ int instanceKlassKlass::oop_oop_iterate(
+@@ -159,6 +161,7 @@
blk->do_oop(ik->adr_constants());
blk->do_oop(ik->adr_class_loader());
blk->do_oop(ik->adr_protection_domain());
@@ -613,16 +614,16 @@ diff --git a/src/share/vm/oops/instanceK
blk->do_oop(ik->adr_signers());
blk->do_oop(ik->adr_source_file_name());
blk->do_oop(ik->adr_source_debug_extension());
-@@ -210,6 +213,8 @@ int instanceKlassKlass::oop_oop_iterate_
- adr = ik->adr_class_loader();
+@@ -211,6 +214,8 @@
if (mr.contains(adr)) blk->do_oop(adr);
adr = ik->adr_protection_domain();
+ if (mr.contains(adr)) blk->do_oop(adr);
++ adr = ik->adr_host_klass();
+ if (mr.contains(adr)) blk->do_oop(adr);
-+ adr = ik->adr_host_klass();
- if (mr.contains(adr)) blk->do_oop(adr);
adr = ik->adr_signers();
if (mr.contains(adr)) blk->do_oop(adr);
-@@ -260,6 +265,7 @@ int instanceKlassKlass::oop_adjust_point
+ adr = ik->adr_source_file_name();
+@@ -260,6 +265,7 @@
MarkSweep::adjust_pointer(ik->adr_constants());
MarkSweep::adjust_pointer(ik->adr_class_loader());
MarkSweep::adjust_pointer(ik->adr_protection_domain());
@@ -630,7 +631,7 @@ diff --git a/src/share/vm/oops/instanceK
MarkSweep::adjust_pointer(ik->adr_signers());
MarkSweep::adjust_pointer(ik->adr_source_file_name());
MarkSweep::adjust_pointer(ik->adr_source_debug_extension());
-@@ -295,6 +301,11 @@ void instanceKlassKlass::oop_copy_conten
+@@ -295,6 +301,11 @@
pm->claim_or_forward_breadth(pd_addr);
}
@@ -642,7 +643,7 @@ diff --git a/src/share/vm/oops/instanceK
oop* sg_addr = ik->adr_signers();
if (PSScavenge::should_scavenge(sg_addr)) {
pm->claim_or_forward_breadth(sg_addr);
-@@ -316,6 +327,11 @@ void instanceKlassKlass::oop_push_conten
+@@ -316,6 +327,11 @@
oop* pd_addr = ik->adr_protection_domain();
if (PSScavenge::should_scavenge(pd_addr)) {
pm->claim_or_forward_depth(pd_addr);
@@ -654,7 +655,7 @@ diff --git a/src/share/vm/oops/instanceK
}
oop* sg_addr = ik->adr_signers();
-@@ -421,6 +437,7 @@ klassOop instanceKlassKlass::allocate_in
+@@ -421,6 +437,7 @@
ik->set_constants(NULL);
ik->set_class_loader(NULL);
ik->set_protection_domain(NULL);
@@ -662,7 +663,7 @@ diff --git a/src/share/vm/oops/instanceK
ik->set_signers(NULL);
ik->set_source_file_name(NULL);
ik->set_source_debug_extension(NULL);
-@@ -526,6 +543,7 @@ void instanceKlassKlass::oop_print_on(oo
+@@ -526,6 +543,7 @@
st->print(" - constants: "); ik->constants()->print_value_on(st); st->cr();
st->print(" - class loader: "); ik->class_loader()->print_value_on(st); st->cr();
st->print(" - protection domain: "); ik->protection_domain()->print_value_on(st); st->cr();
@@ -670,7 +671,7 @@ diff --git a/src/share/vm/oops/instanceK
st->print(" - signers: "); ik->signers()->print_value_on(st); st->cr();
if (ik->source_file_name() != NULL) {
st->print(" - source file: ");
-@@ -626,7 +644,7 @@ void instanceKlassKlass::oop_verify_on(o
+@@ -626,7 +644,7 @@
ik->_verify_count = Universe::verify_count();
#endif
// Verify that klass is present in SystemDictionary
@@ -679,7 +680,7 @@ diff --git a/src/share/vm/oops/instanceK
symbolHandle h_name (thread, ik->name());
Handle h_loader (thread, ik->class_loader());
Handle h_obj(thread, obj);
-@@ -764,6 +782,9 @@ void instanceKlassKlass::oop_verify_on(o
+@@ -764,6 +782,9 @@
if (ik->protection_domain() != NULL) {
guarantee(ik->protection_domain()->is_oop(), "should be oop");
}
@@ -692,7 +693,7 @@ diff --git a/src/share/vm/oops/klass.cpp
diff --git a/src/share/vm/oops/klass.cpp b/src/share/vm/oops/klass.cpp
--- a/src/share/vm/oops/klass.cpp
+++ b/src/share/vm/oops/klass.cpp
-@@ -478,6 +478,23 @@ void Klass::with_array_klasses_do(void f
+@@ -478,6 +478,23 @@
const char* Klass::external_name() const {
@@ -719,7 +720,7 @@ diff --git a/src/share/vm/prims/jvm.cpp
diff --git a/src/share/vm/prims/jvm.cpp b/src/share/vm/prims/jvm.cpp
--- a/src/share/vm/prims/jvm.cpp
+++ b/src/share/vm/prims/jvm.cpp
-@@ -708,6 +708,7 @@ static void is_lock_held_by_thread(Handl
+@@ -732,6 +732,7 @@
// common code for JVM_DefineClass() and JVM_DefineClassWithSource()
static jclass jvm_define_class_common(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd, const char *source, TRAPS) {
@@ -727,7 +728,7 @@ diff --git a/src/share/vm/prims/jvm.cpp
// Since exceptions can be thrown, class initialization can take place
// if name is NULL no check for class name in .class stream has to be made.
-@@ -746,7 +747,7 @@ JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv
+@@ -770,7 +771,7 @@
JVM_ENTRY(jclass, JVM_DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize len, jobject pd))
JVMWrapper2("JVM_DefineClass %s", name);
@@ -739,7 +740,7 @@ diff --git a/src/share/vm/prims/jvm.h b/
diff --git a/src/share/vm/prims/jvm.h b/src/share/vm/prims/jvm.h
--- a/src/share/vm/prims/jvm.h
+++ b/src/share/vm/prims/jvm.h
-@@ -410,6 +410,14 @@ JVM_DefineClassWithSource(JNIEnv *env, c
+@@ -421,6 +421,14 @@
JVM_DefineClassWithSource(JNIEnv *env, const char *name, jobject loader,
const jbyte *buf, jsize len, jobject pd,
const char *source);
@@ -757,25 +758,46 @@ diff --git a/src/share/vm/prims/unsafe.c
diff --git a/src/share/vm/prims/unsafe.cpp b/src/share/vm/prims/unsafe.cpp
--- a/src/share/vm/prims/unsafe.cpp
+++ b/src/share/vm/prims/unsafe.cpp
-@@ -837,6 +837,74 @@ UNSAFE_ENTRY(jclass, Unsafe_DefineClass1
+@@ -837,6 +837,120 @@
}
UNSAFE_END
-+#define DAC_Args CLS ADR"I["OBJ
++#define DAC_Args CLS"[B["OBJ
+// define a class but do not make it known to the class loader or system dictionary
+// - host_class: supplies context for linkage, access control, protection domain, and class loader
+// - data: bytes of a class file, a raw memory address (length gives the number of bytes)
+// - cp_patches: where non-null entries exist, they replace corresponding CP entries in data
-+UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jlong data, jint length, jobjectArray cp_patches_jh))
-+{
-+ UnsafeWrapper("Unsafe_DefineAnonymousClass");
-+ ResourceMark rm(THREAD);
++
++static oop
++Unsafe_DefineAnonymousClass_impl(JNIEnv *env,
++ jclass host_class, jbyteArray data, jobjectArray cp_patches_jh,
++ HeapWord* *temp_alloc,
++ TRAPS) {
+
+ if (UsePerfData) {
+ ClassLoader::unsafe_defineClassCallCounter()->inc();
+ }
+
-+ u1* class_bytes = (u1*) data;
++ if (data == NULL) {
++ THROW_0(vmSymbols::java_lang_NullPointerException());
++ }
++
++ jint length = typeArrayOop(JNIHandles::resolve_non_null(data))->length();
++ jint word_length = (length + sizeof(HeapWord)-1) / sizeof(HeapWord);
++ HeapWord* body = NEW_C_HEAP_ARRAY(HeapWord, word_length);
++ if (body == NULL) {
++ THROW_0(vmSymbols::java_lang_OutOfMemoryError());
++ }
++
++ // caller responsible to free it:
++ (*temp_alloc) = body;
++
++ {
++ jbyte* array_base = typeArrayOop(JNIHandles::resolve_non_null(data))->byte_at_addr(0);
++ Copy::conjoint_words((HeapWord*) array_base, body, word_length);
++ }
++
++ u1* class_bytes = (u1*) body;
+ int class_bytes_length = (int) length;
+ if (class_bytes_length < 0) class_bytes_length = 0;
+ if (class_bytes == NULL
@@ -825,14 +847,39 @@ diff --git a/src/share/vm/prims/unsafe.c
+
+ // let caller initialize it as needed...
+
-+ return (jclass) JNIHandles::make_local(env, anon_klass->java_mirror());
++ return anon_klass->java_mirror();
++}
++
++UNSAFE_ENTRY(jclass, Unsafe_DefineAnonymousClass(JNIEnv *env, jobject unsafe, jclass host_class, jbyteArray data, jobjectArray cp_patches_jh))
++{
++ UnsafeWrapper("Unsafe_DefineAnonymousClass");
++ ResourceMark rm(THREAD);
++
++ HeapWord* temp_alloc = NULL;
++
++ jobject res_jh = NULL;
++
++ { oop res_oop = Unsafe_DefineAnonymousClass_impl(env,
++ host_class, data, cp_patches_jh,
++ &temp_alloc, THREAD);
++ if (res_oop != NULL)
++ res_jh = JNIHandles::make_local(env, res_oop);
++ }
++
++ // try/finally clause:
++ if (temp_alloc != NULL) {
++ FREE_C_HEAP_ARRAY(HeapWord, temp_alloc);
++ }
++
++ return (jclass) res_jh;
+}
+UNSAFE_END
+
++
UNSAFE_ENTRY(void, Unsafe_MonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
UnsafeWrapper("Unsafe_MonitorEnter");
-@@ -1291,6 +1359,9 @@ JNINativeMethod memcopy_methods_15[] = {
+@@ -1291,6 +1405,9 @@
{CC"copyMemory", CC"("ADR ADR"J)V", FN_PTR(Unsafe_CopyMemory)}
};
@@ -842,7 +889,7 @@ diff --git a/src/share/vm/prims/unsafe.c
#undef CC
#undef FN_PTR
-@@ -1353,6 +1424,15 @@ JVM_ENTRY(void, JVM_RegisterUnsafeMethod
+@@ -1353,6 +1470,15 @@
}
}
}
@@ -861,7 +908,7 @@ diff --git a/src/share/vm/runtime/reflec
diff --git a/src/share/vm/runtime/reflection.cpp b/src/share/vm/runtime/reflection.cpp
--- a/src/share/vm/runtime/reflection.cpp
+++ b/src/share/vm/runtime/reflection.cpp
-@@ -456,10 +456,26 @@ bool Reflection::verify_class_access(kla
+@@ -456,10 +456,26 @@
return can_relax_access_check_for(current_class, new_class, classloader_only);
}
@@ -891,7 +938,7 @@ diff --git a/src/share/vm/utilities/cons
diff --git a/src/share/vm/utilities/constantTag.hpp b/src/share/vm/utilities/constantTag.hpp
--- a/src/share/vm/utilities/constantTag.hpp
+++ b/src/share/vm/utilities/constantTag.hpp
-@@ -70,7 +70,7 @@ class constantTag VALUE_OBJ_CLASS_SPEC {
+@@ -70,7 +70,7 @@
bool is_unresolved_string() const { return _tag == JVM_CONSTANT_UnresolvedString; }
bool is_string_index() const { return _tag == JVM_CONSTANT_StringIndex; }