src/share/vm/prims/jni.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8014013 Sdiff src/share/vm/prims

src/share/vm/prims/jni.cpp

Print this page




1319 
1320 static void jni_invoke_nonstatic(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
1321   oop recv = JNIHandles::resolve(receiver);
1322   if (recv == NULL) {
1323     THROW(vmSymbols::java_lang_NullPointerException());
1324   }
1325   Handle h_recv(THREAD, recv);
1326 
1327   int number_of_parameters;
1328   Method* selected_method;
1329   {
1330     Method* m = Method::resolve_jmethod_id(method_id);
1331     number_of_parameters = m->size_of_parameters();
1332     Klass* holder = m->method_holder();
1333     if (!(holder)->is_interface()) {
1334       // non-interface call -- for that little speed boost, don't handlize
1335       debug_only(No_Safepoint_Verifier nosafepoint;)
1336       if (call_type == JNI_VIRTUAL) {
1337         // jni_GetMethodID makes sure class is linked and initialized
1338         // so m should have a valid vtable index.

1339         int vtbl_index = m->vtable_index();
1340         if (vtbl_index != Method::nonvirtual_vtable_index) {
1341           Klass* k = h_recv->klass();
1342           // k might be an arrayKlassOop but all vtables start at
1343           // the same place. The cast is to avoid virtual call and assertion.
1344           InstanceKlass *ik = (InstanceKlass*)k;
1345           selected_method = ik->method_at_vtable(vtbl_index);
1346         } else {
1347           // final method
1348           selected_method = m;
1349         }
1350       } else {
1351         // JNI_NONVIRTUAL call
1352         selected_method = m;
1353       }
1354     } else {
1355       // interface call
1356       KlassHandle h_holder(THREAD, holder);
1357 
1358       int itbl_index = m->cached_itable_index();
1359       if (itbl_index == -1) {
1360         itbl_index = klassItable::compute_itable_index(m);
1361         m->set_cached_itable_index(itbl_index);
1362         // the above may have grabbed a lock, 'm' and anything non-handlized can't be used again
1363       }
1364       Klass* k = h_recv->klass();
1365       selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
1366     }
1367   }
1368 
1369   methodHandle method(THREAD, selected_method);
1370 
1371   // Create object to hold arguments for the JavaCall, and associate it with
1372   // the jni parser
1373   ResourceMark rm(THREAD);
1374   JavaCallArguments java_args(number_of_parameters);
1375   args->set_java_argument_object(&java_args);
1376 
1377   // handle arguments
1378   assert(!method->is_static(), "method should not be static");
1379   args->push_receiver(h_recv); // Push jobject handle
1380 
1381   // Fill out JavaCallArguments object
1382   args->iterate( Fingerprinter(method).fingerprint() );
1383   // Initialize result type




1319 
1320 static void jni_invoke_nonstatic(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS) {
1321   oop recv = JNIHandles::resolve(receiver);
1322   if (recv == NULL) {
1323     THROW(vmSymbols::java_lang_NullPointerException());
1324   }
1325   Handle h_recv(THREAD, recv);
1326 
1327   int number_of_parameters;
1328   Method* selected_method;
1329   {
1330     Method* m = Method::resolve_jmethod_id(method_id);
1331     number_of_parameters = m->size_of_parameters();
1332     Klass* holder = m->method_holder();
1333     if (!(holder)->is_interface()) {
1334       // non-interface call -- for that little speed boost, don't handlize
1335       debug_only(No_Safepoint_Verifier nosafepoint;)
1336       if (call_type == JNI_VIRTUAL) {
1337         // jni_GetMethodID makes sure class is linked and initialized
1338         // so m should have a valid vtable index.
1339         assert(!m->has_itable_index(), "");
1340         int vtbl_index = m->vtable_index();
1341         if (vtbl_index != Method::nonvirtual_vtable_index) {
1342           Klass* k = h_recv->klass();
1343           // k might be an arrayKlassOop but all vtables start at
1344           // the same place. The cast is to avoid virtual call and assertion.
1345           InstanceKlass *ik = (InstanceKlass*)k;
1346           selected_method = ik->method_at_vtable(vtbl_index);
1347         } else {
1348           // final method
1349           selected_method = m;
1350         }
1351       } else {
1352         // JNI_NONVIRTUAL call
1353         selected_method = m;
1354       }
1355     } else {
1356       // interface call
1357       KlassHandle h_holder(THREAD, holder);
1358 
1359       int itbl_index = m->itable_index();





1360       Klass* k = h_recv->klass();
1361       selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
1362     }
1363   }
1364 
1365   methodHandle method(THREAD, selected_method);
1366 
1367   // Create object to hold arguments for the JavaCall, and associate it with
1368   // the jni parser
1369   ResourceMark rm(THREAD);
1370   JavaCallArguments java_args(number_of_parameters);
1371   args->set_java_argument_object(&java_args);
1372 
1373   // handle arguments
1374   assert(!method->is_static(), "method should not be static");
1375   args->push_receiver(h_recv); // Push jobject handle
1376 
1377   // Fill out JavaCallArguments object
1378   args->iterate( Fingerprinter(method).fingerprint() );
1379   // Initialize result type


src/share/vm/prims/jni.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File