< prev index next >

src/hotspot/share/prims/jni.cpp

Print this page

        

*** 3508,3517 **** --- 3508,3607 ---- 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,3801 **** jni_GetObjectRefType, // Module features ! jni_GetModule }; // For jvmti use to modify jni function table. // Java threads in native contiues to run until it is transitioned --- 3881,3899 ---- jni_GetObjectRefType, // Module features ! 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 >