< prev index next >

src/hotspot/share/runtime/javaCalls.cpp

Print this page


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


< prev index next >