Mercurial > hg > graal-compiler
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)}, |