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