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"); | 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 // Already returned a Null Handle if any exception is pending. 311 return obj; 312 } 313 314 Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, TRAPS) { 315 JavaCallArguments args; 316 return JavaCalls::construct_new_instance(klass, constructor_signature, &args, THREAD); 317 } 318 319 Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, Handle arg1, TRAPS) { 320 JavaCallArguments args; 321 args.push_oop(arg1); 322 return JavaCalls::construct_new_instance(klass, constructor_signature, &args, THREAD); 323 } 324 325 Handle JavaCalls::construct_new_instance(InstanceKlass* klass, Symbol* constructor_signature, Handle arg1, Handle arg2, TRAPS) { 326 JavaCallArguments args; 327 args.push_oop(arg1); 328 args.push_oop(arg2); 329 return JavaCalls::construct_new_instance(klass, constructor_signature, &args, THREAD); 330 } 331 332 // ------------------------------------------------- 333 // Implementation of JavaCalls (low level) 334 335 336 void JavaCalls::call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) { 337 // Check if we need to wrap a potential OS exception handler around thread 338 // This is used for e.g. Win32 structured exception handlers 339 assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls"); 340 // Need to wrap each and every time, since there might be native code down the 341 // stack that has installed its own exception handlers 342 os::os_exception_wrapper(call_helper, result, method, args, THREAD); 343 } 344 345 void JavaCalls::call_helper(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS) { 346 347 JavaThread* thread = (JavaThread*)THREAD; 348 assert(thread->is_Java_thread(), "must be called by a java thread"); 349 assert(method.not_null(), "must have a method to call"); |