hotspot/src/share/vm/prims/jni.cpp
changeset 8725 8c1e3dd5fe1b
parent 8076 96d498ec7ae1
child 9176 42d9d1010f38
equal deleted inserted replaced
8724:693c6b883b54 8725:8c1e3dd5fe1b
     1 /*
     1 /*
     2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     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.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
  1856 
  1856 
  1857   if (isStatic) {
  1857   if (isStatic) {
  1858     // Static field. The fieldID a JNIid specifying the field holder and the offset within the klassOop.
  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);
  1859     JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fieldID);
  1860     assert(id->is_static_field_id(), "invalid static field id");
  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);
  1861     found = id->find_local_field(&fd);
  1862   } else {
  1862   } else {
  1863     // Non-static field. The fieldID is really the offset of the field within the instanceOop.
  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);
  1864     int offset = jfieldIDWorkaround::from_instance_jfieldID(k, fieldID);
  1865     found = instanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
  1865     found = instanceKlass::cast(k)->find_field_from_offset(offset, false, &fd);
  1866   }
  1866   }
  1904 
  1904 
  1905   // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the klassOop
  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());
  1906   JNIid* id = instanceKlass::cast(fd.field_holder())->jni_id_for(fd.offset());
  1907   debug_only(id->set_is_static_field_id();)
  1907   debug_only(id->set_is_static_field_id();)
  1908 
  1908 
  1909   debug_only(int first_offset = instanceKlass::cast(fd.field_holder())->offset_of_static_fields();)
  1909   debug_only(id->verify(fd.field_holder()));
  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 
  1910 
  1913   ret = jfieldIDWorkaround::to_static_jfieldID(id);
  1911   ret = jfieldIDWorkaround::to_static_jfieldID(id);
  1914   return ret;
  1912   return ret;
  1915 JNI_END
  1913 JNI_END
  1916 
  1914 
  1926   // Keep JVMTI addition small and only check enabled flag here.
  1924   // Keep JVMTI addition small and only check enabled flag here.
  1927   // jni_GetField_probe() assumes that is okay to create handles.
  1925   // jni_GetField_probe() assumes that is okay to create handles.
  1928   if (JvmtiExport::should_post_field_access()) {
  1926   if (JvmtiExport::should_post_field_access()) {
  1929     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
  1927     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true);
  1930   }
  1928   }
  1931   jobject ret = JNIHandles::make_local(id->holder()->obj_field(id->offset()));
  1929   jobject ret = JNIHandles::make_local(id->holder()->java_mirror()->obj_field(id->offset()));
  1932   DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
  1930   DTRACE_PROBE1(hotspot_jni, GetStaticObjectField__return, ret);
  1933   return ret;
  1931   return ret;
  1934 JNI_END
  1932 JNI_END
  1935 
  1933 
  1936 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
  1934 #define DEFINE_GETSTATICFIELD(Return,Fieldname,Result) \
  1948   /* Keep JVMTI addition small and only check enabled flag here. */ \
  1946   /* Keep JVMTI addition small and only check enabled flag here. */ \
  1949   /* jni_GetField_probe() assumes that is okay to create handles. */ \
  1947   /* jni_GetField_probe() assumes that is okay to create handles. */ \
  1950   if (JvmtiExport::should_post_field_access()) { \
  1948   if (JvmtiExport::should_post_field_access()) { \
  1951     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
  1949     JvmtiExport::jni_GetField_probe(thread, NULL, NULL, id->holder(), fieldID, true); \
  1952   } \
  1950   } \
  1953   ret = id->holder()-> Fieldname##_field (id->offset()); \
  1951   ret = id->holder()->java_mirror()-> Fieldname##_field (id->offset()); \
  1954   return ret;\
  1952   return ret;\
  1955 JNI_END
  1953 JNI_END
  1956 
  1954 
  1957 DEFINE_GETSTATICFIELD(jboolean, bool,   Boolean)
  1955 DEFINE_GETSTATICFIELD(jboolean, bool,   Boolean)
  1958 DEFINE_GETSTATICFIELD(jbyte,    byte,   Byte)
  1956 DEFINE_GETSTATICFIELD(jbyte,    byte,   Byte)
  1974   if (JvmtiExport::should_post_field_modification()) {
  1972   if (JvmtiExport::should_post_field_modification()) {
  1975     jvalue field_value;
  1973     jvalue field_value;
  1976     field_value.l = value;
  1974     field_value.l = value;
  1977     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
  1975     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, 'L', (jvalue *)&field_value);
  1978   }
  1976   }
  1979   id->holder()->obj_field_put(id->offset(), JNIHandles::resolve(value));
  1977   id->holder()->java_mirror()->obj_field_put(id->offset(), JNIHandles::resolve(value));
  1980   DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
  1978   DTRACE_PROBE(hotspot_jni, SetStaticObjectField__return);
  1981 JNI_END
  1979 JNI_END
  1982 
  1980 
  1983 
  1981 
  1984 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
  1982 #define DEFINE_SETSTATICFIELD(Argument,Fieldname,Result,SigType,unionType) \
  1997   if (JvmtiExport::should_post_field_modification()) { \
  1995   if (JvmtiExport::should_post_field_modification()) { \
  1998     jvalue field_value; \
  1996     jvalue field_value; \
  1999     field_value.unionType = value; \
  1997     field_value.unionType = value; \
  2000     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
  1998     JvmtiExport::jni_SetField_probe(thread, NULL, NULL, id->holder(), fieldID, true, SigType, (jvalue *)&field_value); \
  2001   } \
  1999   } \
  2002   id->holder()-> Fieldname##_field_put (id->offset(), value); \
  2000   id->holder()->java_mirror()-> Fieldname##_field_put (id->offset(), value); \
  2003   DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
  2001   DTRACE_PROBE(hotspot_jni, SetStatic##Result##Field__return);\
  2004 JNI_END
  2002 JNI_END
  2005 
  2003 
  2006 DEFINE_SETSTATICFIELD(jboolean, bool,   Boolean, 'Z', z)
  2004 DEFINE_SETSTATICFIELD(jboolean, bool,   Boolean, 'Z', z)
  2007 DEFINE_SETSTATICFIELD(jbyte,    byte,   Byte,    'B', b)
  2005 DEFINE_SETSTATICFIELD(jbyte,    byte,   Byte,    'B', b)