src/hotspot/share/prims/jvm.cpp
changeset 48297 48ff95f16a16
parent 48027 ddbcfca4d51d
parent 48105 8d15b1369c7a
child 48477 b7af6f568d00
equal deleted inserted replaced
48296:3212e9bc5be7 48297:48ff95f16a16
  3127   }
  3127   }
  3128 JVM_END
  3128 JVM_END
  3129 
  3129 
  3130 // java.lang.SecurityManager ///////////////////////////////////////////////////////////////////////
  3130 // java.lang.SecurityManager ///////////////////////////////////////////////////////////////////////
  3131 
  3131 
  3132 static bool is_trusted_frame(JavaThread* jthread, vframeStream* vfst) {
       
  3133   assert(jthread->is_Java_thread(), "must be a Java thread");
       
  3134   if (jthread->privileged_stack_top() == NULL) return false;
       
  3135   if (jthread->privileged_stack_top()->frame_id() == vfst->frame_id()) {
       
  3136     oop loader = jthread->privileged_stack_top()->class_loader();
       
  3137     if (loader == NULL) return true;
       
  3138     bool trusted = java_lang_ClassLoader::is_trusted_loader(loader);
       
  3139     if (trusted) return true;
       
  3140   }
       
  3141   return false;
       
  3142 }
       
  3143 
       
  3144 JVM_ENTRY(jclass, JVM_CurrentLoadedClass(JNIEnv *env))
       
  3145   JVMWrapper("JVM_CurrentLoadedClass");
       
  3146   ResourceMark rm(THREAD);
       
  3147 
       
  3148   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
       
  3149     // if a method in a class in a trusted loader is in a doPrivileged, return NULL
       
  3150     bool trusted = is_trusted_frame(thread, &vfst);
       
  3151     if (trusted) return NULL;
       
  3152 
       
  3153     Method* m = vfst.method();
       
  3154     if (!m->is_native()) {
       
  3155       InstanceKlass* holder = m->method_holder();
       
  3156       oop loader = holder->class_loader();
       
  3157       if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
       
  3158         return (jclass) JNIHandles::make_local(env, holder->java_mirror());
       
  3159       }
       
  3160     }
       
  3161   }
       
  3162   return NULL;
       
  3163 JVM_END
       
  3164 
       
  3165 
       
  3166 JVM_ENTRY(jobject, JVM_CurrentClassLoader(JNIEnv *env))
       
  3167   JVMWrapper("JVM_CurrentClassLoader");
       
  3168   ResourceMark rm(THREAD);
       
  3169 
       
  3170   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
       
  3171 
       
  3172     // if a method in a class in a trusted loader is in a doPrivileged, return NULL
       
  3173     bool trusted = is_trusted_frame(thread, &vfst);
       
  3174     if (trusted) return NULL;
       
  3175 
       
  3176     Method* m = vfst.method();
       
  3177     if (!m->is_native()) {
       
  3178       InstanceKlass* holder = m->method_holder();
       
  3179       assert(holder->is_klass(), "just checking");
       
  3180       oop loader = holder->class_loader();
       
  3181       if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
       
  3182         return JNIHandles::make_local(env, loader);
       
  3183       }
       
  3184     }
       
  3185   }
       
  3186   return NULL;
       
  3187 JVM_END
       
  3188 
       
  3189 
       
  3190 JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
  3132 JVM_ENTRY(jobjectArray, JVM_GetClassContext(JNIEnv *env))
  3191   JVMWrapper("JVM_GetClassContext");
  3133   JVMWrapper("JVM_GetClassContext");
  3192   ResourceMark rm(THREAD);
  3134   ResourceMark rm(THREAD);
  3193   JvmtiVMObjectAllocEventCollector oam;
  3135   JvmtiVMObjectAllocEventCollector oam;
  3194   vframeStream vfst(thread);
  3136   vframeStream vfst(thread);
  3221   for (int i = 0; i < klass_array->length(); i++) {
  3163   for (int i = 0; i < klass_array->length(); i++) {
  3222     result->obj_at_put(i, klass_array->at(i)->java_mirror());
  3164     result->obj_at_put(i, klass_array->at(i)->java_mirror());
  3223   }
  3165   }
  3224 
  3166 
  3225   return (jobjectArray) JNIHandles::make_local(env, result);
  3167   return (jobjectArray) JNIHandles::make_local(env, result);
  3226 JVM_END
       
  3227 
       
  3228 
       
  3229 JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name))
       
  3230   JVMWrapper("JVM_ClassDepth");
       
  3231   ResourceMark rm(THREAD);
       
  3232   Handle h_name (THREAD, JNIHandles::resolve_non_null(name));
       
  3233   Handle class_name_str = java_lang_String::internalize_classname(h_name, CHECK_0);
       
  3234 
       
  3235   const char* str = java_lang_String::as_utf8_string(class_name_str());
       
  3236   TempNewSymbol class_name_sym = SymbolTable::probe(str, (int)strlen(str));
       
  3237   if (class_name_sym == NULL) {
       
  3238     return -1;
       
  3239   }
       
  3240 
       
  3241   int depth = 0;
       
  3242 
       
  3243   for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
       
  3244     if (!vfst.method()->is_native()) {
       
  3245       InstanceKlass* holder = vfst.method()->method_holder();
       
  3246       assert(holder->is_klass(), "just checking");
       
  3247       if (holder->name() == class_name_sym) {
       
  3248         return depth;
       
  3249       }
       
  3250       depth++;
       
  3251     }
       
  3252   }
       
  3253   return -1;
       
  3254 JVM_END
       
  3255 
       
  3256 
       
  3257 JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env))
       
  3258   JVMWrapper("JVM_ClassLoaderDepth");
       
  3259   ResourceMark rm(THREAD);
       
  3260   int depth = 0;
       
  3261   for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) {
       
  3262     // if a method in a class in a trusted loader is in a doPrivileged, return -1
       
  3263     bool trusted = is_trusted_frame(thread, &vfst);
       
  3264     if (trusted) return -1;
       
  3265 
       
  3266     Method* m = vfst.method();
       
  3267     if (!m->is_native()) {
       
  3268       InstanceKlass* holder = m->method_holder();
       
  3269       assert(holder->is_klass(), "just checking");
       
  3270       oop loader = holder->class_loader();
       
  3271       if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) {
       
  3272         return depth;
       
  3273       }
       
  3274       depth++;
       
  3275     }
       
  3276   }
       
  3277   return -1;
       
  3278 JVM_END
  3168 JVM_END
  3279 
  3169 
  3280 
  3170 
  3281 // java.lang.Package ////////////////////////////////////////////////////////////////
  3171 // java.lang.Package ////////////////////////////////////////////////////////////////
  3282 
  3172