Index: vm/vmcore/src/jni/jni_array.cpp =================================================================== --- vm/vmcore/src/jni/jni_array.cpp (revision 598573) +++ vm/vmcore/src/jni/jni_array.cpp (working copy) @@ -226,24 +226,16 @@ ///////////////////////////////////////////////////////////////////////////// -// begin NewArray functions +// begin NewArray functions - - -jbooleanArray JNICALL NewBooleanArray(JNIEnv * jni_env, jsize length) -{ - TRACE2("jni", "NewBooleanArray called"); +static jobject NewPrimitiveArray(Class* clss, jsize length) { assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfBoolean_Class; + unsigned sz = clss->calculate_array_size(length); if (sz == 0) return NULL; tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), vm_get_gc_thread_local()); if(NULL == array) @@ -258,275 +250,71 @@ clss->instance_allocated(sz); #endif //VM_STATS + ObjectHandle h = oh_allocate_local_handle(); h->object = (ManagedObject *)array; tmn_suspend_enable(); //---------------------------------^ - return (jbooleanArray)h; -} //NewBooleanArray + return (jobject)h; +} +jbooleanArray JNICALL NewBooleanArray(JNIEnv * jni_env, jsize length) +{ + TRACE2("jni", "NewBooleanArray called"); + return (jbooleanArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfBoolean_Class, length); +} //NewBooleanArray + jbyteArray JNICALL NewByteArray(JNIEnv * jni_env, jsize length) { TRACE2("jni", "NewByteArray called"); - assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfByte_Class; - unsigned sz = clss->calculate_array_size(length); - if (sz == 0) return NULL; - - tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); - Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), - vm_get_gc_thread_local()); - if (NULL == array) - { - tmn_suspend_enable(); - return NULL; - } - - set_vector_length(array, length); - -#ifdef VM_STATS - clss->instance_allocated(sz); -#endif //VM_STATS - - h->object = (ManagedObject *)array; - - tmn_suspend_enable(); //---------------------------------^ - - return (jbyteArray)h; + return (jbyteArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfByte_Class, length); } //NewByteArray - jcharArray JNICALL NewCharArray(JNIEnv * jni_env, jsize length) { TRACE2("jni", "NewCharArray called"); - assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfChar_Class; - unsigned sz = clss->calculate_array_size(length); - if (sz == 0) return NULL; - - tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); - Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), - vm_get_gc_thread_local()); - if(NULL == array) - { - tmn_suspend_enable(); - return NULL; - } - - set_vector_length(array, length); - -#ifdef VM_STATS - clss->instance_allocated(sz); -#endif //VM_STATS - - h->object = (ManagedObject *)array; - - tmn_suspend_enable(); //---------------------------------^ - - return (jcharArray)h; + return (jcharArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfChar_Class, length); } //NewCharArray - jshortArray JNICALL NewShortArray(JNIEnv * jni_env, jsize length) { TRACE2("jni", "NewShortArray called"); - assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfShort_Class; - unsigned sz = clss->calculate_array_size(length); - if (sz == 0) return NULL; - - tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); - - Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), - vm_get_gc_thread_local()); - if (NULL == array) - { - tmn_suspend_enable(); - return NULL; - } - - set_vector_length(array, length); - -#ifdef VM_STATS - clss->instance_allocated(sz); -#endif //VM_STATS - - h->object = (ManagedObject *)array; - - tmn_suspend_enable(); //---------------------------------^ - - return (jshortArray)h; + return (jshortArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfShort_Class, length); } //NewShortArray - jintArray JNICALL NewIntArray(JNIEnv * jni_env, jsize length) { TRACE2("jni", "NewIntArray called"); - assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfInt_Class; - unsigned sz = clss->calculate_array_size(length); - if (sz == 0) return NULL; - - tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); - Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), - vm_get_gc_thread_local()); - if (NULL == array) - { - tmn_suspend_enable(); - return NULL; - } - - set_vector_length(array, length); - -#ifdef VM_STATS - clss->instance_allocated(sz); -#endif //VM_STATS - - h->object = (ManagedObject *)array; - - tmn_suspend_enable(); //---------------------------------^ - - return (jintArray)h; + return (jintArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfInt_Class, length); } //NewIntArray - jlongArray JNICALL NewLongArray(JNIEnv * jni_env, jsize length) { TRACE2("jni", "NewLongArray called"); - assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfLong_Class; - unsigned sz = clss->calculate_array_size(length); - if (sz == 0) return NULL; - - tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); - Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), - vm_get_gc_thread_local()); - if (NULL == array) - { - tmn_suspend_enable(); - return NULL; - } - - set_vector_length(array, length); - -#ifdef VM_STATS - clss->instance_allocated(sz); -#endif //VM_STATS - - h->object = (ManagedObject *)array; - - tmn_suspend_enable(); //---------------------------------^ - - return (jlongArray)h; + return (jlongArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfLong_Class, length); } //NewLongArray - jfloatArray JNICALL NewFloatArray(JNIEnv * jni_env, jsize length) { TRACE2("jni", "NewFloatArray called"); - assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfFloat_Class; - unsigned sz = clss->calculate_array_size(length); - if (sz == 0) return NULL; - - tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); - Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), - vm_get_gc_thread_local()); - if (NULL == array) - { - tmn_suspend_enable(); - return NULL; - } - - set_vector_length(array, length); - -#ifdef VM_STATS - clss->instance_allocated(sz); -#endif //VM_STATS - - h->object = (ManagedObject *)array; - - tmn_suspend_enable(); //---------------------------------^ - - return (jfloatArray)h; + return (jfloatArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfFloat_Class, length); } //NewFloatArray - jdoubleArray JNICALL NewDoubleArray(JNIEnv * jni_env, jsize length) { TRACE2("jni", "NewDoubleArray called"); - assert(hythread_is_suspend_enabled()); - - Global_Env * vm_env = jni_get_vm_env(jni_env); - if (exn_raised()) return NULL; - - Class *clss = vm_env->ArrayOfDouble_Class; - unsigned sz = clss->calculate_array_size(length); - if (sz == 0) return NULL; - - tmn_suspend_disable(); //---------------------------------v - ObjectHandle h = oh_allocate_local_handle(); - Vector_Handle array = gc_alloc(sz, clss->get_allocation_handle(), - vm_get_gc_thread_local()); - if (NULL == array) - { - tmn_suspend_enable(); - return NULL; - } - - set_vector_length(array, length); - -#ifdef VM_STATS - clss->instance_allocated(sz); -#endif //VM_STATS - - h->object = (ManagedObject *)array; - - tmn_suspend_enable(); //---------------------------------^ - - return (jdoubleArray)h; + return (jdoubleArray)NewPrimitiveArray(jni_get_vm_env(jni_env)->ArrayOfDouble_Class, length); } //NewDoubleArray - -// end NewArray functions +// end NewArray functions ///////////////////////////////////////////////////////////////////////////// Index: vm/vmcore/src/jni/jni.cpp =================================================================== --- vm/vmcore/src/jni/jni.cpp (revision 598573) +++ vm/vmcore/src/jni/jni.cpp (working copy) @@ -974,21 +974,20 @@ return NULL; } - tmn_suspend_disable(); //---------------------------------v - ObjectHandle new_handle = oh_allocate_local_handle(); + tmn_suspend_disable(); //---------------------------------v ManagedObject *new_obj = (ManagedObject *)class_alloc_new_object(clss); if (new_obj == NULL) { - tmn_suspend_enable(); + tmn_suspend_enable(); //---------------------------------^ return NULL; } + ObjectHandle new_handle = oh_allocate_local_handle(); new_handle->object = (ManagedObject *)new_obj; - tmn_suspend_enable(); //---------------------------------^ + tmn_suspend_enable(); //---------------------------------^ return (jobject)new_handle; } //AllocObject - jobject JNICALL NewObject(JNIEnv * jni_env, jclass clazz, jmethodID methodID,