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

src/share/vm/prims/jni.cpp

Print this page


   1 /*
   2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


1841 
1842 DT_RETURN_MARK_DECL(ToReflectedField, jobject);
1843 
1844 JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic))
1845   JNIWrapper("ToReflectedField");
1846   DTRACE_PROBE4(hotspot_jni, ToReflectedField__entry,
1847                 env, cls, fieldID, isStatic);
1848   jobject ret = NULL;
1849   DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret);
1850 
1851   fieldDescriptor fd;
1852   bool found = false;
1853   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
1854 
1855   assert(jfieldIDWorkaround::is_static_jfieldID(fieldID) == (isStatic != 0), "invalid fieldID");
1856 
1857   if (isStatic) {
1858     // Static field. The fieldID a JNIid specifying the field holder and the offset within the klassOop.
1859     JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
1860     assert(id->is_static_field_id(), "invalid static field id");
1861     found = instanceKlass::cast(id->holder())->find_local_field_from_offset(id->offset(), true, &fd);
1862   } else {
1863     // Non-static field. The fieldID is really the offset of the field within the instanceOop.
1864     int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
1865     found = instanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
1866   }
1867   assert(found, "bad fieldID passed into jni_ToReflectedField");
1868   oop reflected = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
1869   ret = JNIHandles::make_local(env, reflected);
1870   return ret;
1871 JNI_END
1872 
1873 
1874 //
1875 // Accessing Static Fields
1876 //
1877 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID);
1878 
1879 JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
1880           const char *name, const char *sig))
1881   JNIWrapper("GetStaticFieldID");


1889   TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
1890   TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
1891   if (fieldname == NULL || signame == NULL) {
1892     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
1893   }
1894   KlassHandle k(THREAD,
1895                 java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
1896   // Make sure class is initialized before handing id's out to static fields
1897   Klass::cast(k())->initialize(CHECK_NULL);
1898 
1899   fieldDescriptor fd;
1900   if (!Klass::cast(k())->oop_is_instance() ||
1901       !instanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) {
1902     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
1903   }
1904 
1905   // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the klassOop
1906   JNIid* id = instanceKlass::cast(fd.field_holder())->jni_id_for(fd.offset());
1907   debug_only(id->set_is_static_field_id();)
1908 
1909   debug_only(int first_offset = instanceKlass::cast(fd.field_holder())->offset_of_static_fields();)
1910   debug_only(int end_offset = first_offset + (instanceKlass::cast(fd.field_holder())->static_field_size() * wordSize);)
1911   assert(id->offset() >= first_offset && id->offset() < end_offset, "invalid static field offset");
1912 
1913   ret = jfieldIDWorkaround::to_static_jfieldID(id);
1914   return ret;
1915 JNI_END
1916 
1917 
1918 JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID))
1919   JNIWrapper("GetStaticObjectField");
1920   DTRACE_PROBE3(hotspot_jni, GetStaticObjectField__entry, env, clazz, fieldID);
1921 #ifndef JNICHECK_KERNEL
1922   DEBUG_ONLY(klassOop param_k = jniCheck::validate_class(thread, clazz);)
1923 #endif // JNICHECK_KERNEL
1924   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
1925   assert(id->is_static_field_id(), "invalid static field id");
1926   // Keep JVMTI addition small and only check enabled flag here.
1927   // jni_GetField_probe() assumes that is okay to create handles.
1928   if (JvmtiExport::should_post_field_access()) {
1929     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
1930   }
1931   jobject ret = JNIHandles::make_local(id->holder()->obj_field(id->offset()));
1932   DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
1933   return ret;
1934 JNI_END
1935 
1936 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
1937 \
1938   DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return);\
1939 \
1940 JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
1941   JNIWrapper("GetStatic" XSTR(Result) "Field"); \
1942   DTRACE_PROBE3(hotspot_jni, GetStatic##Result##Field__entry, env, clazz, fieldID);\
1943   Return ret = 0;\
1944   DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
1945                      (const Return&)ret);\
1946   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
1947   assert(id->is_static_field_id(), "invalid static field id"); \
1948   /* Keep JVMTI addition small and only check enabled flag here. */ \
1949   /* jni_GetField_probe() assumes that is okay to create handles. */ \
1950   if (JvmtiExport::should_post_field_access()) { \
1951     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
1952   } \
1953   ret = id->holder()-> Fieldname##_field (id->offset()); \
1954   return ret;\
1955 JNI_END
1956 
1957 DEFINE_GETSTATICFIELD(jboolean, bool,   Boolean)
1958 DEFINE_GETSTATICFIELD(jbyte,    byte,   Byte)
1959 DEFINE_GETSTATICFIELD(jchar,    char,   Char)
1960 DEFINE_GETSTATICFIELD(jshort,   short,  Short)
1961 DEFINE_GETSTATICFIELD(jint,     int,    Int)
1962 DEFINE_GETSTATICFIELD(jlong,    long,   Long)
1963 DEFINE_GETSTATICFIELD(jfloat,   float,  Float)
1964 DEFINE_GETSTATICFIELD(jdouble,  double, Double)
1965 
1966 
1967 JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value))
1968   JNIWrapper("SetStaticObjectField");
1969   DTRACE_PROBE4(hotspot_jni, SetStaticObjectField__entry, env, clazz, fieldID, value);
1970   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
1971   assert(id->is_static_field_id(), "invalid static field id");
1972   // Keep JVMTI addition small and only check enabled flag here.
1973   // jni_SetField_probe() assumes that is okay to create handles.
1974   if (JvmtiExport::should_post_field_modification()) {
1975     jvalue field_value;
1976     field_value.l = value;
1977     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
1978   }
1979   id->holder()->obj_field_put(id->offset(), JNIHandles::resolve(value));
1980   DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
1981 JNI_END
1982 
1983 
1984 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
1985 \
1986 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
1987   JNIWrapper("SetStatic" XSTR(Result) "Field"); \
1988   HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\
1989     ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
1990   HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \
1991     ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
1992 \
1993   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
1994   assert(id->is_static_field_id(), "invalid static field id"); \
1995   /* Keep JVMTI addition small and only check enabled flag here. */ \
1996   /* jni_SetField_probe() assumes that is okay to create handles. */ \
1997   if (JvmtiExport::should_post_field_modification()) { \
1998     jvalue field_value; \
1999     field_value.unionType = value; \
2000     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
2001   } \
2002   id->holder()-> Fieldname##_field_put (id->offset(), value); \
2003   DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
2004 JNI_END
2005 
2006 DEFINE_SETSTATICFIELD(jboolean, bool,   Boolean, 'Z', z)
2007 DEFINE_SETSTATICFIELD(jbyte,    byte,   Byte,    'B', b)
2008 DEFINE_SETSTATICFIELD(jchar,    char,   Char,    'C', c)
2009 DEFINE_SETSTATICFIELD(jshort,   short,  Short,   'S', s)
2010 DEFINE_SETSTATICFIELD(jint,     int,    Int,     'I', i)
2011 DEFINE_SETSTATICFIELD(jlong,    long,   Long,    'J', j)
2012 DEFINE_SETSTATICFIELD(jfloat,   float,  Float,   'F', f)
2013 DEFINE_SETSTATICFIELD(jdouble,  double, Double,  'D', d)
2014 
2015 
2016 //
2017 // String Operations
2018 //
2019 
2020 // Unicode Interface
2021 
2022 DT_RETURN_MARK_DECL(NewString, jstring);


   1 /*
   2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *


1841 
1842 DT_RETURN_MARK_DECL(ToReflectedField, jobject);
1843 
1844 JNI_ENTRY(jobject, jni_ToReflectedField(JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic))
1845   JNIWrapper("ToReflectedField");
1846   DTRACE_PROBE4(hotspot_jni, ToReflectedField__entry,
1847                 env, cls, fieldID, isStatic);
1848   jobject ret = NULL;
1849   DT_RETURN_MARK(ToReflectedField, jobject, (const jobject&)ret);
1850 
1851   fieldDescriptor fd;
1852   bool found = false;
1853   klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls));
1854 
1855   assert(jfieldIDWorkaround::is_static_jfieldID(fieldID) == (isStatic != 0), "invalid fieldID");
1856 
1857   if (isStatic) {
1858     // Static field. The fieldID a JNIid specifying the field holder and the offset within the klassOop.
1859     JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
1860     assert(id->is_static_field_id(), "invalid static field id");
1861     found = id->find_local_field(&fd);
1862   } else {
1863     // Non-static field. The fieldID is really the offset of the field within the instanceOop.
1864     int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
1865     found = instanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
1866   }
1867   assert(found, "bad fieldID passed into jni_ToReflectedField");
1868   oop reflected = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
1869   ret = JNIHandles::make_local(env, reflected);
1870   return ret;
1871 JNI_END
1872 
1873 
1874 //
1875 // Accessing Static Fields
1876 //
1877 DT_RETURN_MARK_DECL(GetStaticFieldID, jfieldID);
1878 
1879 JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz,
1880           const char *name, const char *sig))
1881   JNIWrapper("GetStaticFieldID");


1889   TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
1890   TempNewSymbol signame = SymbolTable::probe(sig, (int)strlen(sig));
1891   if (fieldname == NULL || signame == NULL) {
1892     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
1893   }
1894   KlassHandle k(THREAD,
1895                 java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(clazz)));
1896   // Make sure class is initialized before handing id's out to static fields
1897   Klass::cast(k())->initialize(CHECK_NULL);
1898 
1899   fieldDescriptor fd;
1900   if (!Klass::cast(k())->oop_is_instance() ||
1901       !instanceKlass::cast(k())->find_field(fieldname, signame, true, &fd)) {
1902     THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), (char*) name);
1903   }
1904 
1905   // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the klassOop
1906   JNIid* id = instanceKlass::cast(fd.field_holder())->jni_id_for(fd.offset());
1907   debug_only(id->set_is_static_field_id();)
1908 
1909   debug_only(id->verify(fd.field_holder()));


1910 
1911   ret = jfieldIDWorkaround::to_static_jfieldID(id);
1912   return ret;
1913 JNI_END
1914 
1915 
1916 JNI_ENTRY(jobject, jni_GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID))
1917   JNIWrapper("GetStaticObjectField");
1918   DTRACE_PROBE3(hotspot_jni, GetStaticObjectField__entry, env, clazz, fieldID);
1919 #ifndef JNICHECK_KERNEL
1920   DEBUG_ONLY(klassOop param_k = jniCheck::validate_class(thread, clazz);)
1921 #endif // JNICHECK_KERNEL
1922   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
1923   assert(id->is_static_field_id(), "invalid static field id");
1924   // Keep JVMTI addition small and only check enabled flag here.
1925   // jni_GetField_probe() assumes that is okay to create handles.
1926   if (JvmtiExport::should_post_field_access()) {
1927     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
1928   }
1929   jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset()));
1930   DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
1931   return ret;
1932 JNI_END
1933 
1934 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
1935 \
1936   DT_RETURN_MARK_DECL_FOR(Result, GetStatic##Result##Field, Return);\
1937 \
1938 JNI_ENTRY(Return, jni_GetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID)) \
1939   JNIWrapper("GetStatic" XSTR(Result) "Field"); \
1940   DTRACE_PROBE3(hotspot_jni, GetStatic##Result##Field__entry, env, clazz, fieldID);\
1941   Return ret = 0;\
1942   DT_RETURN_MARK_FOR(Result, GetStatic##Result##Field, Return, \
1943                      (const Return&)ret);\
1944   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
1945   assert(id->is_static_field_id(), "invalid static field id"); \
1946   /* Keep JVMTI addition small and only check enabled flag here. */ \
1947   /* jni_GetField_probe() assumes that is okay to create handles. */ \
1948   if (JvmtiExport::should_post_field_access()) { \
1949     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
1950   } \
1951   ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
1952   return ret;\
1953 JNI_END
1954 
1955 DEFINE_GETSTATICFIELD(jboolean, bool,   Boolean)
1956 DEFINE_GETSTATICFIELD(jbyte,    byte,   Byte)
1957 DEFINE_GETSTATICFIELD(jchar,    char,   Char)
1958 DEFINE_GETSTATICFIELD(jshort,   short,  Short)
1959 DEFINE_GETSTATICFIELD(jint,     int,    Int)
1960 DEFINE_GETSTATICFIELD(jlong,    long,   Long)
1961 DEFINE_GETSTATICFIELD(jfloat,   float,  Float)
1962 DEFINE_GETSTATICFIELD(jdouble,  double, Double)
1963 
1964 
1965 JNI_ENTRY(void, jni_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value))
1966   JNIWrapper("SetStaticObjectField");
1967   DTRACE_PROBE4(hotspot_jni, SetStaticObjectField__entry, env, clazz, fieldID, value);
1968   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
1969   assert(id->is_static_field_id(), "invalid static field id");
1970   // Keep JVMTI addition small and only check enabled flag here.
1971   // jni_SetField_probe() assumes that is okay to create handles.
1972   if (JvmtiExport::should_post_field_modification()) {
1973     jvalue field_value;
1974     field_value.l = value;
1975     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
1976   }
1977   id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value));
1978   DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
1979 JNI_END
1980 
1981 
1982 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
1983 \
1984 JNI_ENTRY(void, jni_SetStatic##Result##Field(JNIEnv *env, jclass clazz, jfieldID fieldID, Argument value)) \
1985   JNIWrapper("SetStatic" XSTR(Result) "Field"); \
1986   HS_DTRACE_PROBE_CDECL_N(hotspot_jni, SetStatic##Result##Field__entry,\
1987     ( JNIEnv*, jclass, jfieldID FP_SELECT_##Result(COMMA Argument,/*empty*/) ) ); \
1988   HS_DTRACE_PROBE_N(hotspot_jni, SetStatic##Result##Field__entry, \
1989     ( env, clazz, fieldID FP_SELECT_##Result(COMMA value,/*empty*/) ) ); \
1990 \
1991   JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID); \
1992   assert(id->is_static_field_id(), "invalid static field id"); \
1993   /* Keep JVMTI addition small and only check enabled flag here. */ \
1994   /* jni_SetField_probe() assumes that is okay to create handles. */ \
1995   if (JvmtiExport::should_post_field_modification()) { \
1996     jvalue field_value; \
1997     field_value.unionType = value; \
1998     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
1999   } \
2000   id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
2001   DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
2002 JNI_END
2003 
2004 DEFINE_SETSTATICFIELD(jboolean, bool,   Boolean, 'Z', z)
2005 DEFINE_SETSTATICFIELD(jbyte,    byte,   Byte,    'B', b)
2006 DEFINE_SETSTATICFIELD(jchar,    char,   Char,    'C', c)
2007 DEFINE_SETSTATICFIELD(jshort,   short,  Short,   'S', s)
2008 DEFINE_SETSTATICFIELD(jint,     int,    Int,     'I', i)
2009 DEFINE_SETSTATICFIELD(jlong,    long,   Long,    'J', j)
2010 DEFINE_SETSTATICFIELD(jfloat,   float,  Float,   'F', f)
2011 DEFINE_SETSTATICFIELD(jdouble,  double, Double,  'D', d)
2012 
2013 
2014 //
2015 // String Operations
2016 //
2017 
2018 // Unicode Interface
2019 
2020 DT_RETURN_MARK_DECL(NewString, jstring);


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