hotspot/src/share/vm/prims/methodHandles.cpp
changeset 30310 522ea430079f
parent 30289 10b7b61d759a
parent 30296 95baefac8485
child 30615 4713e7c7b96f
equal deleted inserted replaced
30294:e16e14bd116a 30310:522ea430079f
   938 
   938 
   939   // return number of elements we at leasted wanted to initialize
   939   // return number of elements we at leasted wanted to initialize
   940   return rfill + overflow;
   940   return rfill + overflow;
   941 }
   941 }
   942 
   942 
       
   943 // Get context class for a CallSite instance: either extract existing context or use default one.
       
   944 InstanceKlass* MethodHandles::get_call_site_context(oop call_site) {
       
   945   // In order to extract a context the following traversal is performed:
       
   946   //   CallSite.context => Cleaner.referent => Class._klass => Klass
       
   947   assert(java_lang_invoke_CallSite::is_instance(call_site), "");
       
   948   oop context_oop = java_lang_invoke_CallSite::context_volatile(call_site);
       
   949   if (oopDesc::is_null(context_oop)) {
       
   950     return NULL; // The context hasn't been initialized yet.
       
   951   }
       
   952   oop context_class_oop = java_lang_ref_Reference::referent(context_oop);
       
   953   if (oopDesc::is_null(context_class_oop)) {
       
   954     // The context reference was cleared by GC, so current dependency context
       
   955     // isn't usable anymore. Context should be fetched from CallSite again.
       
   956     return NULL;
       
   957   }
       
   958   return InstanceKlass::cast(java_lang_Class::as_Klass(context_class_oop));
       
   959 }
       
   960 
   943 //------------------------------------------------------------------------------
   961 //------------------------------------------------------------------------------
   944 // MemberNameTable
   962 // MemberNameTable
   945 //
   963 //
   946 
   964 
   947 MemberNameTable::MemberNameTable(int methods_cnt)
   965 MemberNameTable::MemberNameTable(int methods_cnt)
  1250 }
  1268 }
  1251 JVM_END
  1269 JVM_END
  1252 
  1270 
  1253 JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) {
  1271 JVM_ENTRY(void, MHN_setCallSiteTargetNormal(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) {
  1254   Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
  1272   Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
  1255   Handle target   (THREAD, JNIHandles::resolve(target_jh));
  1273   Handle target   (THREAD, JNIHandles::resolve_non_null(target_jh));
  1256   {
  1274   {
  1257     // Walk all nmethods depending on this call site.
  1275     // Walk all nmethods depending on this call site.
  1258     MutexLocker mu(Compile_lock, thread);
  1276     MutexLocker mu(Compile_lock, thread);
  1259     CodeCache::flush_dependents_on(call_site, target);
  1277     CodeCache::flush_dependents_on(call_site, target);
  1260     java_lang_invoke_CallSite::set_target(call_site(), target());
  1278     java_lang_invoke_CallSite::set_target(call_site(), target());
  1262 }
  1280 }
  1263 JVM_END
  1281 JVM_END
  1264 
  1282 
  1265 JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) {
  1283 JVM_ENTRY(void, MHN_setCallSiteTargetVolatile(JNIEnv* env, jobject igcls, jobject call_site_jh, jobject target_jh)) {
  1266   Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
  1284   Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
  1267   Handle target   (THREAD, JNIHandles::resolve(target_jh));
  1285   Handle target   (THREAD, JNIHandles::resolve_non_null(target_jh));
  1268   {
  1286   {
  1269     // Walk all nmethods depending on this call site.
  1287     // Walk all nmethods depending on this call site.
  1270     MutexLocker mu(Compile_lock, thread);
  1288     MutexLocker mu(Compile_lock, thread);
  1271     CodeCache::flush_dependents_on(call_site, target);
  1289     CodeCache::flush_dependents_on(call_site, target);
  1272     java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
  1290     java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
       
  1291   }
       
  1292 }
       
  1293 JVM_END
       
  1294 
       
  1295 JVM_ENTRY(void, MHN_invalidateDependentNMethods(JNIEnv* env, jobject igcls, jobject call_site_jh)) {
       
  1296   Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
       
  1297   {
       
  1298     // Walk all nmethods depending on this call site.
       
  1299     MutexLocker mu1(Compile_lock, thread);
       
  1300 
       
  1301     CallSiteDepChange changes(call_site(), Handle());
       
  1302 
       
  1303     InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site());
       
  1304     if (ctxk == NULL) {
       
  1305       return; // No dependencies to invalidate yet.
       
  1306     }
       
  1307     int marked = 0;
       
  1308     {
       
  1309       MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
       
  1310       marked = ctxk->mark_dependent_nmethods(changes);
       
  1311     }
       
  1312     java_lang_invoke_CallSite::set_context_volatile(call_site(), NULL); // Reset call site to initial state
       
  1313     if (marked > 0) {
       
  1314       // At least one nmethod has been marked for deoptimization
       
  1315       VM_Deoptimize op;
       
  1316       VMThread::execute(&op);
       
  1317     }
  1273   }
  1318   }
  1274 }
  1319 }
  1275 JVM_END
  1320 JVM_END
  1276 
  1321 
  1277 /**
  1322 /**
  1325   //          int matchFlags, Class<?> caller, int skip, MemberName[] results);
  1370   //          int matchFlags, Class<?> caller, int skip, MemberName[] results);
  1326   {CC"getMembers",                CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)},
  1371   {CC"getMembers",                CC"("CLS""STRG""STRG"I"CLS"I["MEM")I", FN_PTR(MHN_getMembers)},
  1327   {CC"objectFieldOffset",         CC"("MEM")J",                          FN_PTR(MHN_objectFieldOffset)},
  1372   {CC"objectFieldOffset",         CC"("MEM")J",                          FN_PTR(MHN_objectFieldOffset)},
  1328   {CC"setCallSiteTargetNormal",   CC"("CS""MH")V",                       FN_PTR(MHN_setCallSiteTargetNormal)},
  1373   {CC"setCallSiteTargetNormal",   CC"("CS""MH")V",                       FN_PTR(MHN_setCallSiteTargetNormal)},
  1329   {CC"setCallSiteTargetVolatile", CC"("CS""MH")V",                       FN_PTR(MHN_setCallSiteTargetVolatile)},
  1374   {CC"setCallSiteTargetVolatile", CC"("CS""MH")V",                       FN_PTR(MHN_setCallSiteTargetVolatile)},
       
  1375   {CC"invalidateDependentNMethods", CC"("CS")V",                         FN_PTR(MHN_invalidateDependentNMethods)},
  1330   {CC"staticFieldOffset",         CC"("MEM")J",                          FN_PTR(MHN_staticFieldOffset)},
  1376   {CC"staticFieldOffset",         CC"("MEM")J",                          FN_PTR(MHN_staticFieldOffset)},
  1331   {CC"staticFieldBase",           CC"("MEM")"OBJ,                        FN_PTR(MHN_staticFieldBase)},
  1377   {CC"staticFieldBase",           CC"("MEM")"OBJ,                        FN_PTR(MHN_staticFieldBase)},
  1332   {CC"getMemberVMInfo",           CC"("MEM")"OBJ,                        FN_PTR(MHN_getMemberVMInfo)}
  1378   {CC"getMemberVMInfo",           CC"("MEM")"OBJ,                        FN_PTR(MHN_getMemberVMInfo)}
  1333 };
  1379 };
  1334 
  1380