< prev index next >

src/hotspot/share/runtime/javaCalls.cpp

Print this page




 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");


< prev index next >