< prev index next >

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Print this page




 419 
 420 C2V_VMENTRY(jobject, lookupType, (JNIEnv*, jobject, jstring jname, jclass accessing_class, jboolean resolve))
 421   ResourceMark rm;
 422   Handle name(THREAD, JNIHandles::resolve(jname));
 423   Symbol* class_name = java_lang_String::as_symbol(name(), CHECK_0);
 424   if (java_lang_String::length(name()) <= 1) {
 425     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Primitive type %s should be handled in Java code", class_name->as_C_string()));
 426   }
 427 
 428   JVMCIKlassHandle resolved_klass(THREAD);
 429   if (JNIHandles::resolve(accessing_class) == NULL) {
 430     THROW_0(vmSymbols::java_lang_NullPointerException());
 431   }
 432   Klass* accessing_klass = java_lang_Class::as_Klass(JNIHandles::resolve(accessing_class));
 433   Handle class_loader(THREAD, accessing_klass->class_loader());
 434   Handle protection_domain(THREAD, accessing_klass->protection_domain());
 435 
 436   if (resolve) {
 437     resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0);
 438   } else {
 439     if (class_name->char_at(0) == 'L' &&
 440       class_name->char_at(class_name->utf8_length()-1) == ';') {
 441       // This is a name from a signature.  Strip off the trimmings.
 442       // Call recursive to keep scope of strippedsym.
 443       TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1,
 444                                                           class_name->utf8_length()-2,
 445                                                           CHECK_0);
 446       resolved_klass = SystemDictionary::find(strippedsym, class_loader, protection_domain, CHECK_0);
 447     } else if (FieldType::is_array(class_name)) {
 448       FieldArrayInfo fd;
 449       // dimension and object_key in FieldArrayInfo are assigned as a side-effect
 450       // of this call
 451       BasicType t = FieldType::get_array_info(class_name, fd, CHECK_0);
 452       if (t == T_OBJECT) {
 453         TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1+fd.dimension(),
 454                                                             class_name->utf8_length()-2-fd.dimension(),
 455                                                             CHECK_0);
 456         // naked oop "k" is OK here -- we assign back into it
 457         resolved_klass = SystemDictionary::find(strippedsym,
 458                                                              class_loader,
 459                                                              protection_domain,


 862 C2V_VMENTRY(jobject, executeInstalledCode, (JNIEnv*, jobject, jobject args, jobject hotspotInstalledCode))
 863   ResourceMark rm;
 864   HandleMark hm;
 865 
 866   jlong nmethodValue = InstalledCode::address(hotspotInstalledCode);
 867   if (nmethodValue == 0L) {
 868     THROW_NULL(vmSymbols::jdk_vm_ci_code_InvalidInstalledCodeException());
 869   }
 870   nmethod* nm = (nmethod*) (address) nmethodValue;
 871   methodHandle mh = nm->method();
 872   Symbol* signature = mh->signature();
 873   JavaCallArguments jca(mh->size_of_parameters());
 874 
 875   JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
 876   JavaValue result(jap.get_ret_type());
 877   jca.set_alternative_target(nm);
 878   JavaCalls::call(&result, mh, &jca, CHECK_NULL);
 879 
 880   if (jap.get_ret_type() == T_VOID) {
 881     return NULL;
 882   } else if (jap.get_ret_type() == T_OBJECT || jap.get_ret_type() == T_ARRAY) {

 883     return JNIHandles::make_local(THREAD, (oop) result.get_jobject());
 884   } else {
 885     jvalue *value = (jvalue *) result.get_value_addr();
 886     // Narrow the value down if required (Important on big endian machines)
 887     switch (jap.get_ret_type()) {
 888       case T_BOOLEAN:
 889        value->z = (jboolean) value->i;
 890        break;
 891       case T_BYTE:
 892        value->b = (jbyte) value->i;
 893        break;
 894       case T_CHAR:
 895        value->c = (jchar) value->i;
 896        break;
 897       case T_SHORT:
 898        value->s = (jshort) value->i;
 899        break;
 900       default:
 901         break;
 902     }


1066           if (initialSkip > 0) {
1067             initialSkip--;
1068           } else {
1069             ScopeDesc* scope = cvf->scope();
1070             // native wrappers do not have a scope
1071             if (scope != NULL && scope->objects() != NULL) {
1072               GrowableArray<ScopeValue*>* objects;
1073               if (!realloc_called) {
1074                 objects = scope->objects();
1075               } else {
1076                 // some object might already have been re-allocated, only reallocate the non-allocated ones
1077                 objects = new GrowableArray<ScopeValue*>(scope->objects()->length());
1078                 for (int i = 0; i < scope->objects()->length(); i++) {
1079                   ObjectValue* sv = (ObjectValue*) scope->objects()->at(i);
1080                   if (sv->value().is_null()) {
1081                     objects->append(sv);
1082                   }
1083                 }
1084               }
1085               bool realloc_failures = Deoptimization::realloc_objects(thread, fst.current(), objects, CHECK_NULL);
1086               Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, realloc_failures, false);
1087               realloc_called = true;
1088 
1089               GrowableArray<ScopeValue*>* local_values = scope->locals();
1090               assert(local_values != NULL, "NULL locals");
1091               typeArrayOop array_oop = oopFactory::new_boolArray(local_values->length(), CHECK_NULL);
1092               typeArrayHandle array(THREAD, array_oop);
1093               for (int i = 0; i < local_values->length(); i++) {
1094                 ScopeValue* value = local_values->at(i);
1095                 if (value->is_object()) {
1096                   array->bool_at_put(i, true);
1097                 }
1098               }
1099               HotSpotStackFrameReference::set_localIsVirtual(frame_reference, array());
1100             } else {
1101               HotSpotStackFrameReference::set_localIsVirtual(frame_reference, NULL);
1102             }
1103 
1104             locals = cvf->locals();
1105             HotSpotStackFrameReference::set_bci(frame_reference, cvf->bci());
1106             oop method = CompilerToVM::get_jvmci_method(cvf->method(), CHECK_NULL);


1323       break;
1324     }
1325     vf = vf->sender();
1326   }
1327 
1328   int last_frame_number = HotSpotStackFrameReference::frameNumber(hs_frame);
1329   if (last_frame_number >= virtualFrames->length()) {
1330     THROW_MSG(vmSymbols::java_lang_IllegalStateException(), "invalid frame number")
1331   }
1332 
1333   // Reallocate the non-escaping objects and restore their fields.
1334   assert (virtualFrames->at(last_frame_number)->scope() != NULL,"invalid scope");
1335   GrowableArray<ScopeValue*>* objects = virtualFrames->at(last_frame_number)->scope()->objects();
1336 
1337   if (objects == NULL) {
1338     // no objects to materialize
1339     return;
1340   }
1341 
1342   bool realloc_failures = Deoptimization::realloc_objects(thread, fstAfterDeopt.current(), objects, CHECK);
1343   Deoptimization::reassign_fields(fstAfterDeopt.current(), fstAfterDeopt.register_map(), objects, realloc_failures, false);
1344 
1345   for (int frame_index = 0; frame_index < virtualFrames->length(); frame_index++) {
1346     compiledVFrame* cvf = virtualFrames->at(frame_index);
1347 
1348     GrowableArray<ScopeValue*>* scopeLocals = cvf->scope()->locals();
1349     StackValueCollection* locals = cvf->locals();
1350     if (locals != NULL) {
1351       for (int i2 = 0; i2 < locals->size(); i2++) {
1352         StackValue* var = locals->at(i2);
1353         if (var->type() == T_OBJECT && scopeLocals->at(i2)->is_object()) {
1354           jvalue val;
1355           val.l = (jobject) locals->at(i2)->get_obj()();
1356           cvf->update_local(T_OBJECT, i2, val);
1357         }
1358       }
1359     }
1360 
1361     GrowableArray<ScopeValue*>* scopeExpressions = cvf->scope()->expressions();
1362     StackValueCollection* expressions = cvf->expressions();
1363     if (expressions != NULL) {




 419 
 420 C2V_VMENTRY(jobject, lookupType, (JNIEnv*, jobject, jstring jname, jclass accessing_class, jboolean resolve))
 421   ResourceMark rm;
 422   Handle name(THREAD, JNIHandles::resolve(jname));
 423   Symbol* class_name = java_lang_String::as_symbol(name(), CHECK_0);
 424   if (java_lang_String::length(name()) <= 1) {
 425     THROW_MSG_0(vmSymbols::java_lang_InternalError(), err_msg("Primitive type %s should be handled in Java code", class_name->as_C_string()));
 426   }
 427 
 428   JVMCIKlassHandle resolved_klass(THREAD);
 429   if (JNIHandles::resolve(accessing_class) == NULL) {
 430     THROW_0(vmSymbols::java_lang_NullPointerException());
 431   }
 432   Klass* accessing_klass = java_lang_Class::as_Klass(JNIHandles::resolve(accessing_class));
 433   Handle class_loader(THREAD, accessing_klass->class_loader());
 434   Handle protection_domain(THREAD, accessing_klass->protection_domain());
 435 
 436   if (resolve) {
 437     resolved_klass = SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK_0);
 438   } else {
 439     if ((class_name->char_at(0) == 'L' || class_name->char_at(0) == 'Q' ) &&
 440       class_name->char_at(class_name->utf8_length()-1) == ';') {
 441       // This is a name from a signature.  Strip off the trimmings.
 442       // Call recursive to keep scope of strippedsym.
 443       TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1,
 444                                                           class_name->utf8_length()-2,
 445                                                           CHECK_0);
 446       resolved_klass = SystemDictionary::find(strippedsym, class_loader, protection_domain, CHECK_0);
 447     } else if (FieldType::is_array(class_name)) {
 448       FieldArrayInfo fd;
 449       // dimension and object_key in FieldArrayInfo are assigned as a side-effect
 450       // of this call
 451       BasicType t = FieldType::get_array_info(class_name, fd, CHECK_0);
 452       if (t == T_OBJECT) {
 453         TempNewSymbol strippedsym = SymbolTable::new_symbol(class_name->as_utf8()+1+fd.dimension(),
 454                                                             class_name->utf8_length()-2-fd.dimension(),
 455                                                             CHECK_0);
 456         // naked oop "k" is OK here -- we assign back into it
 457         resolved_klass = SystemDictionary::find(strippedsym,
 458                                                              class_loader,
 459                                                              protection_domain,


 862 C2V_VMENTRY(jobject, executeInstalledCode, (JNIEnv*, jobject, jobject args, jobject hotspotInstalledCode))
 863   ResourceMark rm;
 864   HandleMark hm;
 865 
 866   jlong nmethodValue = InstalledCode::address(hotspotInstalledCode);
 867   if (nmethodValue == 0L) {
 868     THROW_NULL(vmSymbols::jdk_vm_ci_code_InvalidInstalledCodeException());
 869   }
 870   nmethod* nm = (nmethod*) (address) nmethodValue;
 871   methodHandle mh = nm->method();
 872   Symbol* signature = mh->signature();
 873   JavaCallArguments jca(mh->size_of_parameters());
 874 
 875   JavaArgumentUnboxer jap(signature, &jca, (arrayOop) JNIHandles::resolve(args), mh->is_static());
 876   JavaValue result(jap.get_ret_type());
 877   jca.set_alternative_target(nm);
 878   JavaCalls::call(&result, mh, &jca, CHECK_NULL);
 879 
 880   if (jap.get_ret_type() == T_VOID) {
 881     return NULL;
 882   } else if (jap.get_ret_type() == T_OBJECT || jap.get_ret_type() == T_ARRAY
 883              || jap.get_ret_type() == T_VALUETYPE) {
 884     return JNIHandles::make_local(THREAD, (oop) result.get_jobject());
 885   } else {
 886     jvalue *value = (jvalue *) result.get_value_addr();
 887     // Narrow the value down if required (Important on big endian machines)
 888     switch (jap.get_ret_type()) {
 889       case T_BOOLEAN:
 890        value->z = (jboolean) value->i;
 891        break;
 892       case T_BYTE:
 893        value->b = (jbyte) value->i;
 894        break;
 895       case T_CHAR:
 896        value->c = (jchar) value->i;
 897        break;
 898       case T_SHORT:
 899        value->s = (jshort) value->i;
 900        break;
 901       default:
 902         break;
 903     }


1067           if (initialSkip > 0) {
1068             initialSkip--;
1069           } else {
1070             ScopeDesc* scope = cvf->scope();
1071             // native wrappers do not have a scope
1072             if (scope != NULL && scope->objects() != NULL) {
1073               GrowableArray<ScopeValue*>* objects;
1074               if (!realloc_called) {
1075                 objects = scope->objects();
1076               } else {
1077                 // some object might already have been re-allocated, only reallocate the non-allocated ones
1078                 objects = new GrowableArray<ScopeValue*>(scope->objects()->length());
1079                 for (int i = 0; i < scope->objects()->length(); i++) {
1080                   ObjectValue* sv = (ObjectValue*) scope->objects()->at(i);
1081                   if (sv->value().is_null()) {
1082                     objects->append(sv);
1083                   }
1084                 }
1085               }
1086               bool realloc_failures = Deoptimization::realloc_objects(thread, fst.current(), objects, CHECK_NULL);
1087               Deoptimization::reassign_fields(fst.current(), fst.register_map(), objects, realloc_failures, false, CHECK_NULL);
1088               realloc_called = true;
1089 
1090               GrowableArray<ScopeValue*>* local_values = scope->locals();
1091               assert(local_values != NULL, "NULL locals");
1092               typeArrayOop array_oop = oopFactory::new_boolArray(local_values->length(), CHECK_NULL);
1093               typeArrayHandle array(THREAD, array_oop);
1094               for (int i = 0; i < local_values->length(); i++) {
1095                 ScopeValue* value = local_values->at(i);
1096                 if (value->is_object()) {
1097                   array->bool_at_put(i, true);
1098                 }
1099               }
1100               HotSpotStackFrameReference::set_localIsVirtual(frame_reference, array());
1101             } else {
1102               HotSpotStackFrameReference::set_localIsVirtual(frame_reference, NULL);
1103             }
1104 
1105             locals = cvf->locals();
1106             HotSpotStackFrameReference::set_bci(frame_reference, cvf->bci());
1107             oop method = CompilerToVM::get_jvmci_method(cvf->method(), CHECK_NULL);


1324       break;
1325     }
1326     vf = vf->sender();
1327   }
1328 
1329   int last_frame_number = HotSpotStackFrameReference::frameNumber(hs_frame);
1330   if (last_frame_number >= virtualFrames->length()) {
1331     THROW_MSG(vmSymbols::java_lang_IllegalStateException(), "invalid frame number")
1332   }
1333 
1334   // Reallocate the non-escaping objects and restore their fields.
1335   assert (virtualFrames->at(last_frame_number)->scope() != NULL,"invalid scope");
1336   GrowableArray<ScopeValue*>* objects = virtualFrames->at(last_frame_number)->scope()->objects();
1337 
1338   if (objects == NULL) {
1339     // no objects to materialize
1340     return;
1341   }
1342 
1343   bool realloc_failures = Deoptimization::realloc_objects(thread, fstAfterDeopt.current(), objects, CHECK);
1344   Deoptimization::reassign_fields(fstAfterDeopt.current(), fstAfterDeopt.register_map(), objects, realloc_failures, false, THREAD);
1345 
1346   for (int frame_index = 0; frame_index < virtualFrames->length(); frame_index++) {
1347     compiledVFrame* cvf = virtualFrames->at(frame_index);
1348 
1349     GrowableArray<ScopeValue*>* scopeLocals = cvf->scope()->locals();
1350     StackValueCollection* locals = cvf->locals();
1351     if (locals != NULL) {
1352       for (int i2 = 0; i2 < locals->size(); i2++) {
1353         StackValue* var = locals->at(i2);
1354         if (var->type() == T_OBJECT && scopeLocals->at(i2)->is_object()) {
1355           jvalue val;
1356           val.l = (jobject) locals->at(i2)->get_obj()();
1357           cvf->update_local(T_OBJECT, i2, val);
1358         }
1359       }
1360     }
1361 
1362     GrowableArray<ScopeValue*>* scopeExpressions = cvf->scope()->expressions();
1363     StackValueCollection* expressions = cvf->expressions();
1364     if (expressions != NULL) {


< prev index next >