comparison src/share/vm/graal/graalCompilerToVM.cpp @ 13261:0ffe9e4bb364

don't go through VM to create HotSpotResolvedObjectType (part 1)
author twisti
date Sun, 08 Dec 2013 13:27:52 -0800
parents f795de8d8b71
children 81055aacb98d
comparison
equal deleted inserted replaced
13260:f795de8d8b71 13261:0ffe9e4bb364
155 ExceptionHandler::set_catchType(entry, NULL); 155 ExceptionHandler::set_catchType(entry, NULL);
156 } else { 156 } else {
157 ConstantPool* cp = InstanceKlass::cast(method->method_holder())->constants(); 157 ConstantPool* cp = InstanceKlass::cast(method->method_holder())->constants();
158 KlassHandle loading_klass = method->method_holder(); 158 KlassHandle loading_klass = method->method_holder();
159 Handle catch_class = GraalCompiler::get_JavaType(cp, catch_class_index, loading_klass, CHECK_NULL); 159 Handle catch_class = GraalCompiler::get_JavaType(cp, catch_class_index, loading_klass, CHECK_NULL);
160 if (catch_class->klass() == HotSpotResolvedObjectType::klass() && java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(catch_class)) == SystemDictionary::Throwable_klass()) { 160 if (catch_class->klass() == HotSpotResolvedObjectType::klass() && java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(catch_class)) == SystemDictionary::Throwable_klass()) {
161 ExceptionHandler::set_catchType(entry, NULL); 161 ExceptionHandler::set_catchType(entry, NULL);
162 ExceptionHandler::set_catchTypeCPI(entry, 0); 162 ExceptionHandler::set_catchTypeCPI(entry, 0);
163 } else { 163 } else {
164 ExceptionHandler::set_catchType(entry, catch_class()); 164 ExceptionHandler::set_catchType(entry, catch_class());
165 } 165 }
262 objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type()); 262 objArrayOop(JNIHandles::resolve(resultHolder))->obj_at_put(0, type());
263 return (jlong) (address) ucm(); 263 return (jlong) (address) ucm();
264 C2V_END 264 C2V_END
265 265
266 C2V_VMENTRY(jobject, getUniqueImplementor, (JNIEnv *, jobject, jobject interface_type)) 266 C2V_VMENTRY(jobject, getUniqueImplementor, (JNIEnv *, jobject, jobject interface_type))
267 InstanceKlass* klass = (InstanceKlass*) asKlass(HotSpotResolvedObjectType::metaspaceKlass(interface_type)); 267 InstanceKlass* klass = (InstanceKlass*) java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(interface_type));
268 assert(klass->is_interface(), "must be"); 268 assert(klass->is_interface(), "must be");
269 if (klass->nof_implementors() == 1) { 269 if (klass->nof_implementors() == 1) {
270 InstanceKlass* implementor = (InstanceKlass*) klass->implementor(); 270 InstanceKlass* implementor = (InstanceKlass*) klass->implementor();
271 if (!implementor->is_abstract() && !implementor->is_interface() && implementor->is_leaf_class()) { 271 if (!implementor->is_abstract() && !implementor->is_interface() && implementor->is_leaf_class()) {
272 Handle type = GraalCompiler::get_JavaType(implementor, CHECK_NULL); 272 Handle type = GraalCompiler::get_JavaType(implementor, CHECK_NULL);
307 oop result = NULL; 307 oop result = NULL;
308 Klass* resolved_type = NULL; 308 Klass* resolved_type = NULL;
309 Handle classloader; 309 Handle classloader;
310 Handle protectionDomain; 310 Handle protectionDomain;
311 if (JNIHandles::resolve(accessingClass) != NULL) { 311 if (JNIHandles::resolve(accessingClass) != NULL) {
312 classloader = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(accessingClass))->class_loader(); 312 classloader = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(accessingClass))->class_loader();
313 protectionDomain = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(accessingClass))->protection_domain(); 313 protectionDomain = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(accessingClass))->protection_domain();
314 } 314 }
315 315
316 if (eagerResolve) { 316 if (eagerResolve) {
317 resolved_type = SystemDictionary::resolve_or_fail(nameSymbol, classloader, protectionDomain, true, THREAD); 317 resolved_type = SystemDictionary::resolve_or_fail(nameSymbol, classloader, protectionDomain, true, THREAD);
318 } else { 318 } else {
456 C2V_END 456 C2V_END
457 457
458 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject resolved_type, jstring name, jstring signature)) 458 C2V_VMENTRY(jobject, resolveMethod, (JNIEnv *, jobject, jobject resolved_type, jstring name, jstring signature))
459 459
460 assert(JNIHandles::resolve(resolved_type) != NULL, ""); 460 assert(JNIHandles::resolve(resolved_type) != NULL, "");
461 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(resolved_type)); 461 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(resolved_type));
462 Symbol* name_symbol = java_lang_String::as_symbol(JNIHandles::resolve(name), THREAD); 462 Symbol* name_symbol = java_lang_String::as_symbol(JNIHandles::resolve(name), THREAD);
463 Symbol* signature_symbol = java_lang_String::as_symbol(JNIHandles::resolve(signature), THREAD); 463 Symbol* signature_symbol = java_lang_String::as_symbol(JNIHandles::resolve(signature), THREAD);
464 methodHandle method = klass->lookup_method(name_symbol, signature_symbol); 464 methodHandle method = klass->lookup_method(name_symbol, signature_symbol);
465 if (method.is_null()) { 465 if (method.is_null()) {
466 if (TraceGraal >= 3) { 466 if (TraceGraal >= 3) {
472 Handle holder = GraalCompiler::get_JavaType(method->method_holder(), CHECK_NULL); 472 Handle holder = GraalCompiler::get_JavaType(method->method_holder(), CHECK_NULL);
473 return JNIHandles::make_local(THREAD, VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD)); 473 return JNIHandles::make_local(THREAD, VMToCompiler::createResolvedJavaMethod(holder, method(), THREAD));
474 C2V_END 474 C2V_END
475 475
476 C2V_VMENTRY(jboolean, hasFinalizableSubclass,(JNIEnv *, jobject, jobject hotspot_klass)) 476 C2V_VMENTRY(jboolean, hasFinalizableSubclass,(JNIEnv *, jobject, jobject hotspot_klass))
477 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(hotspot_klass)); 477 Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(hotspot_klass));
478 assert(klass != NULL, "method must not be called for primitive types"); 478 assert(klass != NULL, "method must not be called for primitive types");
479 return Dependencies::find_finalizable_subclass(klass) != NULL; 479 return Dependencies::find_finalizable_subclass(klass) != NULL;
480 C2V_END 480 C2V_END
481 481
482 C2V_VMENTRY(jobject, getInstanceFields, (JNIEnv *, jobject, jobject klass)) 482 C2V_VMENTRY(jobject, getInstanceFields, (JNIEnv *, jobject, jobject klass))
483 ResourceMark rm; 483 ResourceMark rm;
484 484
485 instanceKlassHandle k = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(klass)); 485 instanceKlassHandle k = java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(klass));
486 GrowableArray<Handle> fields(k->java_fields_count()); 486 GrowableArray<Handle> fields(k->java_fields_count());
487 487
488 for (AllFieldStream fs(k()); !fs.done(); fs.next()) { 488 for (AllFieldStream fs(k()); !fs.done(); fs.next()) {
489 if (!fs.access_flags().is_static()) { 489 if (!fs.access_flags().is_static()) {
490 Handle type = GraalCompiler::get_JavaTypeFromSignature(fs.signature(), k, THREAD); 490 Handle type = GraalCompiler::get_JavaTypeFromSignature(fs.signature(), k, THREAD);
503 C2V_END 503 C2V_END
504 504
505 C2V_VMENTRY(jobject, getMethods, (JNIEnv *, jobject, jobject klass)) 505 C2V_VMENTRY(jobject, getMethods, (JNIEnv *, jobject, jobject klass))
506 ResourceMark rm; 506 ResourceMark rm;
507 507
508 instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaMirror(klass))); 508 instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(HotSpotResolvedObjectType::javaClass(klass)));
509 Array<Method*>* methods = k->methods(); 509 Array<Method*>* methods = k->methods();
510 int methods_length = methods->length(); 510 int methods_length = methods->length();
511 511
512 // Allocate result 512 // Allocate result
513 objArrayOop r = oopFactory::new_objArray(SystemDictionary::HotSpotResolvedJavaMethod_klass(), methods_length, CHECK_NULL); 513 objArrayOop r = oopFactory::new_objArray(SystemDictionary::HotSpotResolvedJavaMethod_klass(), methods_length, CHECK_NULL);
529 int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int)); 529 int64_t off_low = (int64_t)target_addr - ((int64_t)CodeCache::low_bound() + sizeof(int));
530 int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int)); 530 int64_t off_high = (int64_t)target_addr - ((int64_t)CodeCache::high_bound() + sizeof(int));
531 return MAX2(ABS(off_low), ABS(off_high)); 531 return MAX2(ABS(off_low), ABS(off_high));
532 } 532 }
533 return -1; 533 return -1;
534 C2V_END
535
536 C2V_VMENTRY(jobject, getResolvedType, (JNIEnv *env, jobject, jobject javaClass))
537 oop java_mirror = JNIHandles::resolve(javaClass);
538 assert(java_mirror != NULL, "argument to CompilerToVM.getResolvedType must not be NULL");
539 Handle type = GraalCompiler::get_JavaTypeFromClass(java_mirror, CHECK_NULL);
540 return JNIHandles::make_local(THREAD, type());
541 C2V_END 534 C2V_END
542 535
543 536
544 // helpers used to set fields in the HotSpotVMConfig object 537 // helpers used to set fields in the HotSpotVMConfig object
545 jfieldID getFieldID(JNIEnv* env, jobject obj, const char* name, const char* sig) { 538 jfieldID getFieldID(JNIEnv* env, jobject obj, const char* name, const char* sig) {
1008 {CC"resolveMethod", CC"("HS_RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(resolveMethod)}, 1001 {CC"resolveMethod", CC"("HS_RESOLVED_TYPE STRING STRING")"METHOD, FN_PTR(resolveMethod)},
1009 {CC"getInstanceFields", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_FIELD, FN_PTR(getInstanceFields)}, 1002 {CC"getInstanceFields", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_FIELD, FN_PTR(getInstanceFields)},
1010 {CC"getMethods", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_METHOD, FN_PTR(getMethods)}, 1003 {CC"getMethods", CC"("HS_RESOLVED_TYPE")["HS_RESOLVED_METHOD, FN_PTR(getMethods)},
1011 {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(hasFinalizableSubclass)}, 1004 {CC"hasFinalizableSubclass", CC"("HS_RESOLVED_TYPE")Z", FN_PTR(hasFinalizableSubclass)},
1012 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, 1005 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)},
1013 {CC"getResolvedType", CC"("CLASS")"RESOLVED_TYPE, FN_PTR(getResolvedType)},
1014 {CC"getMetaspaceMethod", CC"("REFLECT_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceMethod)}, 1006 {CC"getMetaspaceMethod", CC"("REFLECT_METHOD"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceMethod)},
1015 {CC"getMetaspaceConstructor", CC"("REFLECT_CONSTRUCTOR"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceConstructor)}, 1007 {CC"getMetaspaceConstructor", CC"("REFLECT_CONSTRUCTOR"["HS_RESOLVED_TYPE")"METASPACE_METHOD, FN_PTR(getMetaspaceConstructor)},
1016 {CC"getJavaField", CC"("REFLECT_FIELD")"HS_RESOLVED_FIELD, FN_PTR(getJavaField)}, 1008 {CC"getJavaField", CC"("REFLECT_FIELD")"HS_RESOLVED_FIELD, FN_PTR(getJavaField)},
1017 {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)}, 1009 {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)},
1018 {CC"installCode0", CC"("HS_COMPILED_CODE HS_INSTALLED_CODE"[Z)I", FN_PTR(installCode0)}, 1010 {CC"installCode0", CC"("HS_COMPILED_CODE HS_INSTALLED_CODE"[Z)I", FN_PTR(installCode0)},