< prev index next >
src/hotspot/share/prims/jvm.cpp
Print this page
@@ -50,10 +50,11 @@
#include "oops/instanceKlass.hpp"
#include "oops/method.hpp"
#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"
#include "prims/nativeLookup.hpp"
#include "prims/stackwalk.hpp"
@@ -681,10 +682,11 @@
(klass->is_instance_klass() &&
InstanceKlass::cast(klass)->reference_type() != REF_NONE)) {
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();
oop new_obj_oop = NULL;
if (obj->is_array()) {
@@ -763,11 +765,11 @@
JVM_ENTRY(jclass, JVM_FindPrimitiveClass(JNIEnv* env, const char* utf))
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) {
THROW_MSG_0(vmSymbols::java_lang_ClassNotFoundException(), (char*) utf);
} else {
@@ -2234,10 +2236,52 @@
JvmtiVMObjectAllocEventCollector oam;
oop asd = JavaAssertions::createAssertionStatusDirectives(CHECK_NULL);
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 "<atomic>[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 /////////////////////////////////////////////////////////////////
// RedefineClasses support: bug 6214132 caused verification to fail.
@@ -2264,11 +2308,11 @@
// (length is determined by call to JVM_GetClassCPEntriesCount)
if (k->is_instance_klass()) {
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
< prev index next >