Mercurial > hg > graal-compiler
comparison src/share/vm/opto/doCall.cpp @ 3371:fabcf26ee72f
6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
Reviewed-by: jrose, kvn, never
author | twisti |
---|---|
date | Thu, 12 May 2011 14:04:48 -0700 |
parents | e2a92dd0d3d2 |
children | f56542cb325a |
comparison
equal
deleted
inserted
replaced
3370:2f17eb233d13 | 3371:fabcf26ee72f |
---|---|
60 #endif | 60 #endif |
61 | 61 |
62 CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, | 62 CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, |
63 JVMState* jvms, bool allow_inline, | 63 JVMState* jvms, bool allow_inline, |
64 float prof_factor) { | 64 float prof_factor) { |
65 CallGenerator* cg; | 65 CallGenerator* cg; |
66 ciMethod* caller = jvms->method(); | |
67 int bci = jvms->bci(); | |
68 Bytecodes::Code bytecode = caller->java_code_at_bci(bci); | |
66 guarantee(call_method != NULL, "failed method resolution"); | 69 guarantee(call_method != NULL, "failed method resolution"); |
67 | 70 |
68 // Dtrace currently doesn't work unless all calls are vanilla | 71 // Dtrace currently doesn't work unless all calls are vanilla |
69 if (env()->dtrace_method_probes()) { | 72 if (env()->dtrace_method_probes()) { |
70 allow_inline = false; | 73 allow_inline = false; |
71 } | 74 } |
72 | 75 |
73 // Note: When we get profiling during stage-1 compiles, we want to pull | 76 // Note: When we get profiling during stage-1 compiles, we want to pull |
74 // from more specific profile data which pertains to this inlining. | 77 // from more specific profile data which pertains to this inlining. |
75 // Right now, ignore the information in jvms->caller(), and do method[bci]. | 78 // Right now, ignore the information in jvms->caller(), and do method[bci]. |
76 ciCallProfile profile = jvms->method()->call_profile_at_bci(jvms->bci()); | 79 ciCallProfile profile = caller->call_profile_at_bci(bci); |
77 Bytecodes::Code bytecode = jvms->method()->java_code_at_bci(jvms->bci()); | |
78 | 80 |
79 // See how many times this site has been invoked. | 81 // See how many times this site has been invoked. |
80 int site_count = profile.count(); | 82 int site_count = profile.count(); |
81 int receiver_count = -1; | 83 int receiver_count = -1; |
82 if (call_is_virtual && UseTypeProfile && profile.has_receiver(0)) { | 84 if (call_is_virtual && UseTypeProfile && profile.has_receiver(0)) { |
124 if (n->Opcode() == Op_ConP) { | 126 if (n->Opcode() == Op_ConP) { |
125 const TypeOopPtr* oop_ptr = n->bottom_type()->is_oopptr(); | 127 const TypeOopPtr* oop_ptr = n->bottom_type()->is_oopptr(); |
126 ciObject* const_oop = oop_ptr->const_oop(); | 128 ciObject* const_oop = oop_ptr->const_oop(); |
127 ciMethodHandle* method_handle = const_oop->as_method_handle(); | 129 ciMethodHandle* method_handle = const_oop->as_method_handle(); |
128 | 130 |
129 // Set the actually called method to have access to the class | 131 // Set the callee to have access to the class and signature in |
130 // and signature in the MethodHandleCompiler. | 132 // the MethodHandleCompiler. |
131 method_handle->set_callee(call_method); | 133 method_handle->set_callee(call_method); |
134 method_handle->set_caller(caller); | |
132 method_handle->set_call_profile(&profile); | 135 method_handle->set_call_profile(&profile); |
133 | 136 |
134 // Get an adapter for the MethodHandle. | 137 // Get an adapter for the MethodHandle. |
135 ciMethod* target_method = method_handle->get_method_handle_adapter(); | 138 ciMethod* target_method = method_handle->get_method_handle_adapter(); |
136 if (target_method != NULL) { | 139 if (target_method != NULL) { |
148 ciBytecodeStream str(caller_method); | 151 ciBytecodeStream str(caller_method); |
149 str.force_bci(jvms->bci()); // Set the stream to the invokedynamic bci. | 152 str.force_bci(jvms->bci()); // Set the stream to the invokedynamic bci. |
150 ciCallSite* call_site = str.get_call_site(); | 153 ciCallSite* call_site = str.get_call_site(); |
151 ciMethodHandle* method_handle = call_site->get_target(); | 154 ciMethodHandle* method_handle = call_site->get_target(); |
152 | 155 |
153 // Set the actually called method to have access to the class | 156 // Set the callee to have access to the class and signature in |
154 // and signature in the MethodHandleCompiler. | 157 // the MethodHandleCompiler. |
155 method_handle->set_callee(call_method); | 158 method_handle->set_callee(call_method); |
159 method_handle->set_caller(caller); | |
156 method_handle->set_call_profile(&profile); | 160 method_handle->set_call_profile(&profile); |
157 | 161 |
158 // Get an adapter for the MethodHandle. | 162 // Get an adapter for the MethodHandle. |
159 ciMethod* target_method = method_handle->get_invokedynamic_adapter(); | 163 ciMethod* target_method = method_handle->get_invokedynamic_adapter(); |
160 if (target_method != NULL) { | 164 if (target_method != NULL) { |