182 } 183 184 // ============ Virtual calls ============ 185 186 void JavaCalls::call_virtual(JavaValue* result, Klass* spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { 187 CallInfo callinfo; 188 Handle receiver = args->receiver(); 189 Klass* recvrKlass = receiver.is_null() ? (Klass*)NULL : receiver->klass(); 190 LinkInfo link_info(spec_klass, name, signature); 191 LinkResolver::resolve_virtual_call( 192 callinfo, receiver, recvrKlass, link_info, true, CHECK); 193 methodHandle method = callinfo.selected_method(); 194 assert(method.not_null(), "should have thrown exception"); 195 196 // Invoke the method 197 JavaCalls::call(result, method, args, CHECK); 198 } 199 200 201 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, TRAPS) { 202 JavaCallArguments args(receiver); // One oop argument 203 call_virtual(result, spec_klass, name, signature, &args, CHECK); 204 } 205 206 207 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) { 208 JavaCallArguments args(receiver); // One oop argument 209 args.push_oop(arg1); 210 call_virtual(result, spec_klass, name, signature, &args, CHECK); 211 } 212 213 214 215 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) { 216 JavaCallArguments args(receiver); // One oop argument 217 args.push_oop(arg1); 218 args.push_oop(arg2); 219 call_virtual(result, spec_klass, name, signature, &args, CHECK); 220 } 221 222 223 // ============ Special calls ============ 224 225 void JavaCalls::call_special(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { 226 CallInfo callinfo; 227 LinkInfo link_info(klass, name, signature); 228 LinkResolver::resolve_special_call(callinfo, args->receiver(), link_info, CHECK); 229 methodHandle method = callinfo.selected_method(); 230 assert(method.not_null(), "should have thrown exception"); 231 232 // Invoke the method 233 JavaCalls::call(result, method, args, CHECK); 234 } 235 236 237 void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, TRAPS) { 238 JavaCallArguments args(receiver); // One oop argument 239 call_special(result, klass, name, signature, &args, CHECK); 240 } 241 242 243 void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) { 244 JavaCallArguments args(receiver); // One oop argument 245 args.push_oop(arg1); 246 call_special(result, klass, name, signature, &args, CHECK); 247 } 248 249 250 void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) { 251 JavaCallArguments args(receiver); // One oop argument 252 args.push_oop(arg1); 253 args.push_oop(arg2); 254 call_special(result, klass, name, signature, &args, CHECK); 255 } 256 257 258 // ============ Static calls ============ 259 260 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { 261 CallInfo callinfo; 262 LinkInfo link_info(klass, name, signature); 263 LinkResolver::resolve_static_call(callinfo, link_info, true, CHECK); 264 methodHandle method = callinfo.selected_method(); 265 assert(method.not_null(), "should have thrown exception"); 266 267 // Invoke the method 268 JavaCalls::call(result, method, args, CHECK); 269 } 270 271 272 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, TRAPS) { 273 JavaCallArguments args; // No argument 274 call_static(result, klass, name, signature, &args, CHECK); 275 } 276 277 278 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) { 279 JavaCallArguments args(arg1); // One oop argument 280 call_static(result, klass, name, signature, &args, CHECK); 281 } 282 283 284 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) { 285 JavaCallArguments args; // One oop argument 286 args.push_oop(arg1); 287 args.push_oop(arg2); 288 call_static(result, klass, name, signature, &args, CHECK); 289 } 290 291 292 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS) { 293 JavaCallArguments args; // One oop argument 294 args.push_oop(arg1); 295 args.push_oop(arg2); 296 args.push_oop(arg3); 297 call_static(result, klass, name, signature, &args, CHECK); 298 } 299 300 // ------------------------------------------------- 301 // Implementation of JavaCalls (low level) 302 303 304 void JavaCalls::call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) { 305 // Check if we need to wrap a potential OS exception handler around thread 306 // This is used for e.g. Win32 structured exception handlers 307 assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls"); 308 // Need to wrap each and every time, since there might be native code down the 309 // stack that has installed its own exception handlers 310 os::os_exception_wrapper(call_helper, result, method, args, THREAD); 311 } 312 313 void JavaCalls::call_helper(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) { 314 315 JavaThread* thread = (JavaThread*)THREAD; 316 assert(thread->is_Java_thread(), "must be called by a java thread"); 317 assert(method.not_null(), "must have a method to call"); | 182 } 183 184 // ============ Virtual calls ============ 185 186 void JavaCalls::call_virtual(JavaValue* result, Klass* spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { 187 CallInfo callinfo; 188 Handle receiver = args->receiver(); 189 Klass* recvrKlass = receiver.is_null() ? (Klass*)NULL : receiver->klass(); 190 LinkInfo link_info(spec_klass, name, signature); 191 LinkResolver::resolve_virtual_call( 192 callinfo, receiver, recvrKlass, link_info, true, CHECK); 193 methodHandle method = callinfo.selected_method(); 194 assert(method.not_null(), "should have thrown exception"); 195 196 // Invoke the method 197 JavaCalls::call(result, method, args, CHECK); 198 } 199 200 201 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, TRAPS) { 202 JavaCallArguments args(receiver); 203 call_virtual(result, spec_klass, name, signature, &args, CHECK); 204 } 205 206 207 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) { 208 JavaCallArguments args(receiver); 209 args.push_oop(arg1); 210 call_virtual(result, spec_klass, name, signature, &args, CHECK); 211 } 212 213 214 215 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, Klass* spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) { 216 JavaCallArguments args(receiver); 217 args.push_oop(arg1); 218 args.push_oop(arg2); 219 call_virtual(result, spec_klass, name, signature, &args, CHECK); 220 } 221 222 223 // ============ Special calls ============ 224 225 void JavaCalls::call_special(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { 226 CallInfo callinfo; 227 LinkInfo link_info(klass, name, signature); 228 LinkResolver::resolve_special_call(callinfo, args->receiver(), link_info, CHECK); 229 methodHandle method = callinfo.selected_method(); 230 assert(method.not_null(), "should have thrown exception"); 231 232 // Invoke the method 233 JavaCalls::call(result, method, args, CHECK); 234 } 235 236 237 void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, TRAPS) { 238 JavaCallArguments args(receiver); 239 call_special(result, klass, name, signature, &args, CHECK); 240 } 241 242 243 void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) { 244 JavaCallArguments args(receiver); 245 args.push_oop(arg1); 246 call_special(result, klass, name, signature, &args, CHECK); 247 } 248 249 250 void JavaCalls::call_special(JavaValue* result, Handle receiver, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) { 251 JavaCallArguments args(receiver); 252 args.push_oop(arg1); 253 args.push_oop(arg2); 254 call_special(result, klass, name, signature, &args, CHECK); 255 } 256 257 258 // ============ Static calls ============ 259 260 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { 261 CallInfo callinfo; 262 LinkInfo link_info(klass, name, signature); 263 LinkResolver::resolve_static_call(callinfo, link_info, true, CHECK); 264 methodHandle method = callinfo.selected_method(); 265 assert(method.not_null(), "should have thrown exception"); 266 267 // Invoke the method 268 JavaCalls::call(result, method, args, CHECK); 269 } 270 271 272 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, TRAPS) { 273 JavaCallArguments args; 274 call_static(result, klass, name, signature, &args, CHECK); 275 } 276 277 278 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) { 279 JavaCallArguments args(arg1); 280 call_static(result, klass, name, signature, &args, CHECK); 281 } 282 283 284 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) { 285 JavaCallArguments args; 286 args.push_oop(arg1); 287 args.push_oop(arg2); 288 call_static(result, klass, name, signature, &args, CHECK); 289 } 290 291 292 void JavaCalls::call_static(JavaValue* result, Klass* klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS) { 293 JavaCallArguments args; 294 args.push_oop(arg1); 295 args.push_oop(arg2); 296 args.push_oop(arg3); 297 call_static(result, klass, name, signature, &args, CHECK); 298 } 299 300 // ============ allocate and initialize new object instance ============ 301 302 Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, JavaCallArguments* args, TRAPS) { 303 klass->initialize(CHECK_NH); // Quick no-op if already initialized. 304 Handle obj = klass->allocate_instance_handle(CHECK_NH); 305 JavaValue void_result(T_VOID); 306 args->set_receiver(obj); // inserts <obj> as the first argument. 307 JavaCalls::call_special(&void_result, klass, 308 vmSymbols::object_initializer_name(), 309 constructor_signature, args, CHECK_NH); 310 return obj; 311 } 312 313 Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, TRAPS) { 314 JavaCallArguments args; 315 return JavaCalls::construct_new_instance(klass, constructor_signature, &args, CHECK_NH); 316 } 317 318 Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, Handle arg1, TRAPS) { 319 JavaCallArguments args; 320 args.push_oop(arg1); 321 return JavaCalls::construct_new_instance(klass, constructor_signature, &args, CHECK_NH); 322 } 323 324 Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, Handle arg1, Handle arg2, TRAPS) { 325 JavaCallArguments args; 326 args.push_oop(arg1); 327 args.push_oop(arg2); 328 return JavaCalls::construct_new_instance(klass, constructor_signature, &args, CHECK_NH); 329 } 330 331 // ------------------------------------------------- 332 // Implementation of JavaCalls (low level) 333 334 335 void JavaCalls::call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) { 336 // Check if we need to wrap a potential OS exception handler around thread 337 // This is used for e.g. Win32 structured exception handlers 338 assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls"); 339 // Need to wrap each and every time, since there might be native code down the 340 // stack that has installed its own exception handlers 341 os::os_exception_wrapper(call_helper, result, method, args, THREAD); 342 } 343 344 void JavaCalls::call_helper(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) { 345 346 JavaThread* thread = (JavaThread*)THREAD; 347 assert(thread->is_Java_thread(), "must be called by a java thread"); 348 assert(method.not_null(), "must have a method to call"); |