< prev index next >

src/hotspot/share/jvmci/jvmciCompilerToVM.cpp

Print this page
rev 55090 : secret-sfac


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


< prev index next >