comparison src/share/vm/prims/jni.cpp @ 14380:e6195383bcaf

8034080: Remove the USDT1 dtrace code from Hotspot Reviewed-by: dholmes, coleenp
author sla
date Tue, 18 Feb 2014 09:15:40 +0100
parents c66479743828
children 3f406218c511
comparison
equal deleted inserted replaced
14379:c66479743828 14380:e6195383bcaf
112 // DT_RETURN_MARK(SomeFunc, int, (const int&)return_value); 112 // DT_RETURN_MARK(SomeFunc, int, (const int&)return_value);
113 // foo(CHECK_0) 113 // foo(CHECK_0)
114 // return_value = 5; 114 // return_value = 5;
115 // return return_value; 115 // return return_value;
116 // JNI_END 116 // JNI_END
117 #ifndef USDT2
118 #define DT_RETURN_MARK_DECL(name, type) \
119 HS_DTRACE_PROBE_DECL1(hotspot_jni, name##__return, type); \
120 DTRACE_ONLY( \
121 class DTraceReturnProbeMark_##name { \
122 public: \
123 const type& _ret_ref; \
124 DTraceReturnProbeMark_##name(const type& v) : _ret_ref(v) {} \
125 ~DTraceReturnProbeMark_##name() { \
126 HS_DTRACE_PROBE1(hotspot_jni, name##__return, _ret_ref); \
127 } \
128 } \
129 )
130 // Void functions are simpler since there's no return value
131 #define DT_VOID_RETURN_MARK_DECL(name) \
132 HS_DTRACE_PROBE_DECL0(hotspot_jni, name##__return); \
133 DTRACE_ONLY( \
134 class DTraceReturnProbeMark_##name { \
135 public: \
136 ~DTraceReturnProbeMark_##name() { \
137 HS_DTRACE_PROBE0(hotspot_jni, name##__return); \
138 } \
139 } \
140 )
141
142 #else /* USDT2 */
143
144 #define DT_RETURN_MARK_DECL(name, type, probe) \ 117 #define DT_RETURN_MARK_DECL(name, type, probe) \
145 DTRACE_ONLY( \ 118 DTRACE_ONLY( \
146 class DTraceReturnProbeMark_##name { \ 119 class DTraceReturnProbeMark_##name { \
147 public: \ 120 public: \
148 const type& _ret_ref; \ 121 const type& _ret_ref; \
160 ~DTraceReturnProbeMark_##name() { \ 133 ~DTraceReturnProbeMark_##name() { \
161 probe; \ 134 probe; \
162 } \ 135 } \
163 } \ 136 } \
164 ) 137 )
165 #endif /* USDT2 */
166 138
167 // Place these macros in the function to mark the return. Non-void 139 // Place these macros in the function to mark the return. Non-void
168 // functions need the type and address of the return value. 140 // functions need the type and address of the return value.
169 #define DT_RETURN_MARK(name, type, ref) \ 141 #define DT_RETURN_MARK(name, type, ref) \
170 DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark(ref) ) 142 DTRACE_ONLY( DTraceReturnProbeMark_##name dtrace_return_mark(ref) )
189 161
190 #define COMMA , 162 #define COMMA ,
191 163
192 // Choose DT_RETURN_MARK macros based on the type: float/double -> void 164 // Choose DT_RETURN_MARK macros based on the type: float/double -> void
193 // (dtrace doesn't do FP yet) 165 // (dtrace doesn't do FP yet)
194 #ifndef USDT2
195 #define DT_RETURN_MARK_DECL_FOR(TypeName, name, type) \
196 FP_SELECT(TypeName, \
197 DT_RETURN_MARK_DECL(name, type), DT_VOID_RETURN_MARK_DECL(name) )
198 #else /* USDT2 */
199 #define DT_RETURN_MARK_DECL_FOR(TypeName, name, type, probe) \ 166 #define DT_RETURN_MARK_DECL_FOR(TypeName, name, type, probe) \
200 FP_SELECT(TypeName, \ 167 FP_SELECT(TypeName, \
201 DT_RETURN_MARK_DECL(name, type, probe), DT_VOID_RETURN_MARK_DECL(name, probe) ) 168 DT_RETURN_MARK_DECL(name, type, probe), DT_VOID_RETURN_MARK_DECL(name, probe) )
202 #endif /* USDT2 */
203 #define DT_RETURN_MARK_FOR(TypeName, name, type, ref) \ 169 #define DT_RETURN_MARK_FOR(TypeName, name, type, ref) \
204 FP_SELECT(TypeName, \ 170 FP_SELECT(TypeName, \
205 DT_RETURN_MARK(name, type, ref), DT_VOID_RETURN_MARK(name) ) 171 DT_RETURN_MARK(name, type, ref), DT_VOID_RETURN_MARK(name) )
206 172
207 173
356 #endif 322 #endif
357 323
358 324
359 // Implementation of JNI entries 325 // Implementation of JNI entries
360 326
361 #ifndef USDT2
362 DT_RETURN_MARK_DECL(DefineClass, jclass);
363 #else /* USDT2 */
364 DT_RETURN_MARK_DECL(DefineClass, jclass 327 DT_RETURN_MARK_DECL(DefineClass, jclass
365 , HOTSPOT_JNI_DEFINECLASS_RETURN(_ret_ref)); 328 , HOTSPOT_JNI_DEFINECLASS_RETURN(_ret_ref));
366 #endif /* USDT2 */
367 329
368 JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderRef, 330 JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderRef,
369 const jbyte *buf, jsize bufLen)) 331 const jbyte *buf, jsize bufLen))
370 JNIWrapper("DefineClass"); 332 JNIWrapper("DefineClass");
371 333
372 #ifndef USDT2
373 DTRACE_PROBE5(hotspot_jni, DefineClass__entry,
374 env, name, loaderRef, buf, bufLen);
375 #else /* USDT2 */
376 HOTSPOT_JNI_DEFINECLASS_ENTRY( 334 HOTSPOT_JNI_DEFINECLASS_ENTRY(
377 env, (char*) name, loaderRef, (char*) buf, bufLen); 335 env, (char*) name, loaderRef, (char*) buf, bufLen);
378 #endif /* USDT2 */ 336
379 jclass cls = NULL; 337 jclass cls = NULL;
380 DT_RETURN_MARK(DefineClass, jclass, (const jclass&)cls); 338 DT_RETURN_MARK(DefineClass, jclass, (const jclass&)cls);
381 339
382 TempNewSymbol class_name = NULL; 340 TempNewSymbol class_name = NULL;
383 // Since exceptions can be thrown, class initialization can take place 341 // Since exceptions can be thrown, class initialization can take place
419 377
420 378
421 379
422 static bool first_time_FindClass = true; 380 static bool first_time_FindClass = true;
423 381
424 #ifndef USDT2
425 DT_RETURN_MARK_DECL(FindClass, jclass);
426 #else /* USDT2 */
427 DT_RETURN_MARK_DECL(FindClass, jclass 382 DT_RETURN_MARK_DECL(FindClass, jclass
428 , HOTSPOT_JNI_FINDCLASS_RETURN(_ret_ref)); 383 , HOTSPOT_JNI_FINDCLASS_RETURN(_ret_ref));
429 #endif /* USDT2 */
430 384
431 JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name)) 385 JNI_ENTRY(jclass, jni_FindClass(JNIEnv *env, const char *name))
432 JNIWrapper("FindClass"); 386 JNIWrapper("FindClass");
433 #ifndef USDT2 387
434 DTRACE_PROBE2(hotspot_jni, FindClass__entry, env, name);
435 #else /* USDT2 */
436 HOTSPOT_JNI_FINDCLASS_ENTRY(env, (char *)name); 388 HOTSPOT_JNI_FINDCLASS_ENTRY(env, (char *)name);
437 #endif /* USDT2 */
438 389
439 jclass result = NULL; 390 jclass result = NULL;
440 DT_RETURN_MARK(FindClass, jclass, (const jclass&)result); 391 DT_RETURN_MARK(FindClass, jclass, (const jclass&)result);
441 392
442 // Remember if we are the first invocation of jni_FindClass 393 // Remember if we are the first invocation of jni_FindClass
496 CompilationPolicy::completed_vm_startup(); 447 CompilationPolicy::completed_vm_startup();
497 448
498 return result; 449 return result;
499 JNI_END 450 JNI_END
500 451
501 #ifndef USDT2
502 DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID);
503 #else /* USDT2 */
504 DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID 452 DT_RETURN_MARK_DECL(FromReflectedMethod, jmethodID
505 , HOTSPOT_JNI_FROMREFLECTEDMETHOD_RETURN((uintptr_t)_ret_ref)); 453 , HOTSPOT_JNI_FROMREFLECTEDMETHOD_RETURN((uintptr_t)_ret_ref));
506 #endif /* USDT2 */
507 454
508 JNI_ENTRY(jmethodID, jni_FromReflectedMethod(JNIEnv *env, jobject method)) 455 JNI_ENTRY(jmethodID, jni_FromReflectedMethod(JNIEnv *env, jobject method))
509 JNIWrapper("FromReflectedMethod"); 456 JNIWrapper("FromReflectedMethod");
510 #ifndef USDT2 457
511 DTRACE_PROBE2(hotspot_jni, FromReflectedMethod__entry, env, method);
512 #else /* USDT2 */
513 HOTSPOT_JNI_FROMREFLECTEDMETHOD_ENTRY(env, method); 458 HOTSPOT_JNI_FROMREFLECTEDMETHOD_ENTRY(env, method);
514 #endif /* USDT2 */ 459
515 jmethodID ret = NULL; 460 jmethodID ret = NULL;
516 DT_RETURN_MARK(FromReflectedMethod, jmethodID, (const jmethodID&)ret); 461 DT_RETURN_MARK(FromReflectedMethod, jmethodID, (const jmethodID&)ret);
517 462
518 // method is a handle to a java.lang.reflect.Method object 463 // method is a handle to a java.lang.reflect.Method object
519 oop reflected = JNIHandles::resolve_non_null(method); 464 oop reflected = JNIHandles::resolve_non_null(method);
536 Method* m = InstanceKlass::cast(k1())->method_with_idnum(slot); 481 Method* m = InstanceKlass::cast(k1())->method_with_idnum(slot);
537 ret = m==NULL? NULL : m->jmethod_id(); // return NULL if reflected method deleted 482 ret = m==NULL? NULL : m->jmethod_id(); // return NULL if reflected method deleted
538 return ret; 483 return ret;
539 JNI_END 484 JNI_END
540 485
541 #ifndef USDT2
542 DT_RETURN_MARK_DECL(FromReflectedField, jfieldID);
543 #else /* USDT2 */
544 DT_RETURN_MARK_DECL(FromReflectedField, jfieldID 486 DT_RETURN_MARK_DECL(FromReflectedField, jfieldID
545 , HOTSPOT_JNI_FROMREFLECTEDFIELD_RETURN((uintptr_t)_ret_ref)); 487 , HOTSPOT_JNI_FROMREFLECTEDFIELD_RETURN((uintptr_t)_ret_ref));
546 #endif /* USDT2 */
547 488
548 JNI_ENTRY(jfieldID, jni_FromReflectedField(JNIEnv *env, jobject field)) 489 JNI_ENTRY(jfieldID, jni_FromReflectedField(JNIEnv *env, jobject field))
549 JNIWrapper("FromReflectedField"); 490 JNIWrapper("FromReflectedField");
550 #ifndef USDT2 491
551 DTRACE_PROBE2(hotspot_jni, FromReflectedField__entry, env, field);
552 #else /* USDT2 */
553 HOTSPOT_JNI_FROMREFLECTEDFIELD_ENTRY(env, field); 492 HOTSPOT_JNI_FROMREFLECTEDFIELD_ENTRY(env, field);
554 #endif /* USDT2 */ 493
555 jfieldID ret = NULL; 494 jfieldID ret = NULL;
556 DT_RETURN_MARK(FromReflectedField, jfieldID, (const jfieldID&)ret); 495 DT_RETURN_MARK(FromReflectedField, jfieldID, (const jfieldID&)ret);
557 496
558 // field is a handle to a java.lang.reflect.Field object 497 // field is a handle to a java.lang.reflect.Field object
559 oop reflected = JNIHandles::resolve_non_null(field); 498 oop reflected = JNIHandles::resolve_non_null(field);
584 assert(InstanceKlass::cast(k1())->contains_field_offset(offset), "stay within object"); 523 assert(InstanceKlass::cast(k1())->contains_field_offset(offset), "stay within object");
585 ret = jfieldIDWorkaround::to_instance_jfieldID(k1(), offset); 524 ret = jfieldIDWorkaround::to_instance_jfieldID(k1(), offset);
586 return ret; 525 return ret;
587 JNI_END 526 JNI_END
588 527
589 #ifndef USDT2 528
590 DT_RETURN_MARK_DECL(ToReflectedMethod, jobject);
591 #else /* USDT2 */
592 DT_RETURN_MARK_DECL(ToReflectedMethod, jobject 529 DT_RETURN_MARK_DECL(ToReflectedMethod, jobject
593 , HOTSPOT_JNI_TOREFLECTEDMETHOD_RETURN(_ret_ref)); 530 , HOTSPOT_JNI_TOREFLECTEDMETHOD_RETURN(_ret_ref));
594 #endif /* USDT2 */
595 531
596 JNI_ENTRY(jobject, jni_ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID method_id, jboolean isStatic)) 532 JNI_ENTRY(jobject, jni_ToReflectedMethod(JNIEnv *env, jclass cls, jmethodID method_id, jboolean isStatic))
597 JNIWrapper("ToReflectedMethod"); 533 JNIWrapper("ToReflectedMethod");
598 #ifndef USDT2 534
599 DTRACE_PROBE4(hotspot_jni, ToReflectedMethod__entry, env, cls, method_id, isStatic);
600 #else /* USDT2 */
601 HOTSPOT_JNI_TOREFLECTEDMETHOD_ENTRY(env, cls, (uintptr_t) method_id, isStatic); 535 HOTSPOT_JNI_TOREFLECTEDMETHOD_ENTRY(env, cls, (uintptr_t) method_id, isStatic);
602 #endif /* USDT2 */ 536
603 jobject ret = NULL; 537 jobject ret = NULL;
604 DT_RETURN_MARK(ToReflectedMethod, jobject, (const jobject&)ret); 538 DT_RETURN_MARK(ToReflectedMethod, jobject, (const jobject&)ret);
605 539
606 methodHandle m (THREAD, Method::resolve_jmethod_id(method_id)); 540 methodHandle m (THREAD, Method::resolve_jmethod_id(method_id));
607 assert(m->is_static() == (isStatic != 0), "jni_ToReflectedMethod access flags doesn't match"); 541 assert(m->is_static() == (isStatic != 0), "jni_ToReflectedMethod access flags doesn't match");
613 } 547 }
614 ret = JNIHandles::make_local(env, reflection_method); 548 ret = JNIHandles::make_local(env, reflection_method);
615 return ret; 549 return ret;
616 JNI_END 550 JNI_END
617 551
618 #ifndef USDT2
619 DT_RETURN_MARK_DECL(GetSuperclass, jclass);
620 #else /* USDT2 */
621 DT_RETURN_MARK_DECL(GetSuperclass, jclass 552 DT_RETURN_MARK_DECL(GetSuperclass, jclass
622 , HOTSPOT_JNI_GETSUPERCLASS_RETURN(_ret_ref)); 553 , HOTSPOT_JNI_GETSUPERCLASS_RETURN(_ret_ref));
623 #endif /* USDT2 */
624 554
625 JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub)) 555 JNI_ENTRY(jclass, jni_GetSuperclass(JNIEnv *env, jclass sub))
626 JNIWrapper("GetSuperclass"); 556 JNIWrapper("GetSuperclass");
627 #ifndef USDT2 557
628 DTRACE_PROBE2(hotspot_jni, GetSuperclass__entry, env, sub);
629 #else /* USDT2 */
630 HOTSPOT_JNI_GETSUPERCLASS_ENTRY(env, sub); 558 HOTSPOT_JNI_GETSUPERCLASS_ENTRY(env, sub);
631 #endif /* USDT2 */ 559
632 jclass obj = NULL; 560 jclass obj = NULL;
633 DT_RETURN_MARK(GetSuperclass, jclass, (const jclass&)obj); 561 DT_RETURN_MARK(GetSuperclass, jclass, (const jclass&)obj);
634 562
635 oop mirror = JNIHandles::resolve_non_null(sub); 563 oop mirror = JNIHandles::resolve_non_null(sub);
636 // primitive classes return NULL 564 // primitive classes return NULL
655 return obj; 583 return obj;
656 JNI_END 584 JNI_END
657 585
658 JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super)) 586 JNI_QUICK_ENTRY(jboolean, jni_IsAssignableFrom(JNIEnv *env, jclass sub, jclass super))
659 JNIWrapper("IsSubclassOf"); 587 JNIWrapper("IsSubclassOf");
660 #ifndef USDT2 588
661 DTRACE_PROBE3(hotspot_jni, IsAssignableFrom__entry, env, sub, super);
662 #else /* USDT2 */
663 HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(env, sub, super); 589 HOTSPOT_JNI_ISASSIGNABLEFROM_ENTRY(env, sub, super);
664 #endif /* USDT2 */ 590
665 oop sub_mirror = JNIHandles::resolve_non_null(sub); 591 oop sub_mirror = JNIHandles::resolve_non_null(sub);
666 oop super_mirror = JNIHandles::resolve_non_null(super); 592 oop super_mirror = JNIHandles::resolve_non_null(super);
667 if (java_lang_Class::is_primitive(sub_mirror) || 593 if (java_lang_Class::is_primitive(sub_mirror) ||
668 java_lang_Class::is_primitive(super_mirror)) { 594 java_lang_Class::is_primitive(super_mirror)) {
669 jboolean ret = (sub_mirror == super_mirror); 595 jboolean ret = (sub_mirror == super_mirror);
670 #ifndef USDT2 596
671 DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
672 #else /* USDT2 */
673 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret); 597 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret);
674 #endif /* USDT2 */
675 return ret; 598 return ret;
676 } 599 }
677 Klass* sub_klass = java_lang_Class::as_Klass(sub_mirror); 600 Klass* sub_klass = java_lang_Class::as_Klass(sub_mirror);
678 Klass* super_klass = java_lang_Class::as_Klass(super_mirror); 601 Klass* super_klass = java_lang_Class::as_Klass(super_mirror);
679 assert(sub_klass != NULL && super_klass != NULL, "invalid arguments to jni_IsAssignableFrom"); 602 assert(sub_klass != NULL && super_klass != NULL, "invalid arguments to jni_IsAssignableFrom");
680 jboolean ret = sub_klass->is_subtype_of(super_klass) ? 603 jboolean ret = sub_klass->is_subtype_of(super_klass) ?
681 JNI_TRUE : JNI_FALSE; 604 JNI_TRUE : JNI_FALSE;
682 #ifndef USDT2 605
683 DTRACE_PROBE1(hotspot_jni, IsAssignableFrom__return, ret);
684 #else /* USDT2 */
685 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret); 606 HOTSPOT_JNI_ISASSIGNABLEFROM_RETURN(ret);
686 #endif /* USDT2 */
687 return ret; 607 return ret;
688 JNI_END 608 JNI_END
689 609
690 #ifndef USDT2 610
691 DT_RETURN_MARK_DECL(Throw, jint);
692 #else /* USDT2 */
693 DT_RETURN_MARK_DECL(Throw, jint 611 DT_RETURN_MARK_DECL(Throw, jint
694 , HOTSPOT_JNI_THROW_RETURN(_ret_ref)); 612 , HOTSPOT_JNI_THROW_RETURN(_ret_ref));
695 #endif /* USDT2 */
696 613
697 JNI_ENTRY(jint, jni_Throw(JNIEnv *env, jthrowable obj)) 614 JNI_ENTRY(jint, jni_Throw(JNIEnv *env, jthrowable obj))
698 JNIWrapper("Throw"); 615 JNIWrapper("Throw");
699 #ifndef USDT2 616
700 DTRACE_PROBE2(hotspot_jni, Throw__entry, env, obj);
701 #else /* USDT2 */
702 HOTSPOT_JNI_THROW_ENTRY(env, obj); 617 HOTSPOT_JNI_THROW_ENTRY(env, obj);
703 #endif /* USDT2 */ 618
704 jint ret = JNI_OK; 619 jint ret = JNI_OK;
705 DT_RETURN_MARK(Throw, jint, (const jint&)ret); 620 DT_RETURN_MARK(Throw, jint, (const jint&)ret);
706 621
707 THROW_OOP_(JNIHandles::resolve(obj), JNI_OK); 622 THROW_OOP_(JNIHandles::resolve(obj), JNI_OK);
708 ShouldNotReachHere(); 623 ShouldNotReachHere();
709 JNI_END 624 JNI_END
710 625
711 #ifndef USDT2 626
712 DT_RETURN_MARK_DECL(ThrowNew, jint);
713 #else /* USDT2 */
714 DT_RETURN_MARK_DECL(ThrowNew, jint 627 DT_RETURN_MARK_DECL(ThrowNew, jint
715 , HOTSPOT_JNI_THROWNEW_RETURN(_ret_ref)); 628 , HOTSPOT_JNI_THROWNEW_RETURN(_ret_ref));
716 #endif /* USDT2 */
717 629
718 JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message)) 630 JNI_ENTRY(jint, jni_ThrowNew(JNIEnv *env, jclass clazz, const char *message))
719 JNIWrapper("ThrowNew"); 631 JNIWrapper("ThrowNew");
720 #ifndef USDT2 632
721 DTRACE_PROBE3(hotspot_jni, ThrowNew__entry, env, clazz, message);
722 #else /* USDT2 */
723 HOTSPOT_JNI_THROWNEW_ENTRY(env, clazz, (char *) message); 633 HOTSPOT_JNI_THROWNEW_ENTRY(env, clazz, (char *) message);
724 #endif /* USDT2 */ 634
725 jint ret = JNI_OK; 635 jint ret = JNI_OK;
726 DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret); 636 DT_RETURN_MARK(ThrowNew, jint, (const jint&)ret);
727 637
728 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz))); 638 InstanceKlass* k = InstanceKlass::cast(java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
729 Symbol* name = k->name(); 639 Symbol* name = k->name();
748 thread->check_and_handle_async_exceptions(); 658 thread->check_and_handle_async_exceptions();
749 } 659 }
750 660
751 JNI_ENTRY_NO_PRESERVE(jthrowable, jni_ExceptionOccurred(JNIEnv *env)) 661 JNI_ENTRY_NO_PRESERVE(jthrowable, jni_ExceptionOccurred(JNIEnv *env))
752 JNIWrapper("ExceptionOccurred"); 662 JNIWrapper("ExceptionOccurred");
753 #ifndef USDT2 663
754 DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__entry, env);
755 #else /* USDT2 */
756 HOTSPOT_JNI_EXCEPTIONOCCURRED_ENTRY(env); 664 HOTSPOT_JNI_EXCEPTIONOCCURRED_ENTRY(env);
757 #endif /* USDT2 */ 665
758 jni_check_async_exceptions(thread); 666 jni_check_async_exceptions(thread);
759 oop exception = thread->pending_exception(); 667 oop exception = thread->pending_exception();
760 jthrowable ret = (jthrowable) JNIHandles::make_local(env, exception); 668 jthrowable ret = (jthrowable) JNIHandles::make_local(env, exception);
761 #ifndef USDT2 669
762 DTRACE_PROBE1(hotspot_jni, ExceptionOccurred__return, ret);
763 #else /* USDT2 */
764 HOTSPOT_JNI_EXCEPTIONOCCURRED_RETURN(ret); 670 HOTSPOT_JNI_EXCEPTIONOCCURRED_RETURN(ret);
765 #endif /* USDT2 */
766 return ret; 671 return ret;
767 JNI_END 672 JNI_END
768 673
769 674
770 JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionDescribe(JNIEnv *env)) 675 JNI_ENTRY_NO_PRESERVE(void, jni_ExceptionDescribe(JNIEnv *env))
771 JNIWrapper("ExceptionDescribe"); 676 JNIWrapper("ExceptionDescribe");
772 #ifndef USDT2 677
773 DTRACE_PROBE1(hotspot_jni, ExceptionDescribe__entry, env);
774 #else /* USDT2 */
775 HOTSPOT_JNI_EXCEPTIONDESCRIBE_ENTRY(env); 678 HOTSPOT_JNI_EXCEPTIONDESCRIBE_ENTRY(env);
776 #endif /* USDT2 */ 679
777 if (thread->has_pending_exception()) { 680 if (thread->has_pending_exception()) {
778 Handle ex(thread, thread->pending_exception()); 681 Handle ex(thread, thread->pending_exception());
779 thread->clear_pending_exception(); 682 thread->clear_pending_exception();
780 if (ex->is_a(SystemDictionary::ThreadDeath_klass())) { 683 if (ex->is_a(SystemDictionary::ThreadDeath_klass())) {
781 // Don't print anything if we are being killed. 684 // Don't print anything if we are being killed.
807 ". Uncaught exception of type %s.", 710 ". Uncaught exception of type %s.",
808 ex->klass()->external_name()); 711 ex->klass()->external_name());
809 } 712 }
810 } 713 }
811 } 714 }
812 #ifndef USDT2 715
813 DTRACE_PROBE(hotspot_jni, ExceptionDescribe__return);
814 #else /* USDT2 */
815 HOTSPOT_JNI_EXCEPTIONDESCRIBE_RETURN(); 716 HOTSPOT_JNI_EXCEPTIONDESCRIBE_RETURN();
816 #endif /* USDT2 */
817 JNI_END 717 JNI_END
818 718
819 719
820 JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env)) 720 JNI_QUICK_ENTRY(void, jni_ExceptionClear(JNIEnv *env))
821 JNIWrapper("ExceptionClear"); 721 JNIWrapper("ExceptionClear");
822 #ifndef USDT2 722
823 DTRACE_PROBE1(hotspot_jni, ExceptionClear__entry, env);
824 #else /* USDT2 */
825 HOTSPOT_JNI_EXCEPTIONCLEAR_ENTRY(env); 723 HOTSPOT_JNI_EXCEPTIONCLEAR_ENTRY(env);
826 #endif /* USDT2 */
827 724
828 // The jni code might be using this API to clear java thrown exception. 725 // The jni code might be using this API to clear java thrown exception.
829 // So just mark jvmti thread exception state as exception caught. 726 // So just mark jvmti thread exception state as exception caught.
830 JvmtiThreadState *state = JavaThread::current()->jvmti_thread_state(); 727 JvmtiThreadState *state = JavaThread::current()->jvmti_thread_state();
831 if (state != NULL && state->is_exception_detected()) { 728 if (state != NULL && state->is_exception_detected()) {
832 state->set_exception_caught(); 729 state->set_exception_caught();
833 } 730 }
834 thread->clear_pending_exception(); 731 thread->clear_pending_exception();
835 #ifndef USDT2 732
836 DTRACE_PROBE(hotspot_jni, ExceptionClear__return);
837 #else /* USDT2 */
838 HOTSPOT_JNI_EXCEPTIONCLEAR_RETURN(); 733 HOTSPOT_JNI_EXCEPTIONCLEAR_RETURN();
839 #endif /* USDT2 */
840 JNI_END 734 JNI_END
841 735
842 736
843 JNI_ENTRY(void, jni_FatalError(JNIEnv *env, const char *msg)) 737 JNI_ENTRY(void, jni_FatalError(JNIEnv *env, const char *msg))
844 JNIWrapper("FatalError"); 738 JNIWrapper("FatalError");
845 #ifndef USDT2 739
846 DTRACE_PROBE2(hotspot_jni, FatalError__entry, env, msg);
847 #else /* USDT2 */
848 HOTSPOT_JNI_FATALERROR_ENTRY(env, (char *) msg); 740 HOTSPOT_JNI_FATALERROR_ENTRY(env, (char *) msg);
849 #endif /* USDT2 */ 741
850 tty->print_cr("FATAL ERROR in native method: %s", msg); 742 tty->print_cr("FATAL ERROR in native method: %s", msg);
851 thread->print_stack(); 743 thread->print_stack();
852 os::abort(); // Dump core and abort 744 os::abort(); // Dump core and abort
853 JNI_END 745 JNI_END
854 746
855 747
856 JNI_ENTRY(jint, jni_PushLocalFrame(JNIEnv *env, jint capacity)) 748 JNI_ENTRY(jint, jni_PushLocalFrame(JNIEnv *env, jint capacity))
857 JNIWrapper("PushLocalFrame"); 749 JNIWrapper("PushLocalFrame");
858 #ifndef USDT2 750
859 DTRACE_PROBE2(hotspot_jni, PushLocalFrame__entry, env, capacity);
860 #else /* USDT2 */
861 HOTSPOT_JNI_PUSHLOCALFRAME_ENTRY(env, capacity); 751 HOTSPOT_JNI_PUSHLOCALFRAME_ENTRY(env, capacity);
862 #endif /* USDT2 */ 752
863 //%note jni_11 753 //%note jni_11
864 if (capacity < 0 || capacity > MAX_REASONABLE_LOCAL_CAPACITY) { 754 if (capacity < 0 || capacity > MAX_REASONABLE_LOCAL_CAPACITY) {
865 #ifndef USDT2
866 DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, JNI_ERR);
867 #else /* USDT2 */
868 HOTSPOT_JNI_PUSHLOCALFRAME_RETURN((uint32_t)JNI_ERR); 755 HOTSPOT_JNI_PUSHLOCALFRAME_RETURN((uint32_t)JNI_ERR);
869 #endif /* USDT2 */
870 return JNI_ERR; 756 return JNI_ERR;
871 } 757 }
872 JNIHandleBlock* old_handles = thread->active_handles(); 758 JNIHandleBlock* old_handles = thread->active_handles();
873 JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread); 759 JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
874 assert(new_handles != NULL, "should not be NULL"); 760 assert(new_handles != NULL, "should not be NULL");
875 new_handles->set_pop_frame_link(old_handles); 761 new_handles->set_pop_frame_link(old_handles);
876 thread->set_active_handles(new_handles); 762 thread->set_active_handles(new_handles);
877 jint ret = JNI_OK; 763 jint ret = JNI_OK;
878 #ifndef USDT2
879 DTRACE_PROBE1(hotspot_jni, PushLocalFrame__return, ret);
880 #else /* USDT2 */
881 HOTSPOT_JNI_PUSHLOCALFRAME_RETURN(ret); 764 HOTSPOT_JNI_PUSHLOCALFRAME_RETURN(ret);
882 #endif /* USDT2 */
883 return ret; 765 return ret;
884 JNI_END 766 JNI_END
885 767
886 768
887 JNI_ENTRY(jobject, jni_PopLocalFrame(JNIEnv *env, jobject result)) 769 JNI_ENTRY(jobject, jni_PopLocalFrame(JNIEnv *env, jobject result))
888 JNIWrapper("PopLocalFrame"); 770 JNIWrapper("PopLocalFrame");
889 #ifndef USDT2 771
890 DTRACE_PROBE2(hotspot_jni, PopLocalFrame__entry, env, result);
891 #else /* USDT2 */
892 HOTSPOT_JNI_POPLOCALFRAME_ENTRY(env, result); 772 HOTSPOT_JNI_POPLOCALFRAME_ENTRY(env, result);
893 #endif /* USDT2 */ 773
894 //%note jni_11 774 //%note jni_11
895 Handle result_handle(thread, JNIHandles::resolve(result)); 775 Handle result_handle(thread, JNIHandles::resolve(result));
896 JNIHandleBlock* old_handles = thread->active_handles(); 776 JNIHandleBlock* old_handles = thread->active_handles();
897 JNIHandleBlock* new_handles = old_handles->pop_frame_link(); 777 JNIHandleBlock* new_handles = old_handles->pop_frame_link();
898 if (new_handles != NULL) { 778 if (new_handles != NULL) {
903 thread->set_active_handles(new_handles); 783 thread->set_active_handles(new_handles);
904 old_handles->set_pop_frame_link(NULL); // clear link we won't release new_handles below 784 old_handles->set_pop_frame_link(NULL); // clear link we won't release new_handles below
905 JNIHandleBlock::release_block(old_handles, thread); // may block 785 JNIHandleBlock::release_block(old_handles, thread); // may block
906 result = JNIHandles::make_local(thread, result_handle()); 786 result = JNIHandles::make_local(thread, result_handle());
907 } 787 }
908 #ifndef USDT2
909 DTRACE_PROBE1(hotspot_jni, PopLocalFrame__return, result);
910 #else /* USDT2 */
911 HOTSPOT_JNI_POPLOCALFRAME_RETURN(result); 788 HOTSPOT_JNI_POPLOCALFRAME_RETURN(result);
912 #endif /* USDT2 */
913 return result; 789 return result;
914 JNI_END 790 JNI_END
915 791
916 792
917 JNI_ENTRY(jobject, jni_NewGlobalRef(JNIEnv *env, jobject ref)) 793 JNI_ENTRY(jobject, jni_NewGlobalRef(JNIEnv *env, jobject ref))
918 JNIWrapper("NewGlobalRef"); 794 JNIWrapper("NewGlobalRef");
919 #ifndef USDT2 795
920 DTRACE_PROBE2(hotspot_jni, NewGlobalRef__entry, env, ref);
921 #else /* USDT2 */
922 HOTSPOT_JNI_NEWGLOBALREF_ENTRY(env, ref); 796 HOTSPOT_JNI_NEWGLOBALREF_ENTRY(env, ref);
923 #endif /* USDT2 */ 797
924 Handle ref_handle(thread, JNIHandles::resolve(ref)); 798 Handle ref_handle(thread, JNIHandles::resolve(ref));
925 jobject ret = JNIHandles::make_global(ref_handle); 799 jobject ret = JNIHandles::make_global(ref_handle);
926 #ifndef USDT2 800
927 DTRACE_PROBE1(hotspot_jni, NewGlobalRef__return, ret);
928 #else /* USDT2 */
929 HOTSPOT_JNI_NEWGLOBALREF_RETURN(ret); 801 HOTSPOT_JNI_NEWGLOBALREF_RETURN(ret);
930 #endif /* USDT2 */
931 return ret; 802 return ret;
932 JNI_END 803 JNI_END
933 804
934 // Must be JNI_ENTRY (with HandleMark) 805 // Must be JNI_ENTRY (with HandleMark)
935 JNI_ENTRY_NO_PRESERVE(void, jni_DeleteGlobalRef(JNIEnv *env, jobject ref)) 806 JNI_ENTRY_NO_PRESERVE(void, jni_DeleteGlobalRef(JNIEnv *env, jobject ref))
936 JNIWrapper("DeleteGlobalRef"); 807 JNIWrapper("DeleteGlobalRef");
937 #ifndef USDT2 808
938 DTRACE_PROBE2(hotspot_jni, DeleteGlobalRef__entry, env, ref);
939 #else /* USDT2 */
940 HOTSPOT_JNI_DELETEGLOBALREF_ENTRY(env, ref); 809 HOTSPOT_JNI_DELETEGLOBALREF_ENTRY(env, ref);
941 #endif /* USDT2 */ 810
942 JNIHandles::destroy_global(ref); 811 JNIHandles::destroy_global(ref);
943 #ifndef USDT2 812
944 DTRACE_PROBE(hotspot_jni, DeleteGlobalRef__return);
945 #else /* USDT2 */
946 HOTSPOT_JNI_DELETEGLOBALREF_RETURN(); 813 HOTSPOT_JNI_DELETEGLOBALREF_RETURN();
947 #endif /* USDT2 */
948 JNI_END 814 JNI_END
949 815
950 JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj)) 816 JNI_QUICK_ENTRY(void, jni_DeleteLocalRef(JNIEnv *env, jobject obj))
951 JNIWrapper("DeleteLocalRef"); 817 JNIWrapper("DeleteLocalRef");
952 #ifndef USDT2 818
953 DTRACE_PROBE2(hotspot_jni, DeleteLocalRef__entry, env, obj);
954 #else /* USDT2 */
955 HOTSPOT_JNI_DELETELOCALREF_ENTRY(env, obj); 819 HOTSPOT_JNI_DELETELOCALREF_ENTRY(env, obj);
956 #endif /* USDT2 */ 820
957 JNIHandles::destroy_local(obj); 821 JNIHandles::destroy_local(obj);
958 #ifndef USDT2 822
959 DTRACE_PROBE(hotspot_jni, DeleteLocalRef__return);
960 #else /* USDT2 */
961 HOTSPOT_JNI_DELETELOCALREF_RETURN(); 823 HOTSPOT_JNI_DELETELOCALREF_RETURN();
962 #endif /* USDT2 */
963 JNI_END 824 JNI_END
964 825
965 JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2)) 826 JNI_QUICK_ENTRY(jboolean, jni_IsSameObject(JNIEnv *env, jobject r1, jobject r2))
966 JNIWrapper("IsSameObject"); 827 JNIWrapper("IsSameObject");
967 #ifndef USDT2 828
968 DTRACE_PROBE3(hotspot_jni, IsSameObject__entry, env, r1, r2);
969 #else /* USDT2 */
970 HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2); 829 HOTSPOT_JNI_ISSAMEOBJECT_ENTRY(env, r1, r2);
971 #endif /* USDT2 */ 830
972 oop a = JNIHandles::resolve(r1); 831 oop a = JNIHandles::resolve(r1);
973 oop b = JNIHandles::resolve(r2); 832 oop b = JNIHandles::resolve(r2);
974 jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE; 833 jboolean ret = (a == b) ? JNI_TRUE : JNI_FALSE;
975 #ifndef USDT2 834
976 DTRACE_PROBE1(hotspot_jni, IsSameObject__return, ret);
977 #else /* USDT2 */
978 HOTSPOT_JNI_ISSAMEOBJECT_RETURN(ret); 835 HOTSPOT_JNI_ISSAMEOBJECT_RETURN(ret);
979 #endif /* USDT2 */
980 return ret; 836 return ret;
981 JNI_END 837 JNI_END
982 838
983 839
984 JNI_ENTRY(jobject, jni_NewLocalRef(JNIEnv *env, jobject ref)) 840 JNI_ENTRY(jobject, jni_NewLocalRef(JNIEnv *env, jobject ref))
985 JNIWrapper("NewLocalRef"); 841 JNIWrapper("NewLocalRef");
986 #ifndef USDT2 842
987 DTRACE_PROBE2(hotspot_jni, NewLocalRef__entry, env, ref);
988 #else /* USDT2 */
989 HOTSPOT_JNI_NEWLOCALREF_ENTRY(env, ref); 843 HOTSPOT_JNI_NEWLOCALREF_ENTRY(env, ref);
990 #endif /* USDT2 */ 844
991 jobject ret = JNIHandles::make_local(env, JNIHandles::resolve(ref)); 845 jobject ret = JNIHandles::make_local(env, JNIHandles::resolve(ref));
992 #ifndef USDT2 846
993 DTRACE_PROBE1(hotspot_jni, NewLocalRef__return, ret);
994 #else /* USDT2 */
995 HOTSPOT_JNI_NEWLOCALREF_RETURN(ret); 847 HOTSPOT_JNI_NEWLOCALREF_RETURN(ret);
996 #endif /* USDT2 */
997 return ret; 848 return ret;
998 JNI_END 849 JNI_END
999 850
1000 JNI_LEAF(jint, jni_EnsureLocalCapacity(JNIEnv *env, jint capacity)) 851 JNI_LEAF(jint, jni_EnsureLocalCapacity(JNIEnv *env, jint capacity))
1001 JNIWrapper("EnsureLocalCapacity"); 852 JNIWrapper("EnsureLocalCapacity");
1002 #ifndef USDT2 853
1003 DTRACE_PROBE2(hotspot_jni, EnsureLocalCapacity__entry, env, capacity);
1004 #else /* USDT2 */
1005 HOTSPOT_JNI_ENSURELOCALCAPACITY_ENTRY(env, capacity); 854 HOTSPOT_JNI_ENSURELOCALCAPACITY_ENTRY(env, capacity);
1006 #endif /* USDT2 */ 855
1007 jint ret; 856 jint ret;
1008 if (capacity >= 0 && capacity <= MAX_REASONABLE_LOCAL_CAPACITY) { 857 if (capacity >= 0 && capacity <= MAX_REASONABLE_LOCAL_CAPACITY) {
1009 ret = JNI_OK; 858 ret = JNI_OK;
1010 } else { 859 } else {
1011 ret = JNI_ERR; 860 ret = JNI_ERR;
1012 } 861 }
1013 #ifndef USDT2 862
1014 DTRACE_PROBE1(hotspot_jni, EnsureLocalCapacity__return, ret);
1015 #else /* USDT2 */
1016 HOTSPOT_JNI_ENSURELOCALCAPACITY_RETURN(ret); 863 HOTSPOT_JNI_ENSURELOCALCAPACITY_RETURN(ret);
1017 #endif /* USDT2 */
1018 return ret; 864 return ret;
1019 JNI_END 865 JNI_END
1020 866
1021 // Return the Handle Type 867 // Return the Handle Type
1022 JNI_LEAF(jobjectRefType, jni_GetObjectRefType(JNIEnv *env, jobject obj)) 868 JNI_LEAF(jobjectRefType, jni_GetObjectRefType(JNIEnv *env, jobject obj))
1023 JNIWrapper("GetObjectRefType"); 869 JNIWrapper("GetObjectRefType");
1024 #ifndef USDT2 870
1025 DTRACE_PROBE2(hotspot_jni, GetObjectRefType__entry, env, obj);
1026 #else /* USDT2 */
1027 HOTSPOT_JNI_GETOBJECTREFTYPE_ENTRY(env, obj); 871 HOTSPOT_JNI_GETOBJECTREFTYPE_ENTRY(env, obj);
1028 #endif /* USDT2 */ 872
1029 jobjectRefType ret; 873 jobjectRefType ret;
1030 if (JNIHandles::is_local_handle(thread, obj) || 874 if (JNIHandles::is_local_handle(thread, obj) ||
1031 JNIHandles::is_frame_handle(thread, obj)) 875 JNIHandles::is_frame_handle(thread, obj))
1032 ret = JNILocalRefType; 876 ret = JNILocalRefType;
1033 else if (JNIHandles::is_global_handle(obj)) 877 else if (JNIHandles::is_global_handle(obj))
1034 ret = JNIGlobalRefType; 878 ret = JNIGlobalRefType;
1035 else if (JNIHandles::is_weak_global_handle(obj)) 879 else if (JNIHandles::is_weak_global_handle(obj))
1036 ret = JNIWeakGlobalRefType; 880 ret = JNIWeakGlobalRefType;
1037 else 881 else
1038 ret = JNIInvalidRefType; 882 ret = JNIInvalidRefType;
1039 #ifndef USDT2 883
1040 DTRACE_PROBE1(hotspot_jni, GetObjectRefType__return, ret);
1041 #else /* USDT2 */
1042 HOTSPOT_JNI_GETOBJECTREFTYPE_RETURN((void *) ret); 884 HOTSPOT_JNI_GETOBJECTREFTYPE_RETURN((void *) ret);
1043 #endif /* USDT2 */
1044 return ret; 885 return ret;
1045 JNI_END 886 JNI_END
1046 887
1047 888
1048 class JNI_ArgumentPusher : public SignatureIterator { 889 class JNI_ArgumentPusher : public SignatureIterator {
1367 InstanceKlass::cast(k())->initialize(CHECK_NULL); 1208 InstanceKlass::cast(k())->initialize(CHECK_NULL);
1368 instanceOop ih = InstanceKlass::cast(k())->allocate_instance(THREAD); 1209 instanceOop ih = InstanceKlass::cast(k())->allocate_instance(THREAD);
1369 return ih; 1210 return ih;
1370 } 1211 }
1371 1212
1372 #ifndef USDT2
1373 DT_RETURN_MARK_DECL(AllocObject, jobject);
1374 #else /* USDT2 */
1375 DT_RETURN_MARK_DECL(AllocObject, jobject 1213 DT_RETURN_MARK_DECL(AllocObject, jobject
1376 , HOTSPOT_JNI_ALLOCOBJECT_RETURN(_ret_ref)); 1214 , HOTSPOT_JNI_ALLOCOBJECT_RETURN(_ret_ref));
1377 #endif /* USDT2 */
1378 1215
1379 JNI_ENTRY(jobject, jni_AllocObject(JNIEnv *env, jclass clazz)) 1216 JNI_ENTRY(jobject, jni_AllocObject(JNIEnv *env, jclass clazz))
1380 JNIWrapper("AllocObject"); 1217 JNIWrapper("AllocObject");
1381 1218
1382 #ifndef USDT2
1383 DTRACE_PROBE2(hotspot_jni, AllocObject__entry, env, clazz);
1384 #else /* USDT2 */
1385 HOTSPOT_JNI_ALLOCOBJECT_ENTRY(env, clazz); 1219 HOTSPOT_JNI_ALLOCOBJECT_ENTRY(env, clazz);
1386 #endif /* USDT2 */ 1220
1387 jobject ret = NULL; 1221 jobject ret = NULL;
1388 DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret); 1222 DT_RETURN_MARK(AllocObject, jobject, (const jobject&)ret);
1389 1223
1390 instanceOop i = alloc_object(clazz, CHECK_NULL); 1224 instanceOop i = alloc_object(clazz, CHECK_NULL);
1391 ret = JNIHandles::make_local(env, i); 1225 ret = JNIHandles::make_local(env, i);
1392 return ret; 1226 return ret;
1393 JNI_END 1227 JNI_END
1394 1228
1395 #ifndef USDT2
1396 DT_RETURN_MARK_DECL(NewObjectA, jobject);
1397 #else /* USDT2 */
1398 DT_RETURN_MARK_DECL(NewObjectA, jobject 1229 DT_RETURN_MARK_DECL(NewObjectA, jobject
1399 , HOTSPOT_JNI_NEWOBJECTA_RETURN(_ret_ref)); 1230 , HOTSPOT_JNI_NEWOBJECTA_RETURN(_ret_ref));
1400 #endif /* USDT2 */
1401 1231
1402 JNI_ENTRY(jobject, jni_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args)) 1232 JNI_ENTRY(jobject, jni_NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args))
1403 JNIWrapper("NewObjectA"); 1233 JNIWrapper("NewObjectA");
1404 #ifndef USDT2 1234
1405 DTRACE_PROBE3(hotspot_jni, NewObjectA__entry, env, clazz, methodID);
1406 #else /* USDT2 */
1407 HOTSPOT_JNI_NEWOBJECTA_ENTRY(env, clazz, (uintptr_t) methodID); 1235 HOTSPOT_JNI_NEWOBJECTA_ENTRY(env, clazz, (uintptr_t) methodID);
1408 #endif /* USDT2 */ 1236
1409 jobject obj = NULL; 1237 jobject obj = NULL;
1410 DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj); 1238 DT_RETURN_MARK(NewObjectA, jobject, (const jobject)obj);
1411 1239
1412 instanceOop i = alloc_object(clazz, CHECK_NULL); 1240 instanceOop i = alloc_object(clazz, CHECK_NULL);
1413 obj = JNIHandles::make_local(env, i); 1241 obj = JNIHandles::make_local(env, i);
1415 JNI_ArgumentPusherArray ap(methodID, args); 1243 JNI_ArgumentPusherArray ap(methodID, args);
1416 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL); 1244 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
1417 return obj; 1245 return obj;
1418 JNI_END 1246 JNI_END
1419 1247
1420 #ifndef USDT2 1248
1421 DT_RETURN_MARK_DECL(NewObjectV, jobject);
1422 #else /* USDT2 */
1423 DT_RETURN_MARK_DECL(NewObjectV, jobject 1249 DT_RETURN_MARK_DECL(NewObjectV, jobject
1424 , HOTSPOT_JNI_NEWOBJECTV_RETURN(_ret_ref)); 1250 , HOTSPOT_JNI_NEWOBJECTV_RETURN(_ret_ref));
1425 #endif /* USDT2 */
1426 1251
1427 JNI_ENTRY(jobject, jni_NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)) 1252 JNI_ENTRY(jobject, jni_NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args))
1428 JNIWrapper("NewObjectV"); 1253 JNIWrapper("NewObjectV");
1429 #ifndef USDT2 1254
1430 DTRACE_PROBE3(hotspot_jni, NewObjectV__entry, env, clazz, methodID);
1431 #else /* USDT2 */
1432 HOTSPOT_JNI_NEWOBJECTV_ENTRY(env, clazz, (uintptr_t) methodID); 1255 HOTSPOT_JNI_NEWOBJECTV_ENTRY(env, clazz, (uintptr_t) methodID);
1433 #endif /* USDT2 */ 1256
1434 jobject obj = NULL; 1257 jobject obj = NULL;
1435 DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj); 1258 DT_RETURN_MARK(NewObjectV, jobject, (const jobject&)obj);
1436 1259
1437 instanceOop i = alloc_object(clazz, CHECK_NULL); 1260 instanceOop i = alloc_object(clazz, CHECK_NULL);
1438 obj = JNIHandles::make_local(env, i); 1261 obj = JNIHandles::make_local(env, i);
1440 JNI_ArgumentPusherVaArg ap(methodID, args); 1263 JNI_ArgumentPusherVaArg ap(methodID, args);
1441 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL); 1264 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_NULL);
1442 return obj; 1265 return obj;
1443 JNI_END 1266 JNI_END
1444 1267
1445 #ifndef USDT2 1268
1446 DT_RETURN_MARK_DECL(NewObject, jobject);
1447 #else /* USDT2 */
1448 DT_RETURN_MARK_DECL(NewObject, jobject 1269 DT_RETURN_MARK_DECL(NewObject, jobject
1449 , HOTSPOT_JNI_NEWOBJECT_RETURN(_ret_ref)); 1270 , HOTSPOT_JNI_NEWOBJECT_RETURN(_ret_ref));
1450 #endif /* USDT2 */
1451 1271
1452 JNI_ENTRY(jobject, jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)) 1272 JNI_ENTRY(jobject, jni_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...))
1453 JNIWrapper("NewObject"); 1273 JNIWrapper("NewObject");
1454 #ifndef USDT2 1274
1455 DTRACE_PROBE3(hotspot_jni, NewObject__entry, env, clazz, methodID);
1456 #else /* USDT2 */
1457 HOTSPOT_JNI_NEWOBJECT_ENTRY(env, clazz, (uintptr_t) methodID); 1275 HOTSPOT_JNI_NEWOBJECT_ENTRY(env, clazz, (uintptr_t) methodID);
1458 #endif /* USDT2 */ 1276
1459 jobject obj = NULL; 1277 jobject obj = NULL;
1460 DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj); 1278 DT_RETURN_MARK(NewObject, jobject, (const jobject&)obj);
1461 1279
1462 instanceOop i = alloc_object(clazz, CHECK_NULL); 1280 instanceOop i = alloc_object(clazz, CHECK_NULL);
1463 obj = JNIHandles::make_local(env, i); 1281 obj = JNIHandles::make_local(env, i);
1471 JNI_END 1289 JNI_END
1472 1290
1473 1291
1474 JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj)) 1292 JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
1475 JNIWrapper("GetObjectClass"); 1293 JNIWrapper("GetObjectClass");
1476 #ifndef USDT2 1294
1477 DTRACE_PROBE2(hotspot_jni, GetObjectClass__entry, env, obj);
1478 #else /* USDT2 */
1479 HOTSPOT_JNI_GETOBJECTCLASS_ENTRY(env, obj); 1295 HOTSPOT_JNI_GETOBJECTCLASS_ENTRY(env, obj);
1480 #endif /* USDT2 */ 1296
1481 Klass* k = JNIHandles::resolve_non_null(obj)->klass(); 1297 Klass* k = JNIHandles::resolve_non_null(obj)->klass();
1482 jclass ret = 1298 jclass ret =
1483 (jclass) JNIHandles::make_local(env, k->java_mirror()); 1299 (jclass) JNIHandles::make_local(env, k->java_mirror());
1484 #ifndef USDT2 1300
1485 DTRACE_PROBE1(hotspot_jni, GetObjectClass__return, ret);
1486 #else /* USDT2 */
1487 HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret); 1301 HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret);
1488 #endif /* USDT2 */
1489 return ret; 1302 return ret;
1490 JNI_END 1303 JNI_END
1491 1304
1492 JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)) 1305 JNI_QUICK_ENTRY(jboolean, jni_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz))
1493 JNIWrapper("IsInstanceOf"); 1306 JNIWrapper("IsInstanceOf");
1494 #ifndef USDT2 1307
1495 DTRACE_PROBE3(hotspot_jni, IsInstanceOf__entry, env, obj, clazz);
1496 #else /* USDT2 */
1497 HOTSPOT_JNI_ISINSTANCEOF_ENTRY(env, obj, clazz); 1308 HOTSPOT_JNI_ISINSTANCEOF_ENTRY(env, obj, clazz);
1498 #endif /* USDT2 */ 1309
1499 jboolean ret = JNI_TRUE; 1310 jboolean ret = JNI_TRUE;
1500 if (obj != NULL) { 1311 if (obj != NULL) {
1501 ret = JNI_FALSE; 1312 ret = JNI_FALSE;
1502 Klass* k = java_lang_Class::as_Klass( 1313 Klass* k = java_lang_Class::as_Klass(
1503 JNIHandles::resolve_non_null(clazz)); 1314 JNIHandles::resolve_non_null(clazz));
1504 if (k != NULL) { 1315 if (k != NULL) {
1505 ret = JNIHandles::resolve_non_null(obj)->is_a(k) ? JNI_TRUE : JNI_FALSE; 1316 ret = JNIHandles::resolve_non_null(obj)->is_a(k) ? JNI_TRUE : JNI_FALSE;
1506 } 1317 }
1507 } 1318 }
1508 #ifndef USDT2 1319
1509 DTRACE_PROBE1(hotspot_jni, IsInstanceOf__return, ret);
1510 #else /* USDT2 */
1511 HOTSPOT_JNI_ISINSTANCEOF_RETURN(ret); 1320 HOTSPOT_JNI_ISINSTANCEOF_RETURN(ret);
1512 #endif /* USDT2 */
1513 return ret; 1321 return ret;
1514 JNI_END 1322 JNI_END
1515 1323
1516 1324
1517 static jmethodID get_method_id(JNIEnv *env, jclass clazz, const char *name_str, 1325 static jmethodID get_method_id(JNIEnv *env, jclass clazz, const char *name_str,
1567 1375
1568 1376
1569 JNI_ENTRY(jmethodID, jni_GetMethodID(JNIEnv *env, jclass clazz, 1377 JNI_ENTRY(jmethodID, jni_GetMethodID(JNIEnv *env, jclass clazz,
1570 const char *name, const char *sig)) 1378 const char *name, const char *sig))
1571 JNIWrapper("GetMethodID"); 1379 JNIWrapper("GetMethodID");
1572 #ifndef USDT2
1573 DTRACE_PROBE4(hotspot_jni, GetMethodID__entry, env, clazz, name, sig);
1574 #else /* USDT2 */
1575 HOTSPOT_JNI_GETMETHODID_ENTRY(env, clazz, (char *) name, (char *) sig); 1380 HOTSPOT_JNI_GETMETHODID_ENTRY(env, clazz, (char *) name, (char *) sig);
1576 #endif /* USDT2 */
1577 jmethodID ret = get_method_id(env, clazz, name, sig, false, thread); 1381 jmethodID ret = get_method_id(env, clazz, name, sig, false, thread);
1578 #ifndef USDT2
1579 DTRACE_PROBE1(hotspot_jni, GetMethodID__return, ret);
1580 #else /* USDT2 */
1581 HOTSPOT_JNI_GETMETHODID_RETURN((uintptr_t) ret); 1382 HOTSPOT_JNI_GETMETHODID_RETURN((uintptr_t) ret);
1582 #endif /* USDT2 */
1583 return ret; 1383 return ret;
1584 JNI_END 1384 JNI_END
1585 1385
1586 1386
1587 JNI_ENTRY(jmethodID, jni_GetStaticMethodID(JNIEnv *env, jclass clazz, 1387 JNI_ENTRY(jmethodID, jni_GetStaticMethodID(JNIEnv *env, jclass clazz,
1588 const char *name, const char *sig)) 1388 const char *name, const char *sig))
1589 JNIWrapper("GetStaticMethodID"); 1389 JNIWrapper("GetStaticMethodID");
1590 #ifndef USDT2
1591 DTRACE_PROBE4(hotspot_jni, GetStaticMethodID__entry, env, clazz, name, sig);
1592 #else /* USDT2 */
1593 HOTSPOT_JNI_GETSTATICMETHODID_ENTRY(env, (char *) clazz, (char *) name, (char *)sig); 1390 HOTSPOT_JNI_GETSTATICMETHODID_ENTRY(env, (char *) clazz, (char *) name, (char *)sig);
1594 #endif /* USDT2 */
1595 jmethodID ret = get_method_id(env, clazz, name, sig, true, thread); 1391 jmethodID ret = get_method_id(env, clazz, name, sig, true, thread);
1596 #ifndef USDT2
1597 DTRACE_PROBE1(hotspot_jni, GetStaticMethodID__return, ret);
1598 #else /* USDT2 */
1599 HOTSPOT_JNI_GETSTATICMETHODID_RETURN((uintptr_t) ret); 1392 HOTSPOT_JNI_GETSTATICMETHODID_RETURN((uintptr_t) ret);
1600 #endif /* USDT2 */
1601 return ret; 1393 return ret;
1602 JNI_END 1394 JNI_END
1603 1395
1604 1396
1605 1397
1606 // 1398 //
1607 // Calling Methods 1399 // Calling Methods
1608 // 1400 //
1609 1401
1610 #ifndef USDT2
1611 #define DEFINE_CALLMETHOD(ResultType, Result, Tag) \
1612 \
1613 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType);\
1614 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodV, ResultType);\
1615 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##MethodA, ResultType);\
1616 \
1617 JNI_ENTRY(ResultType, \
1618 jni_Call##Result##Method(JNIEnv *env, jobject obj, jmethodID methodID, ...)) \
1619 JNIWrapper("Call" XSTR(Result) "Method"); \
1620 \
1621 DTRACE_PROBE3(hotspot_jni, Call##Result##Method__entry, env, obj, methodID); \
1622 ResultType ret = 0;\
1623 DT_RETURN_MARK_FOR(Result, Call##Result##Method, ResultType, \
1624 (const ResultType&)ret);\
1625 \
1626 va_list args; \
1627 va_start(args, methodID); \
1628 JavaValue jvalue(Tag); \
1629 JNI_ArgumentPusherVaArg ap(methodID, args); \
1630 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
1631 va_end(args); \
1632 ret = jvalue.get_##ResultType(); \
1633 return ret;\
1634 JNI_END \
1635 \
1636 \
1637 JNI_ENTRY(ResultType, \
1638 jni_Call##Result##MethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) \
1639 JNIWrapper("Call" XSTR(Result) "MethodV"); \
1640 \
1641 DTRACE_PROBE3(hotspot_jni, Call##Result##MethodV__entry, env, obj, methodID); \
1642 ResultType ret = 0;\
1643 DT_RETURN_MARK_FOR(Result, Call##Result##MethodV, ResultType, \
1644 (const ResultType&)ret);\
1645 \
1646 JavaValue jvalue(Tag); \
1647 JNI_ArgumentPusherVaArg ap(methodID, args); \
1648 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
1649 ret = jvalue.get_##ResultType(); \
1650 return ret;\
1651 JNI_END \
1652 \
1653 \
1654 JNI_ENTRY(ResultType, \
1655 jni_Call##Result##MethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) \
1656 JNIWrapper("Call" XSTR(Result) "MethodA"); \
1657 DTRACE_PROBE3(hotspot_jni, Call##Result##MethodA__entry, env, obj, methodID); \
1658 ResultType ret = 0;\
1659 DT_RETURN_MARK_FOR(Result, Call##Result##MethodA, ResultType, \
1660 (const ResultType&)ret);\
1661 \
1662 JavaValue jvalue(Tag); \
1663 JNI_ArgumentPusherArray ap(methodID, args); \
1664 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK_0); \
1665 ret = jvalue.get_##ResultType(); \
1666 return ret;\
1667 JNI_END
1668
1669 // the runtime type of subword integral basic types is integer
1670 DEFINE_CALLMETHOD(jboolean, Boolean, T_BOOLEAN)
1671 DEFINE_CALLMETHOD(jbyte, Byte, T_BYTE)
1672 DEFINE_CALLMETHOD(jchar, Char, T_CHAR)
1673 DEFINE_CALLMETHOD(jshort, Short, T_SHORT)
1674
1675 DEFINE_CALLMETHOD(jobject, Object, T_OBJECT)
1676 DEFINE_CALLMETHOD(jint, Int, T_INT)
1677 DEFINE_CALLMETHOD(jlong, Long, T_LONG)
1678 DEFINE_CALLMETHOD(jfloat, Float, T_FLOAT)
1679 DEFINE_CALLMETHOD(jdouble, Double, T_DOUBLE)
1680
1681 DT_VOID_RETURN_MARK_DECL(CallVoidMethod);
1682 DT_VOID_RETURN_MARK_DECL(CallVoidMethodV);
1683 DT_VOID_RETURN_MARK_DECL(CallVoidMethodA);
1684
1685 #else /* USDT2 */
1686 1402
1687 #define DEFINE_CALLMETHOD(ResultType, Result, Tag \ 1403 #define DEFINE_CALLMETHOD(ResultType, Result, Tag \
1688 , EntryProbe, ReturnProbe) \ 1404 , EntryProbe, ReturnProbe) \
1689 \ 1405 \
1690 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType \ 1406 DT_RETURN_MARK_DECL_FOR(Result, Call##Result##Method, ResultType \
1847 1563
1848 DT_VOID_RETURN_MARK_DECL(CallVoidMethod, HOTSPOT_JNI_CALLVOIDMETHOD_RETURN()); 1564 DT_VOID_RETURN_MARK_DECL(CallVoidMethod, HOTSPOT_JNI_CALLVOIDMETHOD_RETURN());
1849 DT_VOID_RETURN_MARK_DECL(CallVoidMethodV, HOTSPOT_JNI_CALLVOIDMETHODV_RETURN()); 1565 DT_VOID_RETURN_MARK_DECL(CallVoidMethodV, HOTSPOT_JNI_CALLVOIDMETHODV_RETURN());
1850 DT_VOID_RETURN_MARK_DECL(CallVoidMethodA, HOTSPOT_JNI_CALLVOIDMETHODA_RETURN()); 1566 DT_VOID_RETURN_MARK_DECL(CallVoidMethodA, HOTSPOT_JNI_CALLVOIDMETHODA_RETURN());
1851 1567
1852 #endif /* USDT2 */
1853 1568
1854 JNI_ENTRY(void, jni_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)) 1569 JNI_ENTRY(void, jni_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...))
1855 JNIWrapper("CallVoidMethod"); 1570 JNIWrapper("CallVoidMethod");
1856 #ifndef USDT2
1857 DTRACE_PROBE3(hotspot_jni, CallVoidMethod__entry, env, obj, methodID);
1858 #else /* USDT2 */
1859 HOTSPOT_JNI_CALLVOIDMETHOD_ENTRY(env, obj, (uintptr_t) methodID); 1571 HOTSPOT_JNI_CALLVOIDMETHOD_ENTRY(env, obj, (uintptr_t) methodID);
1860 #endif /* USDT2 */
1861 DT_VOID_RETURN_MARK(CallVoidMethod); 1572 DT_VOID_RETURN_MARK(CallVoidMethod);
1862 1573
1863 va_list args; 1574 va_list args;
1864 va_start(args, methodID); 1575 va_start(args, methodID);
1865 JavaValue jvalue(T_VOID); 1576 JavaValue jvalue(T_VOID);
1869 JNI_END 1580 JNI_END
1870 1581
1871 1582
1872 JNI_ENTRY(void, jni_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)) 1583 JNI_ENTRY(void, jni_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args))
1873 JNIWrapper("CallVoidMethodV"); 1584 JNIWrapper("CallVoidMethodV");
1874 #ifndef USDT2
1875 DTRACE_PROBE3(hotspot_jni, CallVoidMethodV__entry, env, obj, methodID);
1876 #else /* USDT2 */
1877 HOTSPOT_JNI_CALLVOIDMETHODV_ENTRY(env, obj, (uintptr_t) methodID); 1585 HOTSPOT_JNI_CALLVOIDMETHODV_ENTRY(env, obj, (uintptr_t) methodID);
1878 #endif /* USDT2 */
1879 DT_VOID_RETURN_MARK(CallVoidMethodV); 1586 DT_VOID_RETURN_MARK(CallVoidMethodV);
1880 1587
1881 JavaValue jvalue(T_VOID); 1588 JavaValue jvalue(T_VOID);
1882 JNI_ArgumentPusherVaArg ap(methodID, args); 1589 JNI_ArgumentPusherVaArg ap(methodID, args);
1883 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK); 1590 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
1884 JNI_END 1591 JNI_END
1885 1592
1886 1593
1887 JNI_ENTRY(void, jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args)) 1594 JNI_ENTRY(void, jni_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args))
1888 JNIWrapper("CallVoidMethodA"); 1595 JNIWrapper("CallVoidMethodA");
1889 #ifndef USDT2
1890 DTRACE_PROBE3(hotspot_jni, CallVoidMethodA__entry, env, obj, methodID);
1891 #else /* USDT2 */
1892 HOTSPOT_JNI_CALLVOIDMETHODA_ENTRY(env, obj, (uintptr_t) methodID); 1596 HOTSPOT_JNI_CALLVOIDMETHODA_ENTRY(env, obj, (uintptr_t) methodID);
1893 #endif /* USDT2 */
1894 DT_VOID_RETURN_MARK(CallVoidMethodA); 1597 DT_VOID_RETURN_MARK(CallVoidMethodA);
1895 1598
1896 JavaValue jvalue(T_VOID); 1599 JavaValue jvalue(T_VOID);
1897 JNI_ArgumentPusherArray ap(methodID, args); 1600 JNI_ArgumentPusherArray ap(methodID, args);
1898 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK); 1601 jni_invoke_nonstatic(env, &jvalue, obj, JNI_VIRTUAL, methodID, &ap, CHECK);
1899 JNI_END 1602 JNI_END
1900 1603
1901 1604
1902 #ifndef USDT2
1903 #define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag) \
1904 \
1905 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType);\
1906 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodV, ResultType);\
1907 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##MethodA, ResultType);\
1908 \
1909 JNI_ENTRY(ResultType, \
1910 jni_CallNonvirtual##Result##Method(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) \
1911 JNIWrapper("CallNonvitual" XSTR(Result) "Method"); \
1912 \
1913 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##Method__entry, env, obj, cls, methodID);\
1914 ResultType ret;\
1915 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##Method, ResultType, \
1916 (const ResultType&)ret);\
1917 \
1918 va_list args; \
1919 va_start(args, methodID); \
1920 JavaValue jvalue(Tag); \
1921 JNI_ArgumentPusherVaArg ap(methodID, args); \
1922 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
1923 va_end(args); \
1924 ret = jvalue.get_##ResultType(); \
1925 return ret;\
1926 JNI_END \
1927 \
1928 JNI_ENTRY(ResultType, \
1929 jni_CallNonvirtual##Result##MethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) \
1930 JNIWrapper("CallNonvitual" XSTR(Result) "#MethodV"); \
1931 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodV__entry, env, obj, cls, methodID);\
1932 ResultType ret;\
1933 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodV, ResultType, \
1934 (const ResultType&)ret);\
1935 \
1936 JavaValue jvalue(Tag); \
1937 JNI_ArgumentPusherVaArg ap(methodID, args); \
1938 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
1939 ret = jvalue.get_##ResultType(); \
1940 return ret;\
1941 JNI_END \
1942 \
1943 JNI_ENTRY(ResultType, \
1944 jni_CallNonvirtual##Result##MethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) \
1945 JNIWrapper("CallNonvitual" XSTR(Result) "MethodA"); \
1946 DTRACE_PROBE4(hotspot_jni, CallNonvirtual##Result##MethodA__entry, env, obj, cls, methodID);\
1947 ResultType ret;\
1948 DT_RETURN_MARK_FOR(Result, CallNonvirtual##Result##MethodA, ResultType, \
1949 (const ResultType&)ret);\
1950 \
1951 JavaValue jvalue(Tag); \
1952 JNI_ArgumentPusherArray ap(methodID, args); \
1953 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK_0); \
1954 ret = jvalue.get_##ResultType(); \
1955 return ret;\
1956 JNI_END
1957
1958 // the runtime type of subword integral basic types is integer
1959 DEFINE_CALLNONVIRTUALMETHOD(jboolean, Boolean, T_BOOLEAN)
1960 DEFINE_CALLNONVIRTUALMETHOD(jbyte, Byte, T_BYTE)
1961 DEFINE_CALLNONVIRTUALMETHOD(jchar, Char, T_CHAR)
1962 DEFINE_CALLNONVIRTUALMETHOD(jshort, Short, T_SHORT)
1963
1964 DEFINE_CALLNONVIRTUALMETHOD(jobject, Object, T_OBJECT)
1965 DEFINE_CALLNONVIRTUALMETHOD(jint, Int, T_INT)
1966 DEFINE_CALLNONVIRTUALMETHOD(jlong, Long, T_LONG)
1967 DEFINE_CALLNONVIRTUALMETHOD(jfloat, Float, T_FLOAT)
1968 DEFINE_CALLNONVIRTUALMETHOD(jdouble, Double, T_DOUBLE)
1969
1970
1971 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethod);
1972 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV);
1973 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA);
1974
1975 #else /* USDT2 */
1976 1605
1977 #define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag \ 1606 #define DEFINE_CALLNONVIRTUALMETHOD(ResultType, Result, Tag \
1978 , EntryProbe, ReturnProbe) \ 1607 , EntryProbe, ReturnProbe) \
1979 \ 1608 \
1980 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType \ 1609 DT_RETURN_MARK_DECL_FOR(Result, CallNonvirtual##Result##Method, ResultType \
2140 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_RETURN()); 1769 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_RETURN());
2141 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV 1770 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodV
2142 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_RETURN()); 1771 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_RETURN());
2143 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA 1772 DT_VOID_RETURN_MARK_DECL(CallNonvirtualVoidMethodA
2144 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_RETURN()); 1773 , HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_RETURN());
2145 #endif /* USDT2 */
2146 1774
2147 JNI_ENTRY(void, jni_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...)) 1775 JNI_ENTRY(void, jni_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, ...))
2148 JNIWrapper("CallNonvirtualVoidMethod"); 1776 JNIWrapper("CallNonvirtualVoidMethod");
2149 1777
2150 #ifndef USDT2
2151 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethod__entry,
2152 env, obj, cls, methodID);
2153 #else /* USDT2 */
2154 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_ENTRY(env, obj, cls, (uintptr_t) methodID); 1778 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHOD_ENTRY(env, obj, cls, (uintptr_t) methodID);
2155 #endif /* USDT2 */
2156 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethod); 1779 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethod);
2157 1780
2158 va_list args; 1781 va_list args;
2159 va_start(args, methodID); 1782 va_start(args, methodID);
2160 JavaValue jvalue(T_VOID); 1783 JavaValue jvalue(T_VOID);
2165 1788
2166 1789
2167 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args)) 1790 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, va_list args))
2168 JNIWrapper("CallNonvirtualVoidMethodV"); 1791 JNIWrapper("CallNonvirtualVoidMethodV");
2169 1792
2170 #ifndef USDT2
2171 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodV__entry,
2172 env, obj, cls, methodID);
2173 #else /* USDT2 */
2174 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_ENTRY( 1793 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODV_ENTRY(
2175 env, obj, cls, (uintptr_t) methodID); 1794 env, obj, cls, (uintptr_t) methodID);
2176 #endif /* USDT2 */
2177 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodV); 1795 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodV);
2178 1796
2179 JavaValue jvalue(T_VOID); 1797 JavaValue jvalue(T_VOID);
2180 JNI_ArgumentPusherVaArg ap(methodID, args); 1798 JNI_ArgumentPusherVaArg ap(methodID, args);
2181 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK); 1799 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
2182 JNI_END 1800 JNI_END
2183 1801
2184 1802
2185 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args)) 1803 JNI_ENTRY(void, jni_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass cls, jmethodID methodID, const jvalue *args))
2186 JNIWrapper("CallNonvirtualVoidMethodA"); 1804 JNIWrapper("CallNonvirtualVoidMethodA");
2187 #ifndef USDT2
2188 DTRACE_PROBE4(hotspot_jni, CallNonvirtualVoidMethodA__entry,
2189 env, obj, cls, methodID);
2190 #else /* USDT2 */
2191 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_ENTRY( 1805 HOTSPOT_JNI_CALLNONVIRTUALVOIDMETHODA_ENTRY(
2192 env, obj, cls, (uintptr_t) methodID); 1806 env, obj, cls, (uintptr_t) methodID);
2193 #endif /* USDT2 */
2194 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodA); 1807 DT_VOID_RETURN_MARK(CallNonvirtualVoidMethodA);
2195 JavaValue jvalue(T_VOID); 1808 JavaValue jvalue(T_VOID);
2196 JNI_ArgumentPusherArray ap(methodID, args); 1809 JNI_ArgumentPusherArray ap(methodID, args);
2197 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK); 1810 jni_invoke_nonstatic(env, &jvalue, obj, JNI_NONVIRTUAL, methodID, &ap, CHECK);
2198 JNI_END 1811 JNI_END
2199 1812
2200 1813
2201 #ifndef USDT2
2202 #define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag) \
2203 \
2204 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType);\
2205 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodV, ResultType);\
2206 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##MethodA, ResultType);\
2207 \
2208 JNI_ENTRY(ResultType, \
2209 jni_CallStatic##Result##Method(JNIEnv *env, jclass cls, jmethodID methodID, ...)) \
2210 JNIWrapper("CallStatic" XSTR(Result) "Method"); \
2211 \
2212 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##Method__entry, env, cls, methodID);\
2213 ResultType ret = 0;\
2214 DT_RETURN_MARK_FOR(Result, CallStatic##Result##Method, ResultType, \
2215 (const ResultType&)ret);\
2216 \
2217 va_list args; \
2218 va_start(args, methodID); \
2219 JavaValue jvalue(Tag); \
2220 JNI_ArgumentPusherVaArg ap(methodID, args); \
2221 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
2222 va_end(args); \
2223 ret = jvalue.get_##ResultType(); \
2224 return ret;\
2225 JNI_END \
2226 \
2227 JNI_ENTRY(ResultType, \
2228 jni_CallStatic##Result##MethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) \
2229 JNIWrapper("CallStatic" XSTR(Result) "MethodV"); \
2230 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodV__entry, env, cls, methodID);\
2231 ResultType ret = 0;\
2232 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodV, ResultType, \
2233 (const ResultType&)ret);\
2234 \
2235 JavaValue jvalue(Tag); \
2236 JNI_ArgumentPusherVaArg ap(methodID, args); \
2237 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
2238 ret = jvalue.get_##ResultType(); \
2239 return ret;\
2240 JNI_END \
2241 \
2242 JNI_ENTRY(ResultType, \
2243 jni_CallStatic##Result##MethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) \
2244 JNIWrapper("CallStatic" XSTR(Result) "MethodA"); \
2245 DTRACE_PROBE3(hotspot_jni, CallStatic##Result##MethodA__entry, env, cls, methodID);\
2246 ResultType ret = 0;\
2247 DT_RETURN_MARK_FOR(Result, CallStatic##Result##MethodA, ResultType, \
2248 (const ResultType&)ret);\
2249 \
2250 JavaValue jvalue(Tag); \
2251 JNI_ArgumentPusherArray ap(methodID, args); \
2252 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK_0); \
2253 ret = jvalue.get_##ResultType(); \
2254 return ret;\
2255 JNI_END
2256
2257 // the runtime type of subword integral basic types is integer
2258 DEFINE_CALLSTATICMETHOD(jboolean, Boolean, T_BOOLEAN)
2259 DEFINE_CALLSTATICMETHOD(jbyte, Byte, T_BYTE)
2260 DEFINE_CALLSTATICMETHOD(jchar, Char, T_CHAR)
2261 DEFINE_CALLSTATICMETHOD(jshort, Short, T_SHORT)
2262
2263 DEFINE_CALLSTATICMETHOD(jobject, Object, T_OBJECT)
2264 DEFINE_CALLSTATICMETHOD(jint, Int, T_INT)
2265 DEFINE_CALLSTATICMETHOD(jlong, Long, T_LONG)
2266 DEFINE_CALLSTATICMETHOD(jfloat, Float, T_FLOAT)
2267 DEFINE_CALLSTATICMETHOD(jdouble, Double, T_DOUBLE)
2268
2269
2270 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethod);
2271 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV);
2272 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA);
2273
2274 #else /* USDT2 */
2275 1814
2276 #define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag \ 1815 #define DEFINE_CALLSTATICMETHOD(ResultType, Result, Tag \
2277 , EntryProbe, ResultProbe) \ 1816 , EntryProbe, ResultProbe) \
2278 \ 1817 \
2279 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType \ 1818 DT_RETURN_MARK_DECL_FOR(Result, CallStatic##Result##Method, ResultType \
2443 , HOTSPOT_JNI_CALLSTATICVOIDMETHOD_RETURN()); 1982 , HOTSPOT_JNI_CALLSTATICVOIDMETHOD_RETURN());
2444 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV 1983 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodV
2445 , HOTSPOT_JNI_CALLSTATICVOIDMETHODV_RETURN()); 1984 , HOTSPOT_JNI_CALLSTATICVOIDMETHODV_RETURN());
2446 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA 1985 DT_VOID_RETURN_MARK_DECL(CallStaticVoidMethodA
2447 , HOTSPOT_JNI_CALLSTATICVOIDMETHODA_RETURN()); 1986 , HOTSPOT_JNI_CALLSTATICVOIDMETHODA_RETURN());
2448 #endif /* USDT2 */
2449 1987
2450 JNI_ENTRY(void, jni_CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)) 1988 JNI_ENTRY(void, jni_CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...))
2451 JNIWrapper("CallStaticVoidMethod"); 1989 JNIWrapper("CallStaticVoidMethod");
2452 #ifndef USDT2
2453 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethod__entry, env, cls, methodID);
2454 #else /* USDT2 */
2455 HOTSPOT_JNI_CALLSTATICVOIDMETHOD_ENTRY(env, cls, (uintptr_t) methodID); 1990 HOTSPOT_JNI_CALLSTATICVOIDMETHOD_ENTRY(env, cls, (uintptr_t) methodID);
2456 #endif /* USDT2 */
2457 DT_VOID_RETURN_MARK(CallStaticVoidMethod); 1991 DT_VOID_RETURN_MARK(CallStaticVoidMethod);
2458 1992
2459 va_list args; 1993 va_list args;
2460 va_start(args, methodID); 1994 va_start(args, methodID);
2461 JavaValue jvalue(T_VOID); 1995 JavaValue jvalue(T_VOID);
2465 JNI_END 1999 JNI_END
2466 2000
2467 2001
2468 JNI_ENTRY(void, jni_CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)) 2002 JNI_ENTRY(void, jni_CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args))
2469 JNIWrapper("CallStaticVoidMethodV"); 2003 JNIWrapper("CallStaticVoidMethodV");
2470 #ifndef USDT2
2471 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodV__entry, env, cls, methodID);
2472 #else /* USDT2 */
2473 HOTSPOT_JNI_CALLSTATICVOIDMETHODV_ENTRY(env, cls, (uintptr_t) methodID); 2004 HOTSPOT_JNI_CALLSTATICVOIDMETHODV_ENTRY(env, cls, (uintptr_t) methodID);
2474 #endif /* USDT2 */
2475 DT_VOID_RETURN_MARK(CallStaticVoidMethodV); 2005 DT_VOID_RETURN_MARK(CallStaticVoidMethodV);
2476 2006
2477 JavaValue jvalue(T_VOID); 2007 JavaValue jvalue(T_VOID);
2478 JNI_ArgumentPusherVaArg ap(methodID, args); 2008 JNI_ArgumentPusherVaArg ap(methodID, args);
2479 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK); 2009 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
2480 JNI_END 2010 JNI_END
2481 2011
2482 2012
2483 JNI_ENTRY(void, jni_CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args)) 2013 JNI_ENTRY(void, jni_CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, const jvalue *args))
2484 JNIWrapper("CallStaticVoidMethodA"); 2014 JNIWrapper("CallStaticVoidMethodA");
2485 #ifndef USDT2
2486 DTRACE_PROBE3(hotspot_jni, CallStaticVoidMethodA__entry, env, cls, methodID);
2487 #else /* USDT2 */
2488 HOTSPOT_JNI_CALLSTATICVOIDMETHODA_ENTRY(env, cls, (uintptr_t) methodID); 2015 HOTSPOT_JNI_CALLSTATICVOIDMETHODA_ENTRY(env, cls, (uintptr_t) methodID);
2489 #endif /* USDT2 */
2490 DT_VOID_RETURN_MARK(CallStaticVoidMethodA); 2016 DT_VOID_RETURN_MARK(CallStaticVoidMethodA);
2491 2017
2492 JavaValue jvalue(T_VOID); 2018 JavaValue jvalue(T_VOID);
2493 JNI_ArgumentPusherArray ap(methodID, args); 2019 JNI_ArgumentPusherArray ap(methodID, args);
2494 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK); 2020 jni_invoke_static(env, &jvalue, NULL, JNI_STATIC, methodID, &ap, CHECK);
2498 // 2024 //
2499 // Accessing Fields 2025 // Accessing Fields
2500 // 2026 //
2501 2027
2502 2028
2503 #ifndef USDT2
2504 DT_RETURN_MARK_DECL(GetFieldID, jfieldID);
2505 #else /* USDT2 */
2506 DT_RETURN_MARK_DECL(GetFieldID, jfieldID 2029 DT_RETURN_MARK_DECL(GetFieldID, jfieldID
2507 , HOTSPOT_JNI_GETFIELDID_RETURN((uintptr_t)_ret_ref)); 2030 , HOTSPOT_JNI_GETFIELDID_RETURN((uintptr_t)_ret_ref));
2508 #endif /* USDT2 */
2509 2031
2510 JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz, 2032 JNI_ENTRY(jfieldID, jni_GetFieldID(JNIEnv *env, jclass clazz,
2511 const char *name, const char *sig)) 2033 const char *name, const char *sig))
2512 JNIWrapper("GetFieldID"); 2034 JNIWrapper("GetFieldID");
2513 #ifndef USDT2
2514 DTRACE_PROBE4(hotspot_jni, GetFieldID__entry, env, clazz, name, sig);
2515 #else /* USDT2 */
2516 HOTSPOT_JNI_GETFIELDID_ENTRY(env, clazz, (char *) name, (char *) sig); 2035 HOTSPOT_JNI_GETFIELDID_ENTRY(env, clazz, (char *) name, (char *) sig);
2517 #endif /* USDT2 */
2518 jfieldID ret = 0; 2036 jfieldID ret = 0;
2519 DT_RETURN_MARK(GetFieldID, jfieldID, (const jfieldID&)ret); 2037 DT_RETURN_MARK(GetFieldID, jfieldID, (const jfieldID&)ret);
2520 2038
2521 // The class should have been loaded (we have an instance of the class 2039 // The class should have been loaded (we have an instance of the class
2522 // passed in) so the field and signature should already be in the symbol 2040 // passed in) so the field and signature should already be in the symbol
2544 JNI_END 2062 JNI_END
2545 2063
2546 2064
2547 JNI_ENTRY(jobject, jni_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID)) 2065 JNI_ENTRY(jobject, jni_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID))
2548 JNIWrapper("GetObjectField"); 2066 JNIWrapper("GetObjectField");
2549 #ifndef USDT2
2550 DTRACE_PROBE3(hotspot_jni, GetObjectField__entry, env, obj, fieldID);
2551 #else /* USDT2 */
2552 HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(env, obj, (uintptr_t) fieldID); 2067 HOTSPOT_JNI_GETOBJECTFIELD_ENTRY(env, obj, (uintptr_t) fieldID);
2553 #endif /* USDT2 */
2554 oop o = JNIHandles::resolve_non_null(obj); 2068 oop o = JNIHandles::resolve_non_null(obj);
2555 Klass* k = o->klass(); 2069 Klass* k = o->klass();
2556 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); 2070 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
2557 // Keep JVMTI addition small and only check enabled flag here. 2071 // Keep JVMTI addition small and only check enabled flag here.
2558 // jni_GetField_probe() assumes that is okay to create handles. 2072 // jni_GetField_probe() assumes that is okay to create handles.
2578 oop referent = JNIHandles::resolve(ret); 2092 oop referent = JNIHandles::resolve(ret);
2579 G1SATBCardTableModRefBS::enqueue(referent); 2093 G1SATBCardTableModRefBS::enqueue(referent);
2580 } 2094 }
2581 } 2095 }
2582 #endif // INCLUDE_ALL_GCS 2096 #endif // INCLUDE_ALL_GCS
2583 #ifndef USDT2
2584 DTRACE_PROBE1(hotspot_jni, GetObjectField__return, ret);
2585 #else /* USDT2 */
2586 HOTSPOT_JNI_GETOBJECTFIELD_RETURN(ret); 2097 HOTSPOT_JNI_GETOBJECTFIELD_RETURN(ret);
2587 #endif /* USDT2 */
2588 return ret; 2098 return ret;
2589 JNI_END 2099 JNI_END
2590 2100
2591 2101
2592 #ifndef USDT2
2593 #define DEFINE_GETFIELD(Return,Fieldname,Result) \
2594 \
2595 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return);\
2596 \
2597 JNI_QUICK_ENTRY(Return, jni_Get##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID)) \
2598 JNIWrapper("Get" XSTR(Result) "Field"); \
2599 \
2600 DTRACE_PROBE3(hotspot_jni, Get##Result##Field__entry, env, obj, fieldID);\
2601 Return ret = 0;\
2602 DT_RETURN_MARK_FOR(Result, Get##Result##Field, Return, (const Return&)ret);\
2603 \
2604 oop o = JNIHandles::resolve_non_null(obj); \
2605 Klass* k = o->klass(); \
2606 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
2607 /* Keep JVMTI addition small and only check enabled flag here. */ \
2608 /* jni_GetField_probe_nh() assumes that is not okay to create handles */ \
2609 /* and creates a ResetNoHandleMark. */ \
2610 if (JvmtiExport::should_post_field_access()) { \
2611 o = JvmtiExport::jni_GetField_probe_nh(thread, obj, o, k, fieldID, false); \
2612 } \
2613 ret = o->Fieldname##_field(offset); \
2614 return ret; \
2615 JNI_END
2616
2617 DEFINE_GETFIELD(jboolean, bool, Boolean)
2618 DEFINE_GETFIELD(jbyte, byte, Byte)
2619 DEFINE_GETFIELD(jchar, char, Char)
2620 DEFINE_GETFIELD(jshort, short, Short)
2621 DEFINE_GETFIELD(jint, int, Int)
2622 DEFINE_GETFIELD(jlong, long, Long)
2623 DEFINE_GETFIELD(jfloat, float, Float)
2624 DEFINE_GETFIELD(jdouble, double, Double)
2625
2626 #else /* USDT2 */
2627 2102
2628 #define DEFINE_GETFIELD(Return,Fieldname,Result \ 2103 #define DEFINE_GETFIELD(Return,Fieldname,Result \
2629 , EntryProbe, ReturnProbe) \ 2104 , EntryProbe, ReturnProbe) \
2630 \ 2105 \
2631 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return \ 2106 DT_RETURN_MARK_DECL_FOR(Result, Get##Result##Field, Return \
2674 , HOTSPOT_JNI_GETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID), 2149 , HOTSPOT_JNI_GETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
2675 HOTSPOT_JNI_GETFLOATFIELD_RETURN()) 2150 HOTSPOT_JNI_GETFLOATFIELD_RETURN())
2676 DEFINE_GETFIELD(jdouble, double, Double 2151 DEFINE_GETFIELD(jdouble, double, Double
2677 , HOTSPOT_JNI_GETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID), 2152 , HOTSPOT_JNI_GETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
2678 HOTSPOT_JNI_GETDOUBLEFIELD_RETURN()) 2153 HOTSPOT_JNI_GETDOUBLEFIELD_RETURN())
2679 #endif /* USDT2 */
2680 2154
2681 address jni_GetBooleanField_addr() { 2155 address jni_GetBooleanField_addr() {
2682 return (address)jni_GetBooleanField; 2156 return (address)jni_GetBooleanField;
2683 } 2157 }
2684 address jni_GetByteField_addr() { 2158 address jni_GetByteField_addr() {
2703 return (address)jni_GetDoubleField; 2177 return (address)jni_GetDoubleField;
2704 } 2178 }
2705 2179
2706 JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value)) 2180 JNI_QUICK_ENTRY(void, jni_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject value))
2707 JNIWrapper("SetObjectField"); 2181 JNIWrapper("SetObjectField");
2708 #ifndef USDT2
2709 DTRACE_PROBE4(hotspot_jni, SetObjectField__entry, env, obj, fieldID, value);
2710 #else /* USDT2 */
2711 HOTSPOT_JNI_SETOBJECTFIELD_ENTRY(env, obj, (uintptr_t) fieldID, value); 2182 HOTSPOT_JNI_SETOBJECTFIELD_ENTRY(env, obj, (uintptr_t) fieldID, value);
2712 #endif /* USDT2 */
2713 oop o = JNIHandles::resolve_non_null(obj); 2183 oop o = JNIHandles::resolve_non_null(obj);
2714 Klass* k = o->klass(); 2184 Klass* k = o->klass();
2715 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); 2185 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
2716 // Keep JVMTI addition small and only check enabled flag here. 2186 // Keep JVMTI addition small and only check enabled flag here.
2717 // jni_SetField_probe_nh() assumes that is not okay to create handles 2187 // jni_SetField_probe_nh() assumes that is not okay to create handles
2720 jvalue field_value; 2190 jvalue field_value;
2721 field_value.l = value; 2191 field_value.l = value;
2722 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, 'L', (jvalue *)&field_value); 2192 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, 'L', (jvalue *)&field_value);
2723 } 2193 }
2724 o->obj_field_put(offset, JNIHandles::resolve(value)); 2194 o->obj_field_put(offset, JNIHandles::resolve(value));
2725 #ifndef USDT2
2726 DTRACE_PROBE(hotspot_jni, SetObjectField__return);
2727 #else /* USDT2 */
2728 HOTSPOT_JNI_SETOBJECTFIELD_RETURN(); 2195 HOTSPOT_JNI_SETOBJECTFIELD_RETURN();
2729 #endif /* USDT2 */ 2196 JNI_END
2730 JNI_END 2197
2731
2732 #ifndef USDT2
2733 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType) \
2734 \
2735 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
2736 JNIWrapper("Set" XSTR(Result) "Field"); \
2737 \
2738 FP_SELECT_##Result( \
2739 DTRACE_PROBE4(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID, value), \
2740 DTRACE_PROBE3(hotspot_jni, Set##Result##Field__entry, env, obj, fieldID)); \
2741 \
2742 oop o = JNIHandles::resolve_non_null(obj); \
2743 Klass* k = o->klass(); \
2744 int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID); \
2745 /* Keep JVMTI addition small and only check enabled flag here. */ \
2746 /* jni_SetField_probe_nh() assumes that is not okay to create handles */ \
2747 /* and creates a ResetNoHandleMark. */ \
2748 if (JvmtiExport::should_post_field_modification()) { \
2749 jvalue field_value; \
2750 field_value.unionType = value; \
2751 o = JvmtiExport::jni_SetField_probe_nh(thread, obj, o, k, fieldID, false, SigType, (jvalue *)&field_value); \
2752 } \
2753 o->Fieldname##_field_put(offset, value); \
2754 DTRACE_PROBE(hotspot_jni, Set##Result##Field__return);\
2755 JNI_END
2756
2757 DEFINE_SETFIELD(jboolean, bool, Boolean, 'Z', z)
2758 DEFINE_SETFIELD(jbyte, byte, Byte, 'B', b)
2759 DEFINE_SETFIELD(jchar, char, Char, 'C', c)
2760 DEFINE_SETFIELD(jshort, short, Short, 'S', s)
2761 DEFINE_SETFIELD(jint, int, Int, 'I', i)
2762 DEFINE_SETFIELD(jlong, long, Long, 'J', j)
2763 DEFINE_SETFIELD(jfloat, float, Float, 'F', f)
2764 DEFINE_SETFIELD(jdouble, double, Double, 'D', d)
2765
2766 #else /* USDT2 */
2767 2198
2768 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType \ 2199 #define DEFINE_SETFIELD(Argument,Fieldname,Result,SigType,unionType \
2769 , EntryProbe, ReturnProbe) \ 2200 , EntryProbe, ReturnProbe) \
2770 \ 2201 \
2771 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \ 2202 JNI_QUICK_ENTRY(void, jni_Set##Result##Field(JNIEnv *env, jobject obj, jfieldID fieldID, Argument value)) \
2811 , HOTSPOT_JNI_SETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID), 2242 , HOTSPOT_JNI_SETFLOATFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
2812 HOTSPOT_JNI_SETFLOATFIELD_RETURN()) 2243 HOTSPOT_JNI_SETFLOATFIELD_RETURN())
2813 DEFINE_SETFIELD(jdouble, double, Double, 'D', d 2244 DEFINE_SETFIELD(jdouble, double, Double, 'D', d
2814 , HOTSPOT_JNI_SETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID), 2245 , HOTSPOT_JNI_SETDOUBLEFIELD_ENTRY(env, obj, (uintptr_t)fieldID),
2815 HOTSPOT_JNI_SETDOUBLEFIELD_RETURN()) 2246 HOTSPOT_JNI_SETDOUBLEFIELD_RETURN())
2816 #endif /* USDT2 */ 2247
2817
2818 #ifndef USDT2
2819 DT_RETURN_MARK_DECL(ToReflectedField, jobject);
2820 #else /* USDT2 */
2821 DT_RETURN_MARK_DECL(ToReflectedField, jobject 2248 DT_RETURN_MARK_DECL(ToReflectedField, jobject
2822 , HOTSPOT_JNI_TOREFLECTEDFIELD_RETURN(_ret_ref)); 2249 , HOTSPOT_JNI_TOREFLECTEDFIELD_RETURN(_ret_ref));
2823 #endif /* USDT2 */
2824 2250
2825 JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic)) 2251 JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic))
2826 JNIWrapper("ToReflectedField"); 2252 JNIWrapper("ToReflectedField");
2827 #ifndef USDT2
2828 DTRACE_PROBE4(hotspot_jni, ToReflectedField__entry,
2829 env, cls, fieldID, isStatic);
2830 #else /* USDT2 */
2831 HOTSPOT_JNI_TOREFLECTEDFIELD_ENTRY(env, cls, (uintptr_t) fieldID, isStatic); 2253 HOTSPOT_JNI_TOREFLECTEDFIELD_ENTRY(env, cls, (uintptr_t) fieldID, isStatic);
2832 #endif /* USDT2 */
2833 jobject ret = NULL; 2254 jobject ret = NULL;
2834 DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret); 2255 DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret);
2835 2256
2836 fieldDescriptor fd; 2257 fieldDescriptor fd;
2837 bool found = false; 2258 bool found = false;
2857 2278
2858 2279
2859 // 2280 //
2860 // Accessing Static Fields 2281 // Accessing Static Fields
2861 // 2282 //
2862 #ifndef USDT2
2863 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID);
2864 #else /* USDT2 */
2865 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID 2283 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID
2866 , HOTSPOT_JNI_GETSTATICFIELDID_RETURN((uintptr_t)_ret_ref)); 2284 , HOTSPOT_JNI_GETSTATICFIELDID_RETURN((uintptr_t)_ret_ref));
2867 #endif /* USDT2 */
2868 2285
2869 JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz, 2286 JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
2870 const char *name, const char *sig)) 2287 const char *name, const char *sig))
2871 JNIWrapper("GetStaticFieldID"); 2288 JNIWrapper("GetStaticFieldID");
2872 #ifndef USDT2
2873 DTRACE_PROBE4(hotspot_jni, GetStaticFieldID__entry, env, clazz, name, sig);
2874 #else /* USDT2 */
2875 HOTSPOT_JNI_GETSTATICFIELDID_ENTRY(env, clazz, (char *) name, (char *) sig); 2289 HOTSPOT_JNI_GETSTATICFIELDID_ENTRY(env, clazz, (char *) name, (char *) sig);
2876 #endif /* USDT2 */
2877 jfieldID ret = NULL; 2290 jfieldID ret = NULL;
2878 DT_RETURN_MARK(GetStaticFieldID, jfieldID, (const jfieldID&)ret); 2291 DT_RETURN_MARK(GetStaticFieldID, jfieldID, (const jfieldID&)ret);
2879 2292
2880 // The class should have been loaded (we have an instance of the class 2293 // The class should have been loaded (we have an instance of the class
2881 // passed in) so the field and signature should already be in the symbol 2294 // passed in) so the field and signature should already be in the symbol
2907 JNI_END 2320 JNI_END
2908 2321
2909 2322
2910 JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID)) 2323 JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID))
2911 JNIWrapper("GetStaticObjectField"); 2324 JNIWrapper("GetStaticObjectField");
2912 #ifndef USDT2
2913 DTRACE_PROBE3(hotspot_jni, GetStaticObjectField__entry, env, clazz, fieldID);
2914 #else /* USDT2 */
2915 HOTSPOT_JNI_GETSTATICOBJECTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID); 2325 HOTSPOT_JNI_GETSTATICOBJECTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID);
2916 #endif /* USDT2 */
2917 #if INCLUDE_JNI_CHECK 2326 #if INCLUDE_JNI_CHECK
2918 DEBUG_ONLY(Klass* param_k = jniCheck::validate_class(thread, clazz);) 2327 DEBUG_ONLY(Klass* param_k = jniCheck::validate_class(thread, clazz);)
2919 #endif // INCLUDE_JNI_CHECK 2328 #endif // INCLUDE_JNI_CHECK
2920 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); 2329 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
2921 assert(id->is_static_field_id(), "invalid static field id"); 2330 assert(id->is_static_field_id(), "invalid static field id");
2923 // jni_GetField_probe() assumes that is okay to create handles. 2332 // jni_GetField_probe() assumes that is okay to create handles.
2924 if (JvmtiExport::should_post_field_access()) { 2333 if (JvmtiExport::should_post_field_access()) {
2925 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); 2334 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
2926 } 2335 }
2927 jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset())); 2336 jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset()));
2928 #ifndef USDT2
2929 DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
2930 #else /* USDT2 */
2931 HOTSPOT_JNI_GETSTATICOBJECTFIELD_RETURN(ret); 2337 HOTSPOT_JNI_GETSTATICOBJECTFIELD_RETURN(ret);
2932 #endif /* USDT2 */
2933 return ret; 2338 return ret;
2934 JNI_END 2339 JNI_END
2935 2340
2936 #ifndef USDT2
2937 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
2938 \
2939 DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return);\
2940 \
2941 JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
2942 JNIWrapper("GetStatic" XSTR(Result) "Field"); \
2943 DTRACE_PROBE3(hotspot_jni, GetStatic##Result##Field__entry, env, clazz, fieldID);\
2944 Return ret = 0;\
2945 DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
2946 (const Return&)ret);\
2947 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
2948 assert(id->is_static_field_id(), "invalid static field id"); \
2949 /* Keep JVMTI addition small and only check enabled flag here. */ \
2950 /* jni_GetField_probe() assumes that is okay to create handles. */ \
2951 if (JvmtiExport::should_post_field_access()) { \
2952 JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
2953 } \
2954 ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
2955 return ret;\
2956 JNI_END
2957
2958 DEFINE_GETSTATICFIELD(jboolean, bool, Boolean)
2959 DEFINE_GETSTATICFIELD(jbyte, byte, Byte)
2960 DEFINE_GETSTATICFIELD(jchar, char, Char)
2961 DEFINE_GETSTATICFIELD(jshort, short, Short)
2962 DEFINE_GETSTATICFIELD(jint, int, Int)
2963 DEFINE_GETSTATICFIELD(jlong, long, Long)
2964 DEFINE_GETSTATICFIELD(jfloat, float, Float)
2965 DEFINE_GETSTATICFIELD(jdouble, double, Double)
2966
2967 #else /* USDT2 */
2968 2341
2969 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result \ 2342 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result \
2970 , EntryProbe, ReturnProbe) \ 2343 , EntryProbe, ReturnProbe) \
2971 \ 2344 \
2972 DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return \ 2345 DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return \
3004 // Float and double probes don't return value because dtrace doesn't currently support it 2377 // Float and double probes don't return value because dtrace doesn't currently support it
3005 DEFINE_GETSTATICFIELD(jfloat, float, Float 2378 DEFINE_GETSTATICFIELD(jfloat, float, Float
3006 , HOTSPOT_JNI_GETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICFLOATFIELD_RETURN() ) 2379 , HOTSPOT_JNI_GETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICFLOATFIELD_RETURN() )
3007 DEFINE_GETSTATICFIELD(jdouble, double, Double 2380 DEFINE_GETSTATICFIELD(jdouble, double, Double
3008 , HOTSPOT_JNI_GETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICDOUBLEFIELD_RETURN() ) 2381 , HOTSPOT_JNI_GETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), HOTSPOT_JNI_GETSTATICDOUBLEFIELD_RETURN() )
3009 #endif /* USDT2 */
3010 2382
3011 JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)) 2383 JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value))
3012 JNIWrapper("SetStaticObjectField"); 2384 JNIWrapper("SetStaticObjectField");
3013 #ifndef USDT2
3014 DTRACE_PROBE4(hotspot_jni, SetStaticObjectField__entry, env, clazz, fieldID, value);
3015 #else /* USDT2 */
3016 HOTSPOT_JNI_SETSTATICOBJECTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value); 2385 HOTSPOT_JNI_SETSTATICOBJECTFIELD_ENTRY(env, clazz, (uintptr_t) fieldID, value);
3017 #endif /* USDT2 */
3018 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); 2386 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
3019 assert(id->is_static_field_id(), "invalid static field id"); 2387 assert(id->is_static_field_id(), "invalid static field id");
3020 // Keep JVMTI addition small and only check enabled flag here. 2388 // Keep JVMTI addition small and only check enabled flag here.
3021 // jni_SetField_probe() assumes that is okay to create handles. 2389 // jni_SetField_probe() assumes that is okay to create handles.
3022 if (JvmtiExport::should_post_field_modification()) { 2390 if (JvmtiExport::should_post_field_modification()) {
3023 jvalue field_value; 2391 jvalue field_value;
3024 field_value.l = value; 2392 field_value.l = value;
3025 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value); 2393 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
3026 } 2394 }
3027 id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value)); 2395 id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value));
3028 #ifndef USDT2
3029 DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
3030 #else /* USDT2 */
3031 HOTSPOT_JNI_SETSTATICOBJECTFIELD_RETURN(); 2396 HOTSPOT_JNI_SETSTATICOBJECTFIELD_RETURN();
3032 #endif /* USDT2 */ 2397 JNI_END
3033 JNI_END 2398
3034 2399
3035
3036 #ifndef USDT2
3037 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
3038 \
3039 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
3040 JNIWrapper("SetStatic" XSTR(Result) "Field"); \
3041 FP_SELECT_##Result( \
3042 DTRACE_PROBE4(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID, value), \
3043 DTRACE_PROBE3(hotspot_jni, SetStatic##Result##Field__entry, env, clazz, fieldID)); \
3044 \
3045 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
3046 assert(id->is_static_field_id(), "invalid static field id"); \
3047 /* Keep JVMTI addition small and only check enabled flag here. */ \
3048 /* jni_SetField_probe() assumes that is okay to create handles. */ \
3049 if (JvmtiExport::should_post_field_modification()) { \
3050 jvalue field_value; \
3051 field_value.unionType = value; \
3052 JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
3053 } \
3054 id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
3055 DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
3056 JNI_END
3057
3058 DEFINE_SETSTATICFIELD(jboolean, bool, Boolean, 'Z', z)
3059 DEFINE_SETSTATICFIELD(jbyte, byte, Byte, 'B', b)
3060 DEFINE_SETSTATICFIELD(jchar, char, Char, 'C', c)
3061 DEFINE_SETSTATICFIELD(jshort, short, Short, 'S', s)
3062 DEFINE_SETSTATICFIELD(jint, int, Int, 'I', i)
3063 DEFINE_SETSTATICFIELD(jlong, long, Long, 'J', j)
3064 DEFINE_SETSTATICFIELD(jfloat, float, Float, 'F', f)
3065 DEFINE_SETSTATICFIELD(jdouble, double, Double, 'D', d)
3066
3067 #else /* USDT2 */
3068 2400
3069 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType \ 2401 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType \
3070 , EntryProbe, ReturnProbe) \ 2402 , EntryProbe, ReturnProbe) \
3071 \ 2403 \
3072 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \ 2404 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
3109 , HOTSPOT_JNI_SETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), 2441 , HOTSPOT_JNI_SETSTATICFLOATFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),
3110 HOTSPOT_JNI_SETSTATICFLOATFIELD_RETURN()) 2442 HOTSPOT_JNI_SETSTATICFLOATFIELD_RETURN())
3111 DEFINE_SETSTATICFIELD(jdouble, double, Double, 'D', d 2443 DEFINE_SETSTATICFIELD(jdouble, double, Double, 'D', d
3112 , HOTSPOT_JNI_SETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID), 2444 , HOTSPOT_JNI_SETSTATICDOUBLEFIELD_ENTRY(env, clazz, (uintptr_t) fieldID),
3113 HOTSPOT_JNI_SETSTATICDOUBLEFIELD_RETURN()) 2445 HOTSPOT_JNI_SETSTATICDOUBLEFIELD_RETURN())
3114 #endif /* USDT2 */
3115 2446
3116 // 2447 //
3117 // String Operations 2448 // String Operations
3118 // 2449 //
3119 2450
3120 // Unicode Interface 2451 // Unicode Interface
3121 2452
3122 #ifndef USDT2
3123 DT_RETURN_MARK_DECL(NewString, jstring);
3124 #else /* USDT2 */
3125 DT_RETURN_MARK_DECL(NewString, jstring 2453 DT_RETURN_MARK_DECL(NewString, jstring
3126 , HOTSPOT_JNI_NEWSTRING_RETURN(_ret_ref)); 2454 , HOTSPOT_JNI_NEWSTRING_RETURN(_ret_ref));
3127 #endif /* USDT2 */
3128 2455
3129 JNI_ENTRY(jstring, jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len)) 2456 JNI_ENTRY(jstring, jni_NewString(JNIEnv *env, const jchar *unicodeChars, jsize len))
3130 JNIWrapper("NewString"); 2457 JNIWrapper("NewString");
3131 #ifndef USDT2
3132 DTRACE_PROBE3(hotspot_jni, NewString__entry, env, unicodeChars, len);
3133 #else /* USDT2 */
3134 HOTSPOT_JNI_NEWSTRING_ENTRY(env, (uint16_t *) unicodeChars, len); 2458 HOTSPOT_JNI_NEWSTRING_ENTRY(env, (uint16_t *) unicodeChars, len);
3135 #endif /* USDT2 */
3136 jstring ret = NULL; 2459 jstring ret = NULL;
3137 DT_RETURN_MARK(NewString, jstring, (const jstring&)ret); 2460 DT_RETURN_MARK(NewString, jstring, (const jstring&)ret);
3138 oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL); 2461 oop string=java_lang_String::create_oop_from_unicode((jchar*) unicodeChars, len, CHECK_NULL);
3139 ret = (jstring) JNIHandles::make_local(env, string); 2462 ret = (jstring) JNIHandles::make_local(env, string);
3140 return ret; 2463 return ret;
3141 JNI_END 2464 JNI_END
3142 2465
3143 2466
3144 JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string)) 2467 JNI_QUICK_ENTRY(jsize, jni_GetStringLength(JNIEnv *env, jstring string))
3145 JNIWrapper("GetStringLength"); 2468 JNIWrapper("GetStringLength");
3146 #ifndef USDT2
3147 DTRACE_PROBE2(hotspot_jni, GetStringLength__entry, env, string);
3148 #else /* USDT2 */
3149 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string); 2469 HOTSPOT_JNI_GETSTRINGLENGTH_ENTRY(env, string);
3150 #endif /* USDT2 */
3151 jsize ret = 0; 2470 jsize ret = 0;
3152 oop s = JNIHandles::resolve_non_null(string); 2471 oop s = JNIHandles::resolve_non_null(string);
3153 if (java_lang_String::value(s) != NULL) { 2472 if (java_lang_String::value(s) != NULL) {
3154 ret = java_lang_String::length(s); 2473 ret = java_lang_String::length(s);
3155 } 2474 }
3156 #ifndef USDT2
3157 DTRACE_PROBE1(hotspot_jni, GetStringLength__return, ret);
3158 #else /* USDT2 */
3159 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret); 2475 HOTSPOT_JNI_GETSTRINGLENGTH_RETURN(ret);
3160 #endif /* USDT2 */
3161 return ret; 2476 return ret;
3162 JNI_END 2477 JNI_END
3163 2478
3164 2479
3165 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars( 2480 JNI_QUICK_ENTRY(const jchar*, jni_GetStringChars(
3166 JNIEnv *env, jstring string, jboolean *isCopy)) 2481 JNIEnv *env, jstring string, jboolean *isCopy))
3167 JNIWrapper("GetStringChars"); 2482 JNIWrapper("GetStringChars");
3168 #ifndef USDT2
3169 DTRACE_PROBE3(hotspot_jni, GetStringChars__entry, env, string, isCopy);
3170 #else /* USDT2 */
3171 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy); 2483 HOTSPOT_JNI_GETSTRINGCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
3172 #endif /* USDT2 */
3173 jchar* buf = NULL; 2484 jchar* buf = NULL;
3174 oop s = JNIHandles::resolve_non_null(string); 2485 oop s = JNIHandles::resolve_non_null(string);
3175 typeArrayOop s_value = java_lang_String::value(s); 2486 typeArrayOop s_value = java_lang_String::value(s);
3176 if (s_value != NULL) { 2487 if (s_value != NULL) {
3177 int s_len = java_lang_String::length(s); 2488 int s_len = java_lang_String::length(s);
3187 if (isCopy != NULL) { 2498 if (isCopy != NULL) {
3188 *isCopy = JNI_TRUE; 2499 *isCopy = JNI_TRUE;
3189 } 2500 }
3190 } 2501 }
3191 } 2502 }
3192 #ifndef USDT2
3193 DTRACE_PROBE1(hotspot_jni, GetStringChars__return, buf);
3194 #else /* USDT2 */
3195 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf); 2503 HOTSPOT_JNI_GETSTRINGCHARS_RETURN(buf);
3196 #endif /* USDT2 */
3197 return buf; 2504 return buf;
3198 JNI_END 2505 JNI_END
3199 2506
3200 2507
3201 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)) 2508 JNI_QUICK_ENTRY(void, jni_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars))
3202 JNIWrapper("ReleaseStringChars"); 2509 JNIWrapper("ReleaseStringChars");
3203 #ifndef USDT2
3204 DTRACE_PROBE3(hotspot_jni, ReleaseStringChars__entry, env, str, chars);
3205 #else /* USDT2 */
3206 HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars); 2510 HOTSPOT_JNI_RELEASESTRINGCHARS_ENTRY(env, str, (uint16_t *) chars);
3207 #endif /* USDT2 */
3208 //%note jni_6 2511 //%note jni_6
3209 if (chars != NULL) { 2512 if (chars != NULL) {
3210 // Since String objects are supposed to be immutable, don't copy any 2513 // Since String objects are supposed to be immutable, don't copy any
3211 // new data back. A bad user will have to go after the char array. 2514 // new data back. A bad user will have to go after the char array.
3212 FreeHeap((void*) chars); 2515 FreeHeap((void*) chars);
3213 } 2516 }
3214 #ifndef USDT2
3215 DTRACE_PROBE(hotspot_jni, ReleaseStringChars__return);
3216 #else /* USDT2 */
3217 HOTSPOT_JNI_RELEASESTRINGCHARS_RETURN(); 2517 HOTSPOT_JNI_RELEASESTRINGCHARS_RETURN();
3218 #endif /* USDT2 */
3219 JNI_END 2518 JNI_END
3220 2519
3221 2520
3222 // UTF Interface 2521 // UTF Interface
3223 2522
3224 #ifndef USDT2
3225 DT_RETURN_MARK_DECL(NewStringUTF, jstring);
3226 #else /* USDT2 */
3227 DT_RETURN_MARK_DECL(NewStringUTF, jstring 2523 DT_RETURN_MARK_DECL(NewStringUTF, jstring
3228 , HOTSPOT_JNI_NEWSTRINGUTF_RETURN(_ret_ref)); 2524 , HOTSPOT_JNI_NEWSTRINGUTF_RETURN(_ret_ref));
3229 #endif /* USDT2 */
3230 2525
3231 JNI_ENTRY(jstring, jni_NewStringUTF(JNIEnv *env, const char *bytes)) 2526 JNI_ENTRY(jstring, jni_NewStringUTF(JNIEnv *env, const char *bytes))
3232 JNIWrapper("NewStringUTF"); 2527 JNIWrapper("NewStringUTF");
3233 #ifndef USDT2
3234 DTRACE_PROBE2(hotspot_jni, NewStringUTF__entry, env, bytes);
3235 #else /* USDT2 */
3236 HOTSPOT_JNI_NEWSTRINGUTF_ENTRY(env, (char *) bytes); 2528 HOTSPOT_JNI_NEWSTRINGUTF_ENTRY(env, (char *) bytes);
3237 #endif /* USDT2 */
3238 jstring ret; 2529 jstring ret;
3239 DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret); 2530 DT_RETURN_MARK(NewStringUTF, jstring, (const jstring&)ret);
3240 2531
3241 oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL); 2532 oop result = java_lang_String::create_oop_from_str((char*) bytes, CHECK_NULL);
3242 ret = (jstring) JNIHandles::make_local(env, result); 2533 ret = (jstring) JNIHandles::make_local(env, result);
3244 JNI_END 2535 JNI_END
3245 2536
3246 2537
3247 JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string)) 2538 JNI_ENTRY(jsize, jni_GetStringUTFLength(JNIEnv *env, jstring string))
3248 JNIWrapper("GetStringUTFLength"); 2539 JNIWrapper("GetStringUTFLength");
3249 #ifndef USDT2
3250 DTRACE_PROBE2(hotspot_jni, GetStringUTFLength__entry, env, string);
3251 #else /* USDT2 */
3252 HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(env, string); 2540 HOTSPOT_JNI_GETSTRINGUTFLENGTH_ENTRY(env, string);
3253 #endif /* USDT2 */
3254 jsize ret = 0; 2541 jsize ret = 0;
3255 oop java_string = JNIHandles::resolve_non_null(string); 2542 oop java_string = JNIHandles::resolve_non_null(string);
3256 if (java_lang_String::value(java_string) != NULL) { 2543 if (java_lang_String::value(java_string) != NULL) {
3257 ret = java_lang_String::utf8_length(java_string); 2544 ret = java_lang_String::utf8_length(java_string);
3258 } 2545 }
3259 #ifndef USDT2
3260 DTRACE_PROBE1(hotspot_jni, GetStringUTFLength__return, ret);
3261 #else /* USDT2 */
3262 HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN(ret); 2546 HOTSPOT_JNI_GETSTRINGUTFLENGTH_RETURN(ret);
3263 #endif /* USDT2 */
3264 return ret; 2547 return ret;
3265 JNI_END 2548 JNI_END
3266 2549
3267 2550
3268 JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)) 2551 JNI_ENTRY(const char*, jni_GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy))
3269 JNIWrapper("GetStringUTFChars"); 2552 JNIWrapper("GetStringUTFChars");
3270 #ifndef USDT2
3271 DTRACE_PROBE3(hotspot_jni, GetStringUTFChars__entry, env, string, isCopy);
3272 #else /* USDT2 */
3273 HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(env, string, (uintptr_t *) isCopy); 2553 HOTSPOT_JNI_GETSTRINGUTFCHARS_ENTRY(env, string, (uintptr_t *) isCopy);
3274 #endif /* USDT2 */
3275 char* result = NULL; 2554 char* result = NULL;
3276 oop java_string = JNIHandles::resolve_non_null(string); 2555 oop java_string = JNIHandles::resolve_non_null(string);
3277 if (java_lang_String::value(java_string) != NULL) { 2556 if (java_lang_String::value(java_string) != NULL) {
3278 size_t length = java_lang_String::utf8_length(java_string); 2557 size_t length = java_lang_String::utf8_length(java_string);
3279 /* JNI Specification states return NULL on OOM */ 2558 /* JNI Specification states return NULL on OOM */
3283 if (isCopy != NULL) { 2562 if (isCopy != NULL) {
3284 *isCopy = JNI_TRUE; 2563 *isCopy = JNI_TRUE;
3285 } 2564 }
3286 } 2565 }
3287 } 2566 }
3288 #ifndef USDT2
3289 DTRACE_PROBE1(hotspot_jni, GetStringUTFChars__return, result);
3290 #else /* USDT2 */
3291 HOTSPOT_JNI_GETSTRINGUTFCHARS_RETURN(result); 2567 HOTSPOT_JNI_GETSTRINGUTFCHARS_RETURN(result);
3292 #endif /* USDT2 */
3293 return result; 2568 return result;
3294 JNI_END 2569 JNI_END
3295 2570
3296 2571
3297 JNI_LEAF(void, jni_ReleaseStringUTFChars(JNIEnv *env, jstring str, const char *chars)) 2572 JNI_LEAF(void, jni_ReleaseStringUTFChars(JNIEnv *env, jstring str, const char *chars))
3298 JNIWrapper("ReleaseStringUTFChars"); 2573 JNIWrapper("ReleaseStringUTFChars");
3299 #ifndef USDT2
3300 DTRACE_PROBE3(hotspot_jni, ReleaseStringUTFChars__entry, env, str, chars);
3301 #else /* USDT2 */
3302 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_ENTRY(env, str, (char *) chars); 2574 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_ENTRY(env, str, (char *) chars);
3303 #endif /* USDT2 */
3304 if (chars != NULL) { 2575 if (chars != NULL) {
3305 FreeHeap((char*) chars); 2576 FreeHeap((char*) chars);
3306 } 2577 }
3307 #ifndef USDT2
3308 DTRACE_PROBE(hotspot_jni, ReleaseStringUTFChars__return);
3309 #else /* USDT2 */
3310 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_RETURN(); 2578 HOTSPOT_JNI_RELEASESTRINGUTFCHARS_RETURN();
3311 #endif /* USDT2 */
3312 JNI_END 2579 JNI_END
3313 2580
3314 2581
3315 JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array)) 2582 JNI_QUICK_ENTRY(jsize, jni_GetArrayLength(JNIEnv *env, jarray array))
3316 JNIWrapper("GetArrayLength"); 2583 JNIWrapper("GetArrayLength");
3317 #ifndef USDT2
3318 DTRACE_PROBE2(hotspot_jni, GetArrayLength__entry, env, array);
3319 #else /* USDT2 */
3320 HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(env, array); 2584 HOTSPOT_JNI_GETARRAYLENGTH_ENTRY(env, array);
3321 #endif /* USDT2 */
3322 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array)); 2585 arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
3323 assert(a->is_array(), "must be array"); 2586 assert(a->is_array(), "must be array");
3324 jsize ret = a->length(); 2587 jsize ret = a->length();
3325 #ifndef USDT2
3326 DTRACE_PROBE1(hotspot_jni, GetArrayLength__return, ret);
3327 #else /* USDT2 */
3328 HOTSPOT_JNI_GETARRAYLENGTH_RETURN(ret); 2588 HOTSPOT_JNI_GETARRAYLENGTH_RETURN(ret);
3329 #endif /* USDT2 */
3330 return ret; 2589 return ret;
3331 JNI_END 2590 JNI_END
3332 2591
3333 2592
3334 // 2593 //
3335 // Object Array Operations 2594 // Object Array Operations
3336 // 2595 //
3337 2596
3338 #ifndef USDT2
3339 DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray);
3340 #else /* USDT2 */
3341 DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray 2597 DT_RETURN_MARK_DECL(NewObjectArray, jobjectArray
3342 , HOTSPOT_JNI_NEWOBJECTARRAY_RETURN(_ret_ref)); 2598 , HOTSPOT_JNI_NEWOBJECTARRAY_RETURN(_ret_ref));
3343 #endif /* USDT2 */
3344 2599
3345 JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement)) 2600 JNI_ENTRY(jobjectArray, jni_NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement))
3346 JNIWrapper("NewObjectArray"); 2601 JNIWrapper("NewObjectArray");
3347 #ifndef USDT2
3348 DTRACE_PROBE4(hotspot_jni, NewObjectArray__entry, env, length, elementClass, initialElement);
3349 #else /* USDT2 */
3350 HOTSPOT_JNI_NEWOBJECTARRAY_ENTRY(env, length, elementClass, initialElement); 2602 HOTSPOT_JNI_NEWOBJECTARRAY_ENTRY(env, length, elementClass, initialElement);
3351 #endif /* USDT2 */
3352 jobjectArray ret = NULL; 2603 jobjectArray ret = NULL;
3353 DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret); 2604 DT_RETURN_MARK(NewObjectArray, jobjectArray, (const jobjectArray&)ret);
3354 KlassHandle ek(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass))); 2605 KlassHandle ek(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(elementClass)));
3355 Klass* ako = ek()->array_klass(CHECK_NULL); 2606 Klass* ako = ek()->array_klass(CHECK_NULL);
3356 KlassHandle ak = KlassHandle(THREAD, ako); 2607 KlassHandle ak = KlassHandle(THREAD, ako);
3364 } 2615 }
3365 ret = (jobjectArray) JNIHandles::make_local(env, result); 2616 ret = (jobjectArray) JNIHandles::make_local(env, result);
3366 return ret; 2617 return ret;
3367 JNI_END 2618 JNI_END
3368 2619
3369 #ifndef USDT2
3370 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject);
3371 #else /* USDT2 */
3372 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject 2620 DT_RETURN_MARK_DECL(GetObjectArrayElement, jobject
3373 , HOTSPOT_JNI_GETOBJECTARRAYELEMENT_RETURN(_ret_ref)); 2621 , HOTSPOT_JNI_GETOBJECTARRAYELEMENT_RETURN(_ret_ref));
3374 #endif /* USDT2 */
3375 2622
3376 JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)) 2623 JNI_ENTRY(jobject, jni_GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index))
3377 JNIWrapper("GetObjectArrayElement"); 2624 JNIWrapper("GetObjectArrayElement");
3378 #ifndef USDT2
3379 DTRACE_PROBE3(hotspot_jni, GetObjectArrayElement__entry, env, array, index);
3380 #else /* USDT2 */
3381 HOTSPOT_JNI_GETOBJECTARRAYELEMENT_ENTRY(env, array, index); 2625 HOTSPOT_JNI_GETOBJECTARRAYELEMENT_ENTRY(env, array, index);
3382 #endif /* USDT2 */
3383 jobject ret = NULL; 2626 jobject ret = NULL;
3384 DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret); 2627 DT_RETURN_MARK(GetObjectArrayElement, jobject, (const jobject&)ret);
3385 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array)); 2628 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
3386 if (a->is_within_bounds(index)) { 2629 if (a->is_within_bounds(index)) {
3387 ret = JNIHandles::make_local(env, a->obj_at(index)); 2630 ret = JNIHandles::make_local(env, a->obj_at(index));
3391 sprintf(buf, "%d", index); 2634 sprintf(buf, "%d", index);
3392 THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf); 2635 THROW_MSG_0(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
3393 } 2636 }
3394 JNI_END 2637 JNI_END
3395 2638
3396 #ifndef USDT2
3397 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement);
3398 #else /* USDT2 */
3399 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement 2639 DT_VOID_RETURN_MARK_DECL(SetObjectArrayElement
3400 , HOTSPOT_JNI_SETOBJECTARRAYELEMENT_RETURN()); 2640 , HOTSPOT_JNI_SETOBJECTARRAYELEMENT_RETURN());
3401 #endif /* USDT2 */
3402 2641
3403 JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value)) 2642 JNI_ENTRY(void, jni_SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject value))
3404 JNIWrapper("SetObjectArrayElement"); 2643 JNIWrapper("SetObjectArrayElement");
3405 #ifndef USDT2
3406 DTRACE_PROBE4(hotspot_jni, SetObjectArrayElement__entry, env, array, index, value);
3407 #else /* USDT2 */
3408 HOTSPOT_JNI_SETOBJECTARRAYELEMENT_ENTRY(env, array, index, value); 2644 HOTSPOT_JNI_SETOBJECTARRAYELEMENT_ENTRY(env, array, index, value);
3409 #endif /* USDT2 */
3410 DT_VOID_RETURN_MARK(SetObjectArrayElement); 2645 DT_VOID_RETURN_MARK(SetObjectArrayElement);
3411 2646
3412 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array)); 2647 objArrayOop a = objArrayOop(JNIHandles::resolve_non_null(array));
3413 oop v = JNIHandles::resolve(value); 2648 oop v = JNIHandles::resolve(value);
3414 if (a->is_within_bounds(index)) { 2649 if (a->is_within_bounds(index)) {
3423 THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf); 2658 THROW_MSG(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), buf);
3424 } 2659 }
3425 JNI_END 2660 JNI_END
3426 2661
3427 2662
3428 #ifndef USDT2
3429 #define DEFINE_NEWSCALARARRAY(Return,Allocator,Result) \
3430 \
3431 DT_RETURN_MARK_DECL(New##Result##Array, Return); \
3432 \
3433 JNI_ENTRY(Return, \
3434 jni_New##Result##Array(JNIEnv *env, jsize len)) \
3435 JNIWrapper("New" XSTR(Result) "Array"); \
3436 DTRACE_PROBE2(hotspot_jni, New##Result##Array__entry, env, len);\
3437 Return ret = NULL;\
3438 DT_RETURN_MARK(New##Result##Array, Return, (const Return&)ret);\
3439 \
3440 oop obj= oopFactory::Allocator(len, CHECK_0); \
3441 ret = (Return) JNIHandles::make_local(env, obj); \
3442 return ret;\
3443 JNI_END
3444
3445 DEFINE_NEWSCALARARRAY(jbooleanArray, new_boolArray, Boolean)
3446 DEFINE_NEWSCALARARRAY(jbyteArray, new_byteArray, Byte)
3447 DEFINE_NEWSCALARARRAY(jshortArray, new_shortArray, Short)
3448 DEFINE_NEWSCALARARRAY(jcharArray, new_charArray, Char)
3449 DEFINE_NEWSCALARARRAY(jintArray, new_intArray, Int)
3450 DEFINE_NEWSCALARARRAY(jlongArray, new_longArray, Long)
3451 DEFINE_NEWSCALARARRAY(jfloatArray, new_singleArray, Float)
3452 DEFINE_NEWSCALARARRAY(jdoubleArray, new_doubleArray, Double)
3453
3454 #else /* USDT2 */
3455 2663
3456 #define DEFINE_NEWSCALARARRAY(Return,Allocator,Result \ 2664 #define DEFINE_NEWSCALARARRAY(Return,Allocator,Result \
3457 ,EntryProbe,ReturnProbe) \ 2665 ,EntryProbe,ReturnProbe) \
3458 \ 2666 \
3459 DT_RETURN_MARK_DECL(New##Result##Array, Return \ 2667 DT_RETURN_MARK_DECL(New##Result##Array, Return \
3493 HOTSPOT_JNI_NEWFLOATARRAY_ENTRY(env, len), 2701 HOTSPOT_JNI_NEWFLOATARRAY_ENTRY(env, len),
3494 HOTSPOT_JNI_NEWFLOATARRAY_RETURN(_ret_ref)) 2702 HOTSPOT_JNI_NEWFLOATARRAY_RETURN(_ret_ref))
3495 DEFINE_NEWSCALARARRAY(jdoubleArray, new_doubleArray, Double, 2703 DEFINE_NEWSCALARARRAY(jdoubleArray, new_doubleArray, Double,
3496 HOTSPOT_JNI_NEWDOUBLEARRAY_ENTRY(env, len), 2704 HOTSPOT_JNI_NEWDOUBLEARRAY_ENTRY(env, len),
3497 HOTSPOT_JNI_NEWDOUBLEARRAY_RETURN(_ret_ref)) 2705 HOTSPOT_JNI_NEWDOUBLEARRAY_RETURN(_ret_ref))
3498 #endif /* USDT2 */
3499 2706
3500 // Return an address which will fault if the caller writes to it. 2707 // Return an address which will fault if the caller writes to it.
3501 2708
3502 static char* get_bad_address() { 2709 static char* get_bad_address() {
3503 static char* bad_address = NULL; 2710 static char* bad_address = NULL;
3511 } 2718 }
3512 return bad_address; 2719 return bad_address;
3513 } 2720 }
3514 2721
3515 2722
3516 #ifndef USDT2
3517 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag) \
3518 \
3519 JNI_QUICK_ENTRY(ElementType*, \
3520 jni_Get##Result##ArrayElements(JNIEnv *env, ElementType##Array array, jboolean *isCopy)) \
3521 JNIWrapper("Get" XSTR(Result) "ArrayElements"); \
3522 DTRACE_PROBE3(hotspot_jni, Get##Result##ArrayElements__entry, env, array, isCopy);\
3523 /* allocate an chunk of memory in c land */ \
3524 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
3525 ElementType* result; \
3526 int len = a->length(); \
3527 if (len == 0) { \
3528 /* Empty array: legal but useless, can't return NULL. \
3529 * Return a pointer to something useless. \
3530 * Avoid asserts in typeArrayOop. */ \
3531 result = (ElementType*)get_bad_address(); \
3532 } else { \
3533 /* JNI Specification states return NULL on OOM */ \
3534 result = NEW_C_HEAP_ARRAY_RETURN_NULL(ElementType, len, mtInternal); \
3535 if (result != NULL) { \
3536 /* copy the array to the c chunk */ \
3537 memcpy(result, a->Tag##_at_addr(0), sizeof(ElementType)*len); \
3538 if (isCopy) { \
3539 *isCopy = JNI_TRUE; \
3540 } \
3541 } \
3542 } \
3543 DTRACE_PROBE1(hotspot_jni, Get##Result##ArrayElements__return, result);\
3544 return result; \
3545 JNI_END
3546
3547 DEFINE_GETSCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
3548 DEFINE_GETSCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte)
3549 DEFINE_GETSCALARARRAYELEMENTS(T_SHORT, jshort, Short, short)
3550 DEFINE_GETSCALARARRAYELEMENTS(T_CHAR, jchar, Char, char)
3551 DEFINE_GETSCALARARRAYELEMENTS(T_INT, jint, Int, int)
3552 DEFINE_GETSCALARARRAYELEMENTS(T_LONG, jlong, Long, long)
3553 DEFINE_GETSCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float)
3554 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double)
3555
3556 #else /* USDT2 */
3557 2723
3558 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag \ 2724 #define DEFINE_GETSCALARARRAYELEMENTS(ElementTag,ElementType,Result, Tag \
3559 , EntryProbe, ReturnProbe) \ 2725 , EntryProbe, ReturnProbe) \
3560 \ 2726 \
3561 JNI_QUICK_ENTRY(ElementType*, \ 2727 JNI_QUICK_ENTRY(ElementType*, \
3609 , HOTSPOT_JNI_GETFLOATARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy), 2775 , HOTSPOT_JNI_GETFLOATARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
3610 HOTSPOT_JNI_GETFLOATARRAYELEMENTS_RETURN(result)) 2776 HOTSPOT_JNI_GETFLOATARRAYELEMENTS_RETURN(result))
3611 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double 2777 DEFINE_GETSCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double
3612 , HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy), 2778 , HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_ENTRY(env, array, (uintptr_t *) isCopy),
3613 HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_RETURN(result)) 2779 HOTSPOT_JNI_GETDOUBLEARRAYELEMENTS_RETURN(result))
3614 #endif /* USDT2 */ 2780
3615
3616 #ifndef USDT2
3617 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag) \
3618 \
3619 JNI_QUICK_ENTRY(void, \
3620 jni_Release##Result##ArrayElements(JNIEnv *env, ElementType##Array array, \
3621 ElementType *buf, jint mode)) \
3622 JNIWrapper("Release" XSTR(Result) "ArrayElements"); \
3623 DTRACE_PROBE4(hotspot_jni, Release##Result##ArrayElements__entry, env, array, buf, mode);\
3624 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
3625 int len = a->length(); \
3626 if (len != 0) { /* Empty array: nothing to free or copy. */ \
3627 if ((mode == 0) || (mode == JNI_COMMIT)) { \
3628 memcpy(a->Tag##_at_addr(0), buf, sizeof(ElementType)*len); \
3629 } \
3630 if ((mode == 0) || (mode == JNI_ABORT)) { \
3631 FreeHeap(buf); \
3632 } \
3633 } \
3634 DTRACE_PROBE(hotspot_jni, Release##Result##ArrayElements__return);\
3635 JNI_END
3636
3637 DEFINE_RELEASESCALARARRAYELEMENTS(T_BOOLEAN, jboolean, Boolean, bool)
3638 DEFINE_RELEASESCALARARRAYELEMENTS(T_BYTE, jbyte, Byte, byte)
3639 DEFINE_RELEASESCALARARRAYELEMENTS(T_SHORT, jshort, Short, short)
3640 DEFINE_RELEASESCALARARRAYELEMENTS(T_CHAR, jchar, Char, char)
3641 DEFINE_RELEASESCALARARRAYELEMENTS(T_INT, jint, Int, int)
3642 DEFINE_RELEASESCALARARRAYELEMENTS(T_LONG, jlong, Long, long)
3643 DEFINE_RELEASESCALARARRAYELEMENTS(T_FLOAT, jfloat, Float, float)
3644 DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double)
3645
3646 #else /* USDT2 */
3647 2781
3648 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \ 2782 #define DEFINE_RELEASESCALARARRAYELEMENTS(ElementTag,ElementType,Result,Tag \
3649 , EntryProbe, ReturnProbe);\ 2783 , EntryProbe, ReturnProbe);\
3650 \ 2784 \
3651 JNI_QUICK_ENTRY(void, \ 2785 JNI_QUICK_ENTRY(void, \
3688 , HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_ENTRY(env, array, (float *) buf, mode), 2822 , HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_ENTRY(env, array, (float *) buf, mode),
3689 HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_RETURN()) 2823 HOTSPOT_JNI_RELEASEFLOATARRAYELEMENTS_RETURN())
3690 DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double 2824 DEFINE_RELEASESCALARARRAYELEMENTS(T_DOUBLE, jdouble, Double, double
3691 , HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_ENTRY(env, array, (double *) buf, mode), 2825 , HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_ENTRY(env, array, (double *) buf, mode),
3692 HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_RETURN()) 2826 HOTSPOT_JNI_RELEASEDOUBLEARRAYELEMENTS_RETURN())
3693 #endif /* USDT2 */ 2827
3694
3695 #ifndef USDT2
3696 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
3697 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion);\
3698 \
3699 JNI_ENTRY(void, \
3700 jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
3701 jsize len, ElementType *buf)) \
3702 JNIWrapper("Get" XSTR(Result) "ArrayRegion"); \
3703 DTRACE_PROBE5(hotspot_jni, Get##Result##ArrayRegion__entry, env, array, start, len, buf);\
3704 DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \
3705 typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \
3706 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \
3707 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
3708 } else { \
3709 if (len > 0) { \
3710 int sc = TypeArrayKlass::cast(src->klass())->log2_element_size(); \
3711 memcpy((u_char*) buf, \
3712 (u_char*) src->Tag##_at_addr(start), \
3713 len << sc); \
3714 } \
3715 } \
3716 JNI_END
3717
3718 DEFINE_GETSCALARARRAYREGION(T_BOOLEAN, jboolean,Boolean, bool)
3719 DEFINE_GETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte)
3720 DEFINE_GETSCALARARRAYREGION(T_SHORT, jshort, Short, short)
3721 DEFINE_GETSCALARARRAYREGION(T_CHAR, jchar, Char, char)
3722 DEFINE_GETSCALARARRAYREGION(T_INT, jint, Int, int)
3723 DEFINE_GETSCALARARRAYREGION(T_LONG, jlong, Long, long)
3724 DEFINE_GETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float)
3725 DEFINE_GETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double)
3726
3727 #else /* USDT2 */
3728 2828
3729 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \ 2829 #define DEFINE_GETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
3730 , EntryProbe, ReturnProbe); \ 2830 , EntryProbe, ReturnProbe); \
3731 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion \ 2831 DT_VOID_RETURN_MARK_DECL(Get##Result##ArrayRegion \
3732 , ReturnProbe); \ 2832 , ReturnProbe); \
3772 , HOTSPOT_JNI_GETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf), 2872 , HOTSPOT_JNI_GETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf),
3773 HOTSPOT_JNI_GETFLOATARRAYREGION_RETURN()); 2873 HOTSPOT_JNI_GETFLOATARRAYREGION_RETURN());
3774 DEFINE_GETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double 2874 DEFINE_GETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double
3775 , HOTSPOT_JNI_GETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf), 2875 , HOTSPOT_JNI_GETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
3776 HOTSPOT_JNI_GETDOUBLEARRAYREGION_RETURN()); 2876 HOTSPOT_JNI_GETDOUBLEARRAYREGION_RETURN());
3777 #endif /* USDT2 */ 2877
3778
3779 #ifndef USDT2
3780 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag) \
3781 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion);\
3782 \
3783 JNI_ENTRY(void, \
3784 jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start, \
3785 jsize len, const ElementType *buf)) \
3786 JNIWrapper("Set" XSTR(Result) "ArrayRegion"); \
3787 DTRACE_PROBE5(hotspot_jni, Set##Result##ArrayRegion__entry, env, array, start, len, buf);\
3788 DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \
3789 typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \
3790 if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \
3791 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \
3792 } else { \
3793 if (len > 0) { \
3794 int sc = TypeArrayKlass::cast(dst->klass())->log2_element_size(); \
3795 memcpy((u_char*) dst->Tag##_at_addr(start), \
3796 (u_char*) buf, \
3797 len << sc); \
3798 } \
3799 } \
3800 JNI_END
3801
3802 DEFINE_SETSCALARARRAYREGION(T_BOOLEAN, jboolean, Boolean, bool)
3803 DEFINE_SETSCALARARRAYREGION(T_BYTE, jbyte, Byte, byte)
3804 DEFINE_SETSCALARARRAYREGION(T_SHORT, jshort, Short, short)
3805 DEFINE_SETSCALARARRAYREGION(T_CHAR, jchar, Char, char)
3806 DEFINE_SETSCALARARRAYREGION(T_INT, jint, Int, int)
3807 DEFINE_SETSCALARARRAYREGION(T_LONG, jlong, Long, long)
3808 DEFINE_SETSCALARARRAYREGION(T_FLOAT, jfloat, Float, float)
3809 DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double)
3810
3811 #else /* USDT2 */
3812 2878
3813 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \ 2879 #define DEFINE_SETSCALARARRAYREGION(ElementTag,ElementType,Result, Tag \
3814 , EntryProbe, ReturnProbe); \ 2880 , EntryProbe, ReturnProbe); \
3815 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion \ 2881 DT_VOID_RETURN_MARK_DECL(Set##Result##ArrayRegion \
3816 ,ReturnProbe); \ 2882 ,ReturnProbe); \
3856 , HOTSPOT_JNI_SETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf), 2922 , HOTSPOT_JNI_SETFLOATARRAYREGION_ENTRY(env, array, start, len, (float *) buf),
3857 HOTSPOT_JNI_SETFLOATARRAYREGION_RETURN()) 2923 HOTSPOT_JNI_SETFLOATARRAYREGION_RETURN())
3858 DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double 2924 DEFINE_SETSCALARARRAYREGION(T_DOUBLE, jdouble, Double, double
3859 , HOTSPOT_JNI_SETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf), 2925 , HOTSPOT_JNI_SETDOUBLEARRAYREGION_ENTRY(env, array, start, len, (double *) buf),
3860 HOTSPOT_JNI_SETDOUBLEARRAYREGION_RETURN()) 2926 HOTSPOT_JNI_SETDOUBLEARRAYREGION_RETURN())
3861 #endif /* USDT2 */
3862 2927
3863 2928
3864 // 2929 //
3865 // Interception of natives 2930 // Interception of natives
3866 // 2931 //
3941 method->name()->as_C_string()); 3006 method->name()->as_C_string());
3942 } 3007 }
3943 return true; 3008 return true;
3944 } 3009 }
3945 3010
3946 #ifndef USDT2
3947 DT_RETURN_MARK_DECL(RegisterNatives, jint);
3948 #else /* USDT2 */
3949 DT_RETURN_MARK_DECL(RegisterNatives, jint 3011 DT_RETURN_MARK_DECL(RegisterNatives, jint
3950 , HOTSPOT_JNI_REGISTERNATIVES_RETURN(_ret_ref)); 3012 , HOTSPOT_JNI_REGISTERNATIVES_RETURN(_ret_ref));
3951 #endif /* USDT2 */
3952 3013
3953 JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz, 3014 JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,
3954 const JNINativeMethod *methods, 3015 const JNINativeMethod *methods,
3955 jint nMethods)) 3016 jint nMethods))
3956 JNIWrapper("RegisterNatives"); 3017 JNIWrapper("RegisterNatives");
3957 #ifndef USDT2
3958 DTRACE_PROBE4(hotspot_jni, RegisterNatives__entry, env, clazz, methods, nMethods);
3959 #else /* USDT2 */
3960 HOTSPOT_JNI_REGISTERNATIVES_ENTRY(env, clazz, (void *) methods, nMethods); 3018 HOTSPOT_JNI_REGISTERNATIVES_ENTRY(env, clazz, (void *) methods, nMethods);
3961 #endif /* USDT2 */
3962 jint ret = 0; 3019 jint ret = 0;
3963 DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret); 3020 DT_RETURN_MARK(RegisterNatives, jint, (const jint&)ret);
3964 3021
3965 KlassHandle h_k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz))); 3022 KlassHandle h_k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));
3966 3023
3994 JNI_END 3051 JNI_END
3995 3052
3996 3053
3997 JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz)) 3054 JNI_ENTRY(jint, jni_UnregisterNatives(JNIEnv *env, jclass clazz))
3998 JNIWrapper("UnregisterNatives"); 3055 JNIWrapper("UnregisterNatives");
3999 #ifndef USDT2
4000 DTRACE_PROBE2(hotspot_jni, UnregisterNatives__entry, env, clazz);
4001 #else /* USDT2 */
4002 HOTSPOT_JNI_UNREGISTERNATIVES_ENTRY(env, clazz); 3056 HOTSPOT_JNI_UNREGISTERNATIVES_ENTRY(env, clazz);
4003 #endif /* USDT2 */
4004 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)); 3057 Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz));
4005 //%note jni_2 3058 //%note jni_2
4006 if (k->oop_is_instance()) { 3059 if (k->oop_is_instance()) {
4007 for (int index = 0; index < InstanceKlass::cast(k)->methods()->length(); index++) { 3060 for (int index = 0; index < InstanceKlass::cast(k)->methods()->length(); index++) {
4008 Method* m = InstanceKlass::cast(k)->methods()->at(index); 3061 Method* m = InstanceKlass::cast(k)->methods()->at(index);
4010 m->clear_native_function(); 3063 m->clear_native_function();
4011 m->set_signature_handler(NULL); 3064 m->set_signature_handler(NULL);
4012 } 3065 }
4013 } 3066 }
4014 } 3067 }
4015 #ifndef USDT2
4016 DTRACE_PROBE1(hotspot_jni, UnregisterNatives__return, 0);
4017 #else /* USDT2 */
4018 HOTSPOT_JNI_UNREGISTERNATIVES_RETURN(0); 3068 HOTSPOT_JNI_UNREGISTERNATIVES_RETURN(0);
4019 #endif /* USDT2 */
4020 return 0; 3069 return 0;
4021 JNI_END 3070 JNI_END
4022 3071
4023 // 3072 //
4024 // Monitor functions 3073 // Monitor functions
4025 // 3074 //
4026 3075
4027 #ifndef USDT2
4028 DT_RETURN_MARK_DECL(MonitorEnter, jint);
4029 #else /* USDT2 */
4030 DT_RETURN_MARK_DECL(MonitorEnter, jint 3076 DT_RETURN_MARK_DECL(MonitorEnter, jint
4031 , HOTSPOT_JNI_MONITORENTER_RETURN(_ret_ref)); 3077 , HOTSPOT_JNI_MONITORENTER_RETURN(_ret_ref));
4032 #endif /* USDT2 */
4033 3078
4034 JNI_ENTRY(jint, jni_MonitorEnter(JNIEnv *env, jobject jobj)) 3079 JNI_ENTRY(jint, jni_MonitorEnter(JNIEnv *env, jobject jobj))
4035 #ifndef USDT2
4036 DTRACE_PROBE2(hotspot_jni, MonitorEnter__entry, env, jobj);
4037 #else /* USDT2 */
4038 HOTSPOT_JNI_MONITORENTER_ENTRY(env, jobj); 3080 HOTSPOT_JNI_MONITORENTER_ENTRY(env, jobj);
4039 #endif /* USDT2 */
4040 jint ret = JNI_ERR; 3081 jint ret = JNI_ERR;
4041 DT_RETURN_MARK(MonitorEnter, jint, (const jint&)ret); 3082 DT_RETURN_MARK(MonitorEnter, jint, (const jint&)ret);
4042 3083
4043 // If the object is null, we can't do anything with it 3084 // If the object is null, we can't do anything with it
4044 if (jobj == NULL) { 3085 if (jobj == NULL) {
4049 ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR)); 3090 ObjectSynchronizer::jni_enter(obj, CHECK_(JNI_ERR));
4050 ret = JNI_OK; 3091 ret = JNI_OK;
4051 return ret; 3092 return ret;
4052 JNI_END 3093 JNI_END
4053 3094
4054 #ifndef USDT2
4055 DT_RETURN_MARK_DECL(MonitorExit, jint);
4056 #else /* USDT2 */
4057 DT_RETURN_MARK_DECL(MonitorExit, jint 3095 DT_RETURN_MARK_DECL(MonitorExit, jint
4058 , HOTSPOT_JNI_MONITOREXIT_RETURN(_ret_ref)); 3096 , HOTSPOT_JNI_MONITOREXIT_RETURN(_ret_ref));
4059 #endif /* USDT2 */
4060 3097
4061 JNI_ENTRY(jint, jni_MonitorExit(JNIEnv *env, jobject jobj)) 3098 JNI_ENTRY(jint, jni_MonitorExit(JNIEnv *env, jobject jobj))
4062 #ifndef USDT2
4063 DTRACE_PROBE2(hotspot_jni, MonitorExit__entry, env, jobj);
4064 #else /* USDT2 */
4065 HOTSPOT_JNI_MONITOREXIT_ENTRY(env, jobj); 3099 HOTSPOT_JNI_MONITOREXIT_ENTRY(env, jobj);
4066 #endif /* USDT2 */
4067 jint ret = JNI_ERR; 3100 jint ret = JNI_ERR;
4068 DT_RETURN_MARK(MonitorExit, jint, (const jint&)ret); 3101 DT_RETURN_MARK(MonitorExit, jint, (const jint&)ret);
4069 3102
4070 // Don't do anything with a null object 3103 // Don't do anything with a null object
4071 if (jobj == NULL) { 3104 if (jobj == NULL) {
4081 3114
4082 // 3115 //
4083 // Extensions 3116 // Extensions
4084 // 3117 //
4085 3118
4086 #ifndef USDT2
4087 DT_VOID_RETURN_MARK_DECL(GetStringRegion);
4088 #else /* USDT2 */
4089 DT_VOID_RETURN_MARK_DECL(GetStringRegion 3119 DT_VOID_RETURN_MARK_DECL(GetStringRegion
4090 , HOTSPOT_JNI_GETSTRINGREGION_RETURN()); 3120 , HOTSPOT_JNI_GETSTRINGREGION_RETURN());
4091 #endif /* USDT2 */
4092 3121
4093 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf)) 3122 JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, jsize len, jchar *buf))
4094 JNIWrapper("GetStringRegion"); 3123 JNIWrapper("GetStringRegion");
4095 #ifndef USDT2
4096 DTRACE_PROBE5(hotspot_jni, GetStringRegion__entry, env, string, start, len, buf);
4097 #else /* USDT2 */
4098 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf); 3124 HOTSPOT_JNI_GETSTRINGREGION_ENTRY(env, string, start, len, buf);
4099 #endif /* USDT2 */
4100 DT_VOID_RETURN_MARK(GetStringRegion); 3125 DT_VOID_RETURN_MARK(GetStringRegion);
4101 oop s = JNIHandles::resolve_non_null(string); 3126 oop s = JNIHandles::resolve_non_null(string);
4102 int s_len = java_lang_String::length(s); 3127 int s_len = java_lang_String::length(s);
4103 if (start < 0 || len < 0 || start + len > s_len) { 3128 if (start < 0 || len < 0 || start + len > s_len) {
4104 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); 3129 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
4109 memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len); 3134 memcpy(buf, s_value->char_at_addr(s_offset+start), sizeof(jchar)*len);
4110 } 3135 }
4111 } 3136 }
4112 JNI_END 3137 JNI_END
4113 3138
4114 #ifndef USDT2
4115 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion);
4116 #else /* USDT2 */
4117 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion 3139 DT_VOID_RETURN_MARK_DECL(GetStringUTFRegion
4118 , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN()); 3140 , HOTSPOT_JNI_GETSTRINGUTFREGION_RETURN());
4119 #endif /* USDT2 */
4120 3141
4121 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf)) 3142 JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start, jsize len, char *buf))
4122 JNIWrapper("GetStringUTFRegion"); 3143 JNIWrapper("GetStringUTFRegion");
4123 #ifndef USDT2
4124 DTRACE_PROBE5(hotspot_jni, GetStringUTFRegion__entry, env, string, start, len, buf);
4125 #else /* USDT2 */
4126 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf); 3144 HOTSPOT_JNI_GETSTRINGUTFREGION_ENTRY(env, string, start, len, buf);
4127 #endif /* USDT2 */
4128 DT_VOID_RETURN_MARK(GetStringUTFRegion); 3145 DT_VOID_RETURN_MARK(GetStringUTFRegion);
4129 oop s = JNIHandles::resolve_non_null(string); 3146 oop s = JNIHandles::resolve_non_null(string);
4130 int s_len = java_lang_String::length(s); 3147 int s_len = java_lang_String::length(s);
4131 if (start < 0 || len < 0 || start + len > s_len) { 3148 if (start < 0 || len < 0 || start + len > s_len) {
4132 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); 3149 THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException());
4148 JNI_END 3165 JNI_END
4149 3166
4150 3167
4151 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)) 3168 JNI_ENTRY(void*, jni_GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy))
4152 JNIWrapper("GetPrimitiveArrayCritical"); 3169 JNIWrapper("GetPrimitiveArrayCritical");
4153 #ifndef USDT2
4154 DTRACE_PROBE3(hotspot_jni, GetPrimitiveArrayCritical__entry, env, array, isCopy);
4155 #else /* USDT2 */
4156 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(env, array, (uintptr_t *) isCopy); 3170 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_ENTRY(env, array, (uintptr_t *) isCopy);
4157 #endif /* USDT2 */
4158 GC_locker::lock_critical(thread); 3171 GC_locker::lock_critical(thread);
4159 if (isCopy != NULL) { 3172 if (isCopy != NULL) {
4160 *isCopy = JNI_FALSE; 3173 *isCopy = JNI_FALSE;
4161 } 3174 }
4162 oop a = JNIHandles::resolve_non_null(array); 3175 oop a = JNIHandles::resolve_non_null(array);
4166 type = T_OBJECT; 3179 type = T_OBJECT;
4167 } else { 3180 } else {
4168 type = TypeArrayKlass::cast(a->klass())->element_type(); 3181 type = TypeArrayKlass::cast(a->klass())->element_type();
4169 } 3182 }
4170 void* ret = arrayOop(a)->base(type); 3183 void* ret = arrayOop(a)->base(type);
4171 #ifndef USDT2
4172 DTRACE_PROBE1(hotspot_jni, GetPrimitiveArrayCritical__return, ret);
4173 #else /* USDT2 */
4174 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret); 3184 HOTSPOT_JNI_GETPRIMITIVEARRAYCRITICAL_RETURN(ret);
4175 #endif /* USDT2 */
4176 return ret; 3185 return ret;
4177 JNI_END 3186 JNI_END
4178 3187
4179 3188
4180 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode)) 3189 JNI_ENTRY(void, jni_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray, jint mode))
4181 JNIWrapper("ReleasePrimitiveArrayCritical"); 3190 JNIWrapper("ReleasePrimitiveArrayCritical");
4182 #ifndef USDT2
4183 DTRACE_PROBE4(hotspot_jni, ReleasePrimitiveArrayCritical__entry, env, array, carray, mode);
4184 #else /* USDT2 */
4185 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode); 3191 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_ENTRY(env, array, carray, mode);
4186 #endif /* USDT2 */
4187 // The array, carray and mode arguments are ignored 3192 // The array, carray and mode arguments are ignored
4188 GC_locker::unlock_critical(thread); 3193 GC_locker::unlock_critical(thread);
4189 #ifndef USDT2
4190 DTRACE_PROBE(hotspot_jni, ReleasePrimitiveArrayCritical__return);
4191 #else /* USDT2 */
4192 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN(); 3194 HOTSPOT_JNI_RELEASEPRIMITIVEARRAYCRITICAL_RETURN();
4193 #endif /* USDT2 */
4194 JNI_END 3195 JNI_END
4195 3196
4196 3197
4197 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)) 3198 JNI_ENTRY(const jchar*, jni_GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy))
4198 JNIWrapper("GetStringCritical"); 3199 JNIWrapper("GetStringCritical");
4199 #ifndef USDT2
4200 DTRACE_PROBE3(hotspot_jni, GetStringCritical__entry, env, string, isCopy);
4201 #else /* USDT2 */
4202 HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy); 3200 HOTSPOT_JNI_GETSTRINGCRITICAL_ENTRY(env, string, (uintptr_t *) isCopy);
4203 #endif /* USDT2 */
4204 GC_locker::lock_critical(thread); 3201 GC_locker::lock_critical(thread);
4205 if (isCopy != NULL) { 3202 if (isCopy != NULL) {
4206 *isCopy = JNI_FALSE; 3203 *isCopy = JNI_FALSE;
4207 } 3204 }
4208 oop s = JNIHandles::resolve_non_null(string); 3205 oop s = JNIHandles::resolve_non_null(string);
4213 if (s_len > 0) { 3210 if (s_len > 0) {
4214 ret = s_value->char_at_addr(s_offset); 3211 ret = s_value->char_at_addr(s_offset);
4215 } else { 3212 } else {
4216 ret = (jchar*) s_value->base(T_CHAR); 3213 ret = (jchar*) s_value->base(T_CHAR);
4217 } 3214 }
4218 #ifndef USDT2
4219 DTRACE_PROBE1(hotspot_jni, GetStringCritical__return, ret);
4220 #else /* USDT2 */
4221 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret); 3215 HOTSPOT_JNI_GETSTRINGCRITICAL_RETURN((uint16_t *) ret);
4222 #endif /* USDT2 */
4223 return ret; 3216 return ret;
4224 JNI_END 3217 JNI_END
4225 3218
4226 3219
4227 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars)) 3220 JNI_ENTRY(void, jni_ReleaseStringCritical(JNIEnv *env, jstring str, const jchar *chars))
4228 JNIWrapper("ReleaseStringCritical"); 3221 JNIWrapper("ReleaseStringCritical");
4229 #ifndef USDT2
4230 DTRACE_PROBE3(hotspot_jni, ReleaseStringCritical__entry, env, str, chars);
4231 #else /* USDT2 */
4232 HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars); 3222 HOTSPOT_JNI_RELEASESTRINGCRITICAL_ENTRY(env, str, (uint16_t *) chars);
4233 #endif /* USDT2 */
4234 // The str and chars arguments are ignored 3223 // The str and chars arguments are ignored
4235 GC_locker::unlock_critical(thread); 3224 GC_locker::unlock_critical(thread);
4236 #ifndef USDT2
4237 DTRACE_PROBE(hotspot_jni, ReleaseStringCritical__return);
4238 #else /* USDT2 */
4239 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN(); 3225 HOTSPOT_JNI_RELEASESTRINGCRITICAL_RETURN();
4240 #endif /* USDT2 */
4241 JNI_END 3226 JNI_END
4242 3227
4243 3228
4244 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref)) 3229 JNI_ENTRY(jweak, jni_NewWeakGlobalRef(JNIEnv *env, jobject ref))
4245 JNIWrapper("jni_NewWeakGlobalRef"); 3230 JNIWrapper("jni_NewWeakGlobalRef");
4246 #ifndef USDT2
4247 DTRACE_PROBE2(hotspot_jni, NewWeakGlobalRef__entry, env, ref);
4248 #else /* USDT2 */
4249 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref); 3231 HOTSPOT_JNI_NEWWEAKGLOBALREF_ENTRY(env, ref);
4250 #endif /* USDT2 */
4251 Handle ref_handle(thread, JNIHandles::resolve(ref)); 3232 Handle ref_handle(thread, JNIHandles::resolve(ref));
4252 jweak ret = JNIHandles::make_weak_global(ref_handle); 3233 jweak ret = JNIHandles::make_weak_global(ref_handle);
4253 #ifndef USDT2
4254 DTRACE_PROBE1(hotspot_jni, NewWeakGlobalRef__return, ret);
4255 #else /* USDT2 */
4256 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret); 3234 HOTSPOT_JNI_NEWWEAKGLOBALREF_RETURN(ret);
4257 #endif /* USDT2 */
4258 return ret; 3235 return ret;
4259 JNI_END 3236 JNI_END
4260 3237
4261 // Must be JNI_ENTRY (with HandleMark) 3238 // Must be JNI_ENTRY (with HandleMark)
4262 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref)) 3239 JNI_ENTRY(void, jni_DeleteWeakGlobalRef(JNIEnv *env, jweak ref))
4263 JNIWrapper("jni_DeleteWeakGlobalRef"); 3240 JNIWrapper("jni_DeleteWeakGlobalRef");
4264 #ifndef USDT2
4265 DTRACE_PROBE2(hotspot_jni, DeleteWeakGlobalRef__entry, env, ref);
4266 #else /* USDT2 */
4267 HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(env, ref); 3241 HOTSPOT_JNI_DELETEWEAKGLOBALREF_ENTRY(env, ref);
4268 #endif /* USDT2 */
4269 JNIHandles::destroy_weak_global(ref); 3242 JNIHandles::destroy_weak_global(ref);
4270 #ifndef USDT2
4271 DTRACE_PROBE(hotspot_jni, DeleteWeakGlobalRef__return);
4272 #else /* USDT2 */
4273 HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN(); 3243 HOTSPOT_JNI_DELETEWEAKGLOBALREF_RETURN();
4274 #endif /* USDT2 */
4275 JNI_END 3244 JNI_END
4276 3245
4277 3246
4278 JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env)) 3247 JNI_QUICK_ENTRY(jboolean, jni_ExceptionCheck(JNIEnv *env))
4279 JNIWrapper("jni_ExceptionCheck"); 3248 JNIWrapper("jni_ExceptionCheck");
4280 #ifndef USDT2
4281 DTRACE_PROBE1(hotspot_jni, ExceptionCheck__entry, env);
4282 #else /* USDT2 */
4283 HOTSPOT_JNI_EXCEPTIONCHECK_ENTRY(env); 3249 HOTSPOT_JNI_EXCEPTIONCHECK_ENTRY(env);
4284 #endif /* USDT2 */
4285 jni_check_async_exceptions(thread); 3250 jni_check_async_exceptions(thread);
4286 jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE; 3251 jboolean ret = (thread->has_pending_exception()) ? JNI_TRUE : JNI_FALSE;
4287 #ifndef USDT2
4288 DTRACE_PROBE1(hotspot_jni, ExceptionCheck__return, ret);
4289 #else /* USDT2 */
4290 HOTSPOT_JNI_EXCEPTIONCHECK_RETURN(ret); 3252 HOTSPOT_JNI_EXCEPTIONCHECK_RETURN(ret);
4291 #endif /* USDT2 */
4292 return ret; 3253 return ret;
4293 JNI_END 3254 JNI_END
4294 3255
4295 3256
4296 // Initialization state for three routines below relating to 3257 // Initialization state for three routines below relating to
4393 { 3354 {
4394 // thread_from_jni_environment() will block if VM is gone. 3355 // thread_from_jni_environment() will block if VM is gone.
4395 JavaThread* thread = JavaThread::thread_from_jni_environment(env); 3356 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
4396 3357
4397 JNIWrapper("jni_NewDirectByteBuffer"); 3358 JNIWrapper("jni_NewDirectByteBuffer");
4398 #ifndef USDT2
4399 DTRACE_PROBE3(hotspot_jni, NewDirectByteBuffer__entry, env, address, capacity);
4400 #else /* USDT2 */
4401 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_ENTRY(env, address, capacity); 3359 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_ENTRY(env, address, capacity);
4402 #endif /* USDT2 */
4403 3360
4404 if (!directBufferSupportInitializeEnded) { 3361 if (!directBufferSupportInitializeEnded) {
4405 if (!initializeDirectBufferSupport(env, thread)) { 3362 if (!initializeDirectBufferSupport(env, thread)) {
4406 #ifndef USDT2
4407 DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, NULL);
4408 #else /* USDT2 */
4409 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(NULL); 3363 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(NULL);
4410 #endif /* USDT2 */
4411 return NULL; 3364 return NULL;
4412 } 3365 }
4413 } 3366 }
4414 3367
4415 // Being paranoid about accidental sign extension on address 3368 // Being paranoid about accidental sign extension on address
4416 jlong addr = (jlong) ((uintptr_t) address); 3369 jlong addr = (jlong) ((uintptr_t) address);
4417 // NOTE that package-private DirectByteBuffer constructor currently 3370 // NOTE that package-private DirectByteBuffer constructor currently
4418 // takes int capacity 3371 // takes int capacity
4419 jint cap = (jint) capacity; 3372 jint cap = (jint) capacity;
4420 jobject ret = env->NewObject(directByteBufferClass, directByteBufferConstructor, addr, cap); 3373 jobject ret = env->NewObject(directByteBufferClass, directByteBufferConstructor, addr, cap);
4421 #ifndef USDT2
4422 DTRACE_PROBE1(hotspot_jni, NewDirectByteBuffer__return, ret);
4423 #else /* USDT2 */
4424 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(ret); 3374 HOTSPOT_JNI_NEWDIRECTBYTEBUFFER_RETURN(ret);
4425 #endif /* USDT2 */
4426 return ret; 3375 return ret;
4427 } 3376 }
4428 3377
4429 #ifndef USDT2
4430 DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*);
4431 #else /* USDT2 */
4432 DT_RETURN_MARK_DECL(GetDirectBufferAddress, void* 3378 DT_RETURN_MARK_DECL(GetDirectBufferAddress, void*
4433 , HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_RETURN((void*) _ret_ref)); 3379 , HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_RETURN((void*) _ret_ref));
4434 #endif /* USDT2 */
4435 3380
4436 extern "C" void* JNICALL jni_GetDirectBufferAddress(JNIEnv *env, jobject buf) 3381 extern "C" void* JNICALL jni_GetDirectBufferAddress(JNIEnv *env, jobject buf)
4437 { 3382 {
4438 // thread_from_jni_environment() will block if VM is gone. 3383 // thread_from_jni_environment() will block if VM is gone.
4439 JavaThread* thread = JavaThread::thread_from_jni_environment(env); 3384 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
4440 3385
4441 JNIWrapper("jni_GetDirectBufferAddress"); 3386 JNIWrapper("jni_GetDirectBufferAddress");
4442 #ifndef USDT2
4443 DTRACE_PROBE2(hotspot_jni, GetDirectBufferAddress__entry, env, buf);
4444 #else /* USDT2 */
4445 HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_ENTRY(env, buf); 3387 HOTSPOT_JNI_GETDIRECTBUFFERADDRESS_ENTRY(env, buf);
4446 #endif /* USDT2 */
4447 void* ret = NULL; 3388 void* ret = NULL;
4448 DT_RETURN_MARK(GetDirectBufferAddress, void*, (const void*&)ret); 3389 DT_RETURN_MARK(GetDirectBufferAddress, void*, (const void*&)ret);
4449 3390
4450 if (!directBufferSupportInitializeEnded) { 3391 if (!directBufferSupportInitializeEnded) {
4451 if (!initializeDirectBufferSupport(env, thread)) { 3392 if (!initializeDirectBufferSupport(env, thread)) {
4459 3400
4460 ret = (void*)(intptr_t)env->GetLongField(buf, directBufferAddressField); 3401 ret = (void*)(intptr_t)env->GetLongField(buf, directBufferAddressField);
4461 return ret; 3402 return ret;
4462 } 3403 }
4463 3404
4464 #ifndef USDT2
4465 DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong);
4466 #else /* USDT2 */
4467 DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong 3405 DT_RETURN_MARK_DECL(GetDirectBufferCapacity, jlong
4468 , HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_RETURN(_ret_ref)); 3406 , HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_RETURN(_ret_ref));
4469 #endif /* USDT2 */
4470 3407
4471 extern "C" jlong JNICALL jni_GetDirectBufferCapacity(JNIEnv *env, jobject buf) 3408 extern "C" jlong JNICALL jni_GetDirectBufferCapacity(JNIEnv *env, jobject buf)
4472 { 3409 {
4473 // thread_from_jni_environment() will block if VM is gone. 3410 // thread_from_jni_environment() will block if VM is gone.
4474 JavaThread* thread = JavaThread::thread_from_jni_environment(env); 3411 JavaThread* thread = JavaThread::thread_from_jni_environment(env);
4475 3412
4476 JNIWrapper("jni_GetDirectBufferCapacity"); 3413 JNIWrapper("jni_GetDirectBufferCapacity");
4477 #ifndef USDT2
4478 DTRACE_PROBE2(hotspot_jni, GetDirectBufferCapacity__entry, env, buf);
4479 #else /* USDT2 */
4480 HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_ENTRY(env, buf); 3414 HOTSPOT_JNI_GETDIRECTBUFFERCAPACITY_ENTRY(env, buf);
4481 #endif /* USDT2 */
4482 jlong ret = -1; 3415 jlong ret = -1;
4483 DT_RETURN_MARK(GetDirectBufferCapacity, jlong, (const jlong&)ret); 3416 DT_RETURN_MARK(GetDirectBufferCapacity, jlong, (const jlong&)ret);
4484 3417
4485 if (!directBufferSupportInitializeEnded) { 3418 if (!directBufferSupportInitializeEnded) {
4486 if (!initializeDirectBufferSupport(env, thread)) { 3419 if (!initializeDirectBufferSupport(env, thread)) {
4503 } 3436 }
4504 3437
4505 3438
4506 JNI_LEAF(jint, jni_GetVersion(JNIEnv *env)) 3439 JNI_LEAF(jint, jni_GetVersion(JNIEnv *env))
4507 JNIWrapper("GetVersion"); 3440 JNIWrapper("GetVersion");
4508 #ifndef USDT2
4509 DTRACE_PROBE1(hotspot_jni, GetVersion__entry, env);
4510 #else /* USDT2 */
4511 HOTSPOT_JNI_GETVERSION_ENTRY(env); 3441 HOTSPOT_JNI_GETVERSION_ENTRY(env);
4512 #endif /* USDT2 */
4513 #ifndef USDT2
4514 DTRACE_PROBE1(hotspot_jni, GetVersion__return, CurrentVersion);
4515 #else /* USDT2 */
4516 HOTSPOT_JNI_GETVERSION_RETURN(CurrentVersion); 3442 HOTSPOT_JNI_GETVERSION_RETURN(CurrentVersion);
4517 #endif /* USDT2 */
4518 return CurrentVersion; 3443 return CurrentVersion;
4519 JNI_END 3444 JNI_END
4520 3445
4521 extern struct JavaVM_ main_vm; 3446 extern struct JavaVM_ main_vm;
4522 3447
4523 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm)) 3448 JNI_LEAF(jint, jni_GetJavaVM(JNIEnv *env, JavaVM **vm))
4524 JNIWrapper("jni_GetJavaVM"); 3449 JNIWrapper("jni_GetJavaVM");
4525 #ifndef USDT2
4526 DTRACE_PROBE2(hotspot_jni, GetJavaVM__entry, env, vm);
4527 #else /* USDT2 */
4528 HOTSPOT_JNI_GETJAVAVM_ENTRY(env, (void **) vm); 3450 HOTSPOT_JNI_GETJAVAVM_ENTRY(env, (void **) vm);
4529 #endif /* USDT2 */
4530 *vm = (JavaVM *)(&main_vm); 3451 *vm = (JavaVM *)(&main_vm);
4531 #ifndef USDT2
4532 DTRACE_PROBE1(hotspot_jni, GetJavaVM__return, JNI_OK);
4533 #else /* USDT2 */
4534 HOTSPOT_JNI_GETJAVAVM_RETURN(JNI_OK); 3452 HOTSPOT_JNI_GETJAVAVM_RETURN(JNI_OK);
4535 #endif /* USDT2 */
4536 return JNI_OK; 3453 return JNI_OK;
4537 JNI_END 3454 JNI_END
4538 3455
4539 // Structure containing all jni functions 3456 // Structure containing all jni functions
4540 struct JNINativeInterface_ jni_NativeInterface = { 3457 struct JNINativeInterface_ jni_NativeInterface = {
4908 3825
4909 3826
4910 #define JAVASTACKSIZE (400 * 1024) /* Default size of a thread java stack */ 3827 #define JAVASTACKSIZE (400 * 1024) /* Default size of a thread java stack */
4911 enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL }; 3828 enum { VERIFY_NONE, VERIFY_REMOTE, VERIFY_ALL };
4912 3829
4913 #ifndef USDT2
4914 HS_DTRACE_PROBE_DECL1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, void*);
4915 DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint);
4916 #else /* USDT2 */
4917 DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint 3830 DT_RETURN_MARK_DECL(GetDefaultJavaVMInitArgs, jint
4918 , HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_RETURN(_ret_ref)); 3831 , HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_RETURN(_ret_ref));
4919 #endif /* USDT2 */
4920 3832
4921 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) { 3833 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetDefaultJavaVMInitArgs(void *args_) {
4922 #ifndef USDT2
4923 HS_DTRACE_PROBE1(hotspot_jni, GetDefaultJavaVMInitArgs__entry, args_);
4924 #else /* USDT2 */
4925 HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_ENTRY(args_); 3834 HOTSPOT_JNI_GETDEFAULTJAVAVMINITARGS_ENTRY(args_);
4926 #endif /* USDT2 */
4927 JDK1_1InitArgs *args = (JDK1_1InitArgs *)args_; 3835 JDK1_1InitArgs *args = (JDK1_1InitArgs *)args_;
4928 jint ret = JNI_ERR; 3836 jint ret = JNI_ERR;
4929 DT_RETURN_MARK(GetDefaultJavaVMInitArgs, jint, (const jint&)ret); 3837 DT_RETURN_MARK(GetDefaultJavaVMInitArgs, jint, (const jint&)ret);
4930 3838
4931 if (Threads::is_supported_jni_version(args->version)) { 3839 if (Threads::is_supported_jni_version(args->version)) {
5007 3915
5008 #undef run_unit_test 3916 #undef run_unit_test
5009 3917
5010 #endif 3918 #endif
5011 3919
5012 #ifndef USDT2
5013 HS_DTRACE_PROBE_DECL3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
5014 DT_RETURN_MARK_DECL(CreateJavaVM, jint);
5015 #else /* USDT2 */
5016 DT_RETURN_MARK_DECL(CreateJavaVM, jint 3920 DT_RETURN_MARK_DECL(CreateJavaVM, jint
5017 , HOTSPOT_JNI_CREATEJAVAVM_RETURN(_ret_ref)); 3921 , HOTSPOT_JNI_CREATEJAVAVM_RETURN(_ret_ref));
5018 #endif /* USDT2 */
5019 3922
5020 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) { 3923 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_CreateJavaVM(JavaVM **vm, void **penv, void *args) {
5021 #ifndef USDT2
5022 HS_DTRACE_PROBE3(hotspot_jni, CreateJavaVM__entry, vm, penv, args);
5023 #else /* USDT2 */
5024 HOTSPOT_JNI_CREATEJAVAVM_ENTRY((void **) vm, penv, args); 3924 HOTSPOT_JNI_CREATEJAVAVM_ENTRY((void **) vm, penv, args);
5025 #endif /* USDT2 */
5026 3925
5027 jint result = JNI_ERR; 3926 jint result = JNI_ERR;
5028 DT_RETURN_MARK(CreateJavaVM, jint, (const jint&)result); 3927 DT_RETURN_MARK(CreateJavaVM, jint, (const jint&)result);
5029 3928
5030 // We're about to use Atomic::xchg for synchronization. Some Zero 3929 // We're about to use Atomic::xchg for synchronization. Some Zero
5142 } 4041 }
5143 4042
5144 return result; 4043 return result;
5145 } 4044 }
5146 4045
5147 #ifndef USDT2
5148 HS_DTRACE_PROBE_DECL3(hotspot_jni, GetCreatedJavaVMs__entry, \
5149 JavaVM**, jsize, jsize*);
5150 HS_DTRACE_PROBE_DECL1(hotspot_jni, GetCreatedJavaVMs__return, jint);
5151 #endif /* !USDT2 */
5152 4046
5153 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **vm_buf, jsize bufLen, jsize *numVMs) { 4047 _JNI_IMPORT_OR_EXPORT_ jint JNICALL JNI_GetCreatedJavaVMs(JavaVM **vm_buf, jsize bufLen, jsize *numVMs) {
5154 // See bug 4367188, the wrapper can sometimes cause VM crashes 4048 // See bug 4367188, the wrapper can sometimes cause VM crashes
5155 // JNIWrapper("GetCreatedJavaVMs"); 4049 // JNIWrapper("GetCreatedJavaVMs");
5156 #ifndef USDT2 4050
5157 HS_DTRACE_PROBE3(hotspot_jni, GetCreatedJavaVMs__entry, \
5158 vm_buf, bufLen, numVMs);
5159 #else /* USDT2 */
5160 HOTSPOT_JNI_GETCREATEDJAVAVMS_ENTRY((void **) vm_buf, bufLen, (uintptr_t *) numVMs); 4051 HOTSPOT_JNI_GETCREATEDJAVAVMS_ENTRY((void **) vm_buf, bufLen, (uintptr_t *) numVMs);
5161 #endif /* USDT2 */ 4052
5162 if (vm_created) { 4053 if (vm_created) {
5163 if (numVMs != NULL) *numVMs = 1; 4054 if (numVMs != NULL) *numVMs = 1;
5164 if (bufLen > 0) *vm_buf = (JavaVM *)(&main_vm); 4055 if (bufLen > 0) *vm_buf = (JavaVM *)(&main_vm);
5165 } else { 4056 } else {
5166 if (numVMs != NULL) *numVMs = 0; 4057 if (numVMs != NULL) *numVMs = 0;
5167 } 4058 }
5168 #ifndef USDT2
5169 HS_DTRACE_PROBE1(hotspot_jni, GetCreatedJavaVMs__return, JNI_OK);
5170 #else /* USDT2 */
5171 HOTSPOT_JNI_GETCREATEDJAVAVMS_RETURN(JNI_OK); 4059 HOTSPOT_JNI_GETCREATEDJAVAVMS_RETURN(JNI_OK);
5172 #endif /* USDT2 */
5173 return JNI_OK; 4060 return JNI_OK;
5174 } 4061 }
5175 4062
5176 extern "C" { 4063 extern "C" {
5177 4064
5178 #ifndef USDT2
5179 DT_RETURN_MARK_DECL(DestroyJavaVM, jint);
5180 #else /* USDT2 */
5181 DT_RETURN_MARK_DECL(DestroyJavaVM, jint 4065 DT_RETURN_MARK_DECL(DestroyJavaVM, jint
5182 , HOTSPOT_JNI_DESTROYJAVAVM_RETURN(_ret_ref)); 4066 , HOTSPOT_JNI_DESTROYJAVAVM_RETURN(_ret_ref));
5183 #endif /* USDT2 */
5184 4067
5185 jint JNICALL jni_DestroyJavaVM(JavaVM *vm) { 4068 jint JNICALL jni_DestroyJavaVM(JavaVM *vm) {
5186 #ifndef USDT2
5187 DTRACE_PROBE1(hotspot_jni, DestroyJavaVM__entry, vm);
5188 #else /* USDT2 */
5189 HOTSPOT_JNI_DESTROYJAVAVM_ENTRY(vm); 4069 HOTSPOT_JNI_DESTROYJAVAVM_ENTRY(vm);
5190 #endif /* USDT2 */
5191 jint res = JNI_ERR; 4070 jint res = JNI_ERR;
5192 DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res); 4071 DT_RETURN_MARK(DestroyJavaVM, jint, (const jint&)res);
5193 4072
5194 if (!vm_created) { 4073 if (!vm_created) {
5195 res = JNI_ERR; 4074 res = JNI_ERR;
5337 return JNI_OK; 4216 return JNI_OK;
5338 } 4217 }
5339 4218
5340 4219
5341 jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) { 4220 jint JNICALL jni_AttachCurrentThread(JavaVM *vm, void **penv, void *_args) {
5342 #ifndef USDT2
5343 DTRACE_PROBE3(hotspot_jni, AttachCurrentThread__entry, vm, penv, _args);
5344 #else /* USDT2 */
5345 HOTSPOT_JNI_ATTACHCURRENTTHREAD_ENTRY(vm, penv, _args); 4221 HOTSPOT_JNI_ATTACHCURRENTTHREAD_ENTRY(vm, penv, _args);
5346 #endif /* USDT2 */
5347 if (!vm_created) { 4222 if (!vm_created) {
5348 #ifndef USDT2
5349 DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, JNI_ERR);
5350 #else /* USDT2 */
5351 HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN((uint32_t) JNI_ERR); 4223 HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN((uint32_t) JNI_ERR);
5352 #endif /* USDT2 */
5353 return JNI_ERR; 4224 return JNI_ERR;
5354 } 4225 }
5355 4226
5356 JNIWrapper("AttachCurrentThread"); 4227 JNIWrapper("AttachCurrentThread");
5357 jint ret = attach_current_thread(vm, penv, _args, false); 4228 jint ret = attach_current_thread(vm, penv, _args, false);
5358 #ifndef USDT2
5359 DTRACE_PROBE1(hotspot_jni, AttachCurrentThread__return, ret);
5360 #else /* USDT2 */
5361 HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN(ret); 4229 HOTSPOT_JNI_ATTACHCURRENTTHREAD_RETURN(ret);
5362 #endif /* USDT2 */
5363 return ret; 4230 return ret;
5364 } 4231 }
5365 4232
5366 4233
5367 jint JNICALL jni_DetachCurrentThread(JavaVM *vm) { 4234 jint JNICALL jni_DetachCurrentThread(JavaVM *vm) {
5368 #ifndef USDT2
5369 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__entry, vm);
5370 #else /* USDT2 */
5371 HOTSPOT_JNI_DETACHCURRENTTHREAD_ENTRY(vm); 4235 HOTSPOT_JNI_DETACHCURRENTTHREAD_ENTRY(vm);
5372 #endif /* USDT2 */
5373 VM_Exit::block_if_vm_exited(); 4236 VM_Exit::block_if_vm_exited();
5374 4237
5375 JNIWrapper("DetachCurrentThread"); 4238 JNIWrapper("DetachCurrentThread");
5376 4239
5377 // If the thread has been deattacted the operations is a no-op 4240 // If the thread has been deattacted the operations is a no-op
5378 if (ThreadLocalStorage::thread() == NULL) { 4241 if (ThreadLocalStorage::thread() == NULL) {
5379 #ifndef USDT2
5380 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
5381 #else /* USDT2 */
5382 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(JNI_OK); 4242 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(JNI_OK);
5383 #endif /* USDT2 */
5384 return JNI_OK; 4243 return JNI_OK;
5385 } 4244 }
5386 4245
5387 JavaThread* thread = JavaThread::current(); 4246 JavaThread* thread = JavaThread::current();
5388 if (thread->has_last_Java_frame()) { 4247 if (thread->has_last_Java_frame()) {
5389 #ifndef USDT2
5390 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_ERR);
5391 #else /* USDT2 */
5392 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN((uint32_t) JNI_ERR); 4248 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN((uint32_t) JNI_ERR);
5393 #endif /* USDT2 */
5394 // Can't detach a thread that's running java, that can't work. 4249 // Can't detach a thread that's running java, that can't work.
5395 return JNI_ERR; 4250 return JNI_ERR;
5396 } 4251 }
5397 4252
5398 // Safepoint support. Have to do call-back to safepoint code, if in the 4253 // Safepoint support. Have to do call-back to safepoint code, if in the
5409 // (platform-dependent) methods where we do alternate stack 4264 // (platform-dependent) methods where we do alternate stack
5410 // maintenance work?) 4265 // maintenance work?)
5411 thread->exit(false, JavaThread::jni_detach); 4266 thread->exit(false, JavaThread::jni_detach);
5412 delete thread; 4267 delete thread;
5413 4268
5414 #ifndef USDT2
5415 DTRACE_PROBE1(hotspot_jni, DetachCurrentThread__return, JNI_OK);
5416 #else /* USDT2 */
5417 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(JNI_OK); 4269 HOTSPOT_JNI_DETACHCURRENTTHREAD_RETURN(JNI_OK);
5418 #endif /* USDT2 */
5419 return JNI_OK; 4270 return JNI_OK;
5420 } 4271 }
5421 4272
5422 #ifndef USDT2
5423 DT_RETURN_MARK_DECL(GetEnv, jint);
5424 #else /* USDT2 */
5425 DT_RETURN_MARK_DECL(GetEnv, jint 4273 DT_RETURN_MARK_DECL(GetEnv, jint
5426 , HOTSPOT_JNI_GETENV_RETURN(_ret_ref)); 4274 , HOTSPOT_JNI_GETENV_RETURN(_ret_ref));
5427 #endif /* USDT2 */
5428 4275
5429 jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) { 4276 jint JNICALL jni_GetEnv(JavaVM *vm, void **penv, jint version) {
5430 #ifndef USDT2
5431 DTRACE_PROBE3(hotspot_jni, GetEnv__entry, vm, penv, version);
5432 #else /* USDT2 */
5433 HOTSPOT_JNI_GETENV_ENTRY(vm, penv, version); 4277 HOTSPOT_JNI_GETENV_ENTRY(vm, penv, version);
5434 #endif /* USDT2 */
5435 jint ret = JNI_ERR; 4278 jint ret = JNI_ERR;
5436 DT_RETURN_MARK(GetEnv, jint, (const jint&)ret); 4279 DT_RETURN_MARK(GetEnv, jint, (const jint&)ret);
5437 4280
5438 if (!vm_created) { 4281 if (!vm_created) {
5439 *penv = NULL; 4282 *penv = NULL;
5483 } 4326 }
5484 } 4327 }
5485 4328
5486 4329
5487 jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) { 4330 jint JNICALL jni_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *_args) {
5488 #ifndef USDT2
5489 DTRACE_PROBE3(hotspot_jni, AttachCurrentThreadAsDaemon__entry, vm, penv, _args);
5490 #else /* USDT2 */
5491 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_ENTRY(vm, penv, _args); 4331 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_ENTRY(vm, penv, _args);
5492 #endif /* USDT2 */
5493 if (!vm_created) { 4332 if (!vm_created) {
5494 #ifndef USDT2
5495 DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, JNI_ERR);
5496 #else /* USDT2 */
5497 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN((uint32_t) JNI_ERR); 4333 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN((uint32_t) JNI_ERR);
5498 #endif /* USDT2 */
5499 return JNI_ERR; 4334 return JNI_ERR;
5500 } 4335 }
5501 4336
5502 JNIWrapper("AttachCurrentThreadAsDaemon"); 4337 JNIWrapper("AttachCurrentThreadAsDaemon");
5503 jint ret = attach_current_thread(vm, penv, _args, true); 4338 jint ret = attach_current_thread(vm, penv, _args, true);
5504 #ifndef USDT2
5505 DTRACE_PROBE1(hotspot_jni, AttachCurrentThreadAsDaemon__return, ret);
5506 #else /* USDT2 */
5507 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN(ret); 4339 HOTSPOT_JNI_ATTACHCURRENTTHREADASDAEMON_RETURN(ret);
5508 #endif /* USDT2 */
5509 return ret; 4340 return ret;
5510 } 4341 }
5511 4342
5512 4343
5513 } // End extern "C" 4344 } // End extern "C"