889 ThreadToNativeFromVM ttnfv(thread); |
889 ThreadToNativeFromVM ttnfv(thread); |
890 return Unsafe_DefineClass_impl(env, name, data, offset, length, loader, pd); |
890 return Unsafe_DefineClass_impl(env, name, data, offset, length, loader, pd); |
891 } |
891 } |
892 UNSAFE_END |
892 UNSAFE_END |
893 |
893 |
|
894 static jobject get_class_loader(JNIEnv* env, jclass cls) { |
|
895 if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(cls))) { |
|
896 return NULL; |
|
897 } |
|
898 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(cls)); |
|
899 oop loader = k->class_loader(); |
|
900 return JNIHandles::make_local(env, loader); |
|
901 } |
894 |
902 |
895 UNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length)) |
903 UNSAFE_ENTRY(jclass, Unsafe_DefineClass0(JNIEnv *env, jobject unsafe, jstring name, jbyteArray data, int offset, int length)) |
896 UnsafeWrapper("Unsafe_DefineClass"); |
904 UnsafeWrapper("Unsafe_DefineClass"); |
897 { |
905 { |
898 ThreadToNativeFromVM ttnfv(thread); |
906 ThreadToNativeFromVM ttnfv(thread); |
899 |
907 |
900 int depthFromDefineClass0 = 1; |
908 int depthFromDefineClass0 = 1; |
901 jclass caller = JVM_GetCallerClass(env, depthFromDefineClass0); |
909 jclass caller = JVM_GetCallerClass(env, depthFromDefineClass0); |
902 jobject loader = (caller == NULL) ? NULL : JVM_GetClassLoader(env, caller); |
910 jobject loader = (caller == NULL) ? NULL : get_class_loader(env, caller); |
903 jobject pd = (caller == NULL) ? NULL : JVM_GetProtectionDomain(env, caller); |
911 jobject pd = (caller == NULL) ? NULL : JVM_GetProtectionDomain(env, caller); |
904 |
912 |
905 return Unsafe_DefineClass_impl(env, name, data, offset, length, loader, pd); |
913 return Unsafe_DefineClass_impl(env, name, data, offset, length, loader, pd); |
906 } |
914 } |
907 UNSAFE_END |
915 UNSAFE_END |