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,
460 CHECK_0);
1496 bytecode_frame = BytecodePosition::caller(bytecode_frame);
1497 }
1498 return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord;
1499 C2V_END
1500
1501 C2V_VMENTRY(void, compileToBytecode, (JNIEnv*, jobject, jobject lambda_form_handle))
1502 Handle lambda_form(THREAD, JNIHandles::resolve_non_null(lambda_form_handle));
1503 if (lambda_form->is_a(SystemDictionary::LambdaForm_klass())) {
1504 TempNewSymbol compileToBytecode = SymbolTable::new_symbol("compileToBytecode", CHECK);
1505 JavaValue result(T_VOID);
1506 JavaCalls::call_special(&result, lambda_form, SystemDictionary::LambdaForm_klass(), compileToBytecode, vmSymbols::void_method_signature(), CHECK);
1507 } else {
1508 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
1509 err_msg("Unexpected type: %s", lambda_form->klass()->external_name()));
1510 }
1511 C2V_END
1512
1513 C2V_VMENTRY(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
1514 methodHandle m = CompilerToVM::asMethod(jvmci_method);
1515 oop executable;
1516 if (m->is_initializer()) {
1517 if (m->is_static_initializer()) {
1518 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1519 "Cannot create java.lang.reflect.Method for class initializer");
1520 }
1521 executable = Reflection::new_constructor(m, CHECK_NULL);
1522 } else {
1523 executable = Reflection::new_method(m, false, CHECK_NULL);
1524 }
1525 return JNIHandles::make_local(thread, executable);
1526 }
1527
1528 C2V_VMENTRY(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
1529 Klass* klass = CompilerToVM::asKlass(jvmci_type);
1530 if (!klass->is_instance_klass()) {
1531 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1532 err_msg("Expected non-primitive type, got %s", klass->external_name()));
1533 }
1534 InstanceKlass* iklass = InstanceKlass::cast(klass);
1535 Array<u2>* fields = iklass->fields();
1536 if (index < 0 || index > fields->length()) {
1537 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1538 err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
1539 }
1540 fieldDescriptor fd(iklass, index);
|
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->ends_with(';')) {
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,
460 CHECK_0);
1496 bytecode_frame = BytecodePosition::caller(bytecode_frame);
1497 }
1498 return size + Deoptimization::last_frame_adjust(0, callee_locals) * BytesPerWord;
1499 C2V_END
1500
1501 C2V_VMENTRY(void, compileToBytecode, (JNIEnv*, jobject, jobject lambda_form_handle))
1502 Handle lambda_form(THREAD, JNIHandles::resolve_non_null(lambda_form_handle));
1503 if (lambda_form->is_a(SystemDictionary::LambdaForm_klass())) {
1504 TempNewSymbol compileToBytecode = SymbolTable::new_symbol("compileToBytecode", CHECK);
1505 JavaValue result(T_VOID);
1506 JavaCalls::call_special(&result, lambda_form, SystemDictionary::LambdaForm_klass(), compileToBytecode, vmSymbols::void_method_signature(), CHECK);
1507 } else {
1508 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
1509 err_msg("Unexpected type: %s", lambda_form->klass()->external_name()));
1510 }
1511 C2V_END
1512
1513 C2V_VMENTRY(jobject, asReflectionExecutable, (JNIEnv* env, jobject, jobject jvmci_method))
1514 methodHandle m = CompilerToVM::asMethod(jvmci_method);
1515 oop executable;
1516 if (m->is_class_initializer()) {
1517 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1518 "Cannot create java.lang.reflect.Method for class initializer");
1519 } else if (m->is_object_constructor()) {
1520 executable = Reflection::new_constructor(m, CHECK_NULL);
1521 } else {
1522 executable = Reflection::new_method(m, false, CHECK_NULL);
1523 }
1524 return JNIHandles::make_local(thread, executable);
1525 }
1526
1527 C2V_VMENTRY(jobject, asReflectionField, (JNIEnv* env, jobject, jobject jvmci_type, jint index))
1528 Klass* klass = CompilerToVM::asKlass(jvmci_type);
1529 if (!klass->is_instance_klass()) {
1530 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1531 err_msg("Expected non-primitive type, got %s", klass->external_name()));
1532 }
1533 InstanceKlass* iklass = InstanceKlass::cast(klass);
1534 Array<u2>* fields = iklass->fields();
1535 if (index < 0 || index > fields->length()) {
1536 THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(),
1537 err_msg("Field index %d out of bounds for %s", index, klass->external_name()));
1538 }
1539 fieldDescriptor fd(iklass, index);
|