--- old/src/hotspot/share/prims/jvm.cpp 2019-03-11 14:27:03.918354356 +0100 +++ new/src/hotspot/share/prims/jvm.cpp 2019-03-11 14:27:03.710354359 +0100 @@ -52,6 +52,7 @@ #include "oops/objArrayKlass.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" +#include "oops/valueArrayKlass.hpp" #include "prims/jvm_misc.hpp" #include "prims/jvmtiExport.hpp" #include "prims/jvmtiThreadState.hpp" @@ -683,6 +684,7 @@ ResourceMark rm(THREAD); THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name()); } + assert(!EnableValhalla || !obj->klass()->is_value(), "Clone disallowed on value type"); // Make shallow object copy const int size = obj->size(); @@ -765,7 +767,7 @@ JVMWrapper("JVM_FindPrimitiveClass"); oop mirror = NULL; BasicType t = name2type(utf); - if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY) { + if (t != T_ILLEGAL && t != T_OBJECT && t != T_ARRAY && t != T_VALUETYPE) { mirror = Universe::java_mirror(t); } if (mirror == NULL) { @@ -2236,6 +2238,48 @@ return JNIHandles::make_local(env, asd); JVM_END +// Arrays support ///////////////////////////////////////////////////////////// + +JVM_ENTRY(jboolean, JVM_ArrayIsAccessAtomic(JNIEnv *env, jclass unused, jobject array)) + JVMWrapper("JVM_ArrayIsAccessAtomic"); + oop o = JNIHandles::resolve(array); + Klass* k = o->klass(); + if ((o == NULL) || (!k->is_array_klass())) { + THROW_0(vmSymbols::java_lang_IllegalArgumentException()); + } + if (k->is_valueArray_klass()) { + return ValueArrayKlass::cast(k)->is_atomic(); + } + return true; +JVM_END + +JVM_ENTRY(jobject, JVM_ArrayEnsureAccessAtomic(JNIEnv *env, jclass unused, jobject array)) + JVMWrapper("JVM_ArrayEnsureAccessAtomic"); + oop o = JNIHandles::resolve(array); + Klass* k = o->klass(); + if ((o == NULL) || (!k->is_array_klass())) { + THROW_0(vmSymbols::java_lang_IllegalArgumentException()); + } + if (k->is_valueArray_klass()) { + ValueArrayKlass* vk = ValueArrayKlass::cast(k); + if (!vk->is_atomic()) { + /** + * Need to decide how to implement: + * + * 1) Change to objArrayOop layout, therefore oop->klass() differs so + * then "[Qfoo;" klass needs to subclass "[Qfoo;" to pass through + * "checkcast" & "instanceof" + * + * 2) Use extra header in the valueArrayOop to flag atomicity required and + * possibly per instance lock structure. Said info, could be placed in + * "trailer" rather than disturb the current arrayOop + */ + Unimplemented(); + } + } + return array; +JVM_END + // Verification //////////////////////////////////////////////////////////////////////////////// // Reflection for the verifier ///////////////////////////////////////////////////////////////// @@ -2266,7 +2310,7 @@ ConstantPool* cp = InstanceKlass::cast(k)->constants(); for (int index = cp->length() - 1; index >= 0; index--) { constantTag tag = cp->tag_at(index); - types[index] = (tag.is_unresolved_klass()) ? JVM_CONSTANT_Class : tag.value(); + types[index] = tag.is_unresolved_klass() ? JVM_CONSTANT_Class : tag.value(); } } JVM_END