hotspot/src/share/vm/prims/jni.cpp
changeset 22796 bb0ea482a99e
parent 22795 2b5380bc0926
child 22906 528490ea7e82
equal deleted inserted replaced
22795:2b5380bc0926 22796:bb0ea482a99e
   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"