This way we can reuse one implementation for each primitive type. This increases maintainability and reduces code duplication.
Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- vm/jni-interface.c | 171 +++++++++++++++++++++++----------------------------- 1 files changed, 75 insertions(+), 96 deletions(-) diff --git a/vm/jni-interface.c b/vm/jni-interface.c index c614c47..a3d367e 100644 --- a/vm/jni-interface.c +++ b/vm/jni-interface.c @@ -553,93 +553,73 @@ static jobject vm_jni_get_object_field(struct vm_jni_env *env, jobject object, return field_get_object(object, field); } -static jbyte * -vm_jni_get_byte_array_elements(struct vm_jni_env *env, jobject array, - jboolean *is_copy) -{ - jbyte *result; - - enter_vm_from_jni(); - - if (!vm_class_is_array_class(array->class) || - vm_class_get_array_element_class(array->class) != vm_byte_class) - return NULL; - - result = malloc(sizeof(jbyte) * array->array_length); - if (!result) - return NULL; - - for (long i = 0; i < array->array_length; i++) - result[i] = array_get_field_byte(array, i); - - if (is_copy) - *is_copy = JNI_TRUE; - - return result; -} - -static void -vm_jni_release_byte_array_elements(struct vm_jni_env *env, jobject array, - jbyte *elems, jint mode) -{ - enter_vm_from_jni(); - - if (!vm_class_is_array_class(array->class) || - vm_class_get_array_element_class(array->class) != vm_byte_class) - return; - - if (mode == 0 || mode == JNI_COMMIT) { /* copy back */ - for (long i = 0; i < array->array_length; i++) - array_set_field_byte(array, i, elems[i]); - } - - if (mode == 0 || mode == JNI_ABORT) /* free buffer */ - free(elems); +#define DECLARE_GET_XXX_ARRAY_ELEMENTS(type) \ +static j ## type * \ +vm_jni_get_ ## type ## _array_elements(struct vm_jni_env *env, \ + jobject array, \ + jboolean *is_copy) \ +{ \ + j ## type *result; \ + \ + enter_vm_from_jni(); \ + \ + if (!vm_class_is_array_class(array->class) || \ + vm_class_get_array_element_class(array->class) \ + != vm_ ## type ## _class) \ + return NULL; \ + \ + result = malloc(sizeof(j ## type) * array->array_length); \ + if (!result) \ + return NULL; \ + \ + for (long i = 0; i < array->array_length; i++) \ + result[i] = array_get_field_##type(array, i); \ + \ + if (is_copy) \ + *is_copy = JNI_TRUE; \ + \ + return result; \ } -static jdouble * -vm_jni_get_double_array_elements(struct vm_jni_env *env, jobject array, - jboolean *is_copy) -{ - jdouble *result; - - enter_vm_from_jni(); - - if (!vm_class_is_array_class(array->class) || - vm_class_get_array_element_class(array->class) != vm_double_class) - return NULL; - - result = malloc(sizeof(jdouble) * array->array_length); - if (!result) - return NULL; - - for (long i = 0; i < array->array_length; i++) - result[i] = array_get_field_double(array, i); - - if (is_copy) - *is_copy = JNI_TRUE; - - return result; +DECLARE_GET_XXX_ARRAY_ELEMENTS(byte); +DECLARE_GET_XXX_ARRAY_ELEMENTS(char); +DECLARE_GET_XXX_ARRAY_ELEMENTS(double); +DECLARE_GET_XXX_ARRAY_ELEMENTS(float); +DECLARE_GET_XXX_ARRAY_ELEMENTS(int); +DECLARE_GET_XXX_ARRAY_ELEMENTS(long); +DECLARE_GET_XXX_ARRAY_ELEMENTS(short); +DECLARE_GET_XXX_ARRAY_ELEMENTS(boolean); + +#define DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(type) \ +static void \ +vm_jni_release_ ## type ## _array_elements(struct vm_jni_env *env, \ + jobject array, \ + j ## type *elems, jint mode) \ +{ \ + enter_vm_from_jni(); \ + \ + if (!vm_class_is_array_class(array->class) || \ + vm_class_get_array_element_class(array->class) \ + != vm_ ## type ## _class) \ + return; \ + \ + if (mode == 0 || mode == JNI_COMMIT) { /* copy back */ \ + for (long i = 0; i < array->array_length; i++) \ + array_set_field_ ## type(array, i, elems[i]); \ + } \ + \ + if (mode == 0 || mode == JNI_ABORT) /* free buffer */ \ + free(elems); \ } -static void -vm_jni_release_double_array_elements(struct vm_jni_env *env, jobject array, - jdouble *elems, jint mode) -{ - enter_vm_from_jni(); - - if (!vm_class_is_array_class(array->class) || - vm_class_get_array_element_class(array->class) != vm_double_class) - return; - - if (mode == 0 || mode == JNI_COMMIT) { /* copy back */ - for (long i = 0; i < array->array_length; i++) - array_set_field_double(array, i, elems[i]); - } - - if (mode == 0 || mode == JNI_ABORT) /* free buffer */ - free(elems); -} +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(byte); +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(char); +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(double); +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(float); +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(int); +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(long); +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(short); +DECLARE_RELEASE_XXX_ARRAY_ELEMENTS(boolean); static void * vm_jni_get_direct_buffer_address(struct vm_jni_env *env, jobject buf) @@ -808,7 +788,6 @@ vm_jni_new_object_array(struct vm_jni_env *env, jsize size, return array; } - /* * The JNI native interface table. * See: http://java.sun.com/j2se/1.4.2/docs/guide/jni/spec/functions.html @@ -1070,27 +1049,27 @@ void *vm_jni_native_interface[] = { NULL, /* NewLongArray */ NULL, /* NewFloatArray */ NULL, /* NewDoubleArray */ - NULL, /* GetBooleanArrayElements */ + vm_jni_get_boolean_array_elements, vm_jni_get_byte_array_elements, /* 185 */ - NULL, /* GetCharArrayElements */ - NULL, /* GetShortArrayElements */ - NULL, /* GetIntArrayElements */ - NULL, /* GetLongArrayElements */ - NULL, /* GetFloatArrayElements */ + vm_jni_get_char_array_elements, + vm_jni_get_short_array_elements, + vm_jni_get_int_array_elements, + vm_jni_get_long_array_elements, + vm_jni_get_float_array_elements, /* 190 */ vm_jni_get_double_array_elements, - NULL, /* ReleaseBooleanArrayElements */ + vm_jni_release_boolean_array_elements, vm_jni_release_byte_array_elements, - NULL, /* ReleaseCharArrayElements */ - NULL, /* ReleaseShortArrayElements */ + vm_jni_release_char_array_elements, + vm_jni_release_short_array_elements, /* 195 */ - NULL, /* ReleaseIntArrayElements */ - NULL, /* ReleaseLongArrayElements */ - NULL, /* ReleaseFloatArrayElements */ + vm_jni_release_int_array_elements, + vm_jni_release_long_array_elements, + vm_jni_release_float_array_elements, vm_jni_release_double_array_elements, NULL, /* GetBooleanArrayRegion */ -- 1.6.0.6 ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel