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