< prev index next >
src/hotspot/share/prims/jni.cpp
Print this page
@@ -3508,10 +3508,100 @@
JNIWrapper("GetModule");
return Modules::get_module(clazz, THREAD);
JNI_END
+JNI_ENTRY(void*, jni_GetFlattenedArrayElements(JNIEnv* env, jarray array, jboolean* isCopy))
+ JNIWrapper("jni_GetFlattenedArrayElements");
+ if (isCopy != NULL) {
+ *isCopy = JNI_FALSE;
+ }
+ arrayOop ar = arrayOop(JNIHandles::resolve_non_null(array));
+ if (!ar->is_array()) {
+ THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
+ }
+ if (!ar->is_valueArray()) {
+ THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
+ }
+ ValueArrayKlass* vak = ValueArrayKlass::cast(ar->klass());
+ if (vak->contains_oops()) {
+ THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Flattened array contains oops");
+ }
+ oop a = lock_gc_or_pin_object(thread, array);
+ valueArrayOop vap = valueArrayOop(a);
+ void* ret = vap->value_at_addr(0, vak->layout_helper());
+ return ret;
+JNI_END
+
+JNI_ENTRY(void, jni_ReleaseFlattenedArrayElements(JNIEnv* env, jarray array, void* elem, jint mode))
+ JNIWrapper("jni_ReleaseFlattenedArrayElements");
+ unlock_gc_or_unpin_object(thread, array);
+JNI_END
+
+JNI_ENTRY(jsize, jni_GetFlattenedArrayElementSize(JNIEnv* env, jarray array)) {
+ JNIWrapper("jni_GetFlattenedElementSize");
+ arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
+ if (!a->is_array()) {
+ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
+ }
+ if (!a->is_valueArray()) {
+ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
+ }
+ ValueArrayKlass* vak = ValueArrayKlass::cast(a->klass());
+ jsize ret = vak->element_byte_size();
+ return ret;
+}
+JNI_END
+
+JNI_ENTRY(jclass, jni_GetFlattenedArrayElementClass(JNIEnv* env, jarray array))
+ JNIWrapper("jni_GetArrayElementClass");
+ arrayOop a = arrayOop(JNIHandles::resolve_non_null(array));
+ if (!a->is_array()) {
+ THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not an array");
+ }
+ if (!a->is_valueArray()) {
+ THROW_MSG_NULL(vmSymbols::java_lang_IllegalArgumentException(), "Not a flattened array");
+ }
+ ValueArrayKlass* vak = ValueArrayKlass::cast(a->klass());
+ ValueKlass* vk = vak->element_klass();
+ return (jclass) JNIHandles::make_local(vk->java_mirror());
+JNI_END
+
+JNI_ENTRY(jsize, jni_GetFieldOffsetInFlattenedLayout(JNIEnv* env, jclass clazz, const char *name, const char *signature, jboolean* isFlattened))
+ JNIWrapper("jni_GetFieldOffsetInFlattenedLayout");
+
+ oop mirror = JNIHandles::resolve_non_null(clazz);
+ Klass* k = java_lang_Class::as_Klass(mirror);
+ if (!k->is_value()) {
+ ResourceMark rm;
+ THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), err_msg("%s has not flattened layout", k->external_name()));
+ }
+ ValueKlass* vk = ValueKlass::cast(k);
+
+ TempNewSymbol fieldname = SymbolTable::probe(name, (int)strlen(name));
+ TempNewSymbol signame = SymbolTable::probe(signature, (int)strlen(signature));
+ if (fieldname == NULL || signame == NULL) {
+ ResourceMark rm;
+ THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), err_msg("%s.%s %s", vk->external_name(), name, signature));
+ }
+
+ assert(vk->is_initialized(), "If a flattened array has been created, the element klass must have been initialized");
+
+ fieldDescriptor fd;
+ if (!vk->is_instance_klass() ||
+ !InstanceKlass::cast(vk)->find_field(fieldname, signame, false, &fd)) {
+ ResourceMark rm;
+ THROW_MSG_0(vmSymbols::java_lang_NoSuchFieldError(), err_msg("%s.%s %s", vk->external_name(), name, signature));
+ }
+
+ int offset = fd.offset() - vk->first_field_offset();
+ if (isFlattened != NULL) {
+ *isFlattened = fd.is_flattened();
+ }
+ return (jsize)offset;
+JNI_END
+
// Structure containing all jni functions
struct JNINativeInterface_ jni_NativeInterface = {
NULL,
NULL,
NULL,
@@ -3791,11 +3881,19 @@
jni_GetObjectRefType,
// Module features
- jni_GetModule
+ jni_GetModule,
+
+ // Flattened arrays features
+
+ jni_GetFlattenedArrayElements,
+ jni_ReleaseFlattenedArrayElements,
+ jni_GetFlattenedArrayElementClass,
+ jni_GetFlattenedArrayElementSize,
+ jni_GetFieldOffsetInFlattenedLayout
};
// For jvmti use to modify jni function table.
// Java threads in native contiues to run until it is transitioned
< prev index next >