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) {
|