#ifndef _INCLUDE_JAVA_ARRAY_METHODS_H_ #define _INCLUDE_JAVA_ARRAY_METHODS_H_ #include "java_array.h" #include "native-utils.h" #include "regions.h" #include "class_header.h" #include "java_string.h" extern class_header *java_array_desc; /* external helper functions */ void m35throwArrayIndexOutOfBoundsExceptionIIILT6String4lang4javamT11NativeUtils4lang2ti ( jint, jint, jint, LP_JString ) __attribute__((noreturn)); /* internal helper functions */ java_array_header *java_array_alloc( Region, int length, int elementSize, int atomicelements, int isShared ); java_array_header *java_array_build( int length, int elementSize, void *data, int atomicelements, int isShared ); void java_array_free( java_array_header *array ); #define JAVA_ARRAY_INIT_( result, init ) *((java_array_header **) &(result)) = (init) /* allocate an uninitialized java array */ #define JAVA_ARRAY_ALLOC( result, region, length, ElementType, atomicelements, isShared ) \ JAVA_ARRAY_INIT_( result, java_array_alloc( (region), (length), sizeof( ElementType ), atomicelements, isShared ) ) /* allocate a java array and initialize it to given data */ #define JAVA_ARRAY_BUILD( result, length, data, atomicelements, isShared ) \ JAVA_ARRAY_INIT_( result, java_array_build( (length), sizeof(*data), data, atomicelements, isShared ) ) /* explicitly free a java array allocated in REGION ZERO ONLY */ #define JAVA_ARRAY_FREE( array ) java_array_free(*((java_array_header **)&(array))) #define JAVA_ARRAY_FIELD_( form, result, array, fieldName, fieldType, primType ) \ do { \ fieldType fieldAddr_; \ \ CHECK_NULL_ ## form ( array ); \ \ FIELD_ADDR_ ## form ( fieldAddr_, array, header.fieldName ); \ FENCE_PRE_READ(); \ DEREF_ ## form ##_ ## primType ( result, fieldAddr_ ); \ FENCE_POST_READ(); \ } while (0) #define JAVA_ARRAY_FIELD_L( form, result, array, fieldName, fieldType ) \ do { \ fieldType fieldAddr_; \ \ CHECK_NULL_ ## form ( array ); \ \ FIELD_ADDR_ ## form ( fieldAddr_, array, header.fieldName ); \ FENCE_PRE_READ(); \ DEREF_ ## form ( result, fieldAddr_ ); \ FENCE_POST_READ(); \ } while (0) #define JAVA_ARRAY_LENGTH_GLOBAL( result, array ) JAVA_ARRAY_FIELD_( GLOBAL, result, array, length, Pjint, jint ) #define JAVA_ARRAY_LENGTH_LOCAL( result, array ) JAVA_ARRAY_FIELD_L( LOCAL, result, array, length, jint* ) #define JAVA_ARRAY_SIZE_GLOBAL( result, array ) JAVA_ARRAY_FIELD_( GLOBAL, result, array, size, Pjint, jint ) #define JAVA_ARRAY_SIZE_LOCAL( result, array ) JAVA_ARRAY_FIELD_L( LOCAL, result, array, size, jint* ) #define JAVA_ARRAY_ISATOMIC_GLOBAL( result, array ) JAVA_ARRAY_FIELD_( GLOBAL, result, array, atomicelements, Pjint, jint ) #define JAVA_ARRAY_ISATOMIC_LOCAL( result, array ) JAVA_ARRAY_FIELD_L( LOCAL, result, array, atomicelements, jint* ) #if BOUNDS_CHECKING #define JAVA_ARRAY_CHECK_( form, array, offset, count ) \ do { \ jint safe_; \ JAVA_ARRAY_LENGTH_ ## form ( safe_, (array) ); \ if (PREDICT_FALSE((offset < 0) | ((offset+count) > safe_))) { \ m35throwArrayIndexOutOfBoundsExceptionIIILT6String4lang4javamT11NativeUtils4lang2ti( \ safe_, offset, count, java_string_build_8( __current_loc )); \ abort(); /* never reach here */ \ } \ } while (0) #else #define JAVA_ARRAY_CHECK_( form, array, offset, count ) do {} while(0) #endif /* BOUNDS_CHECKING */ #define JAVA_ARRAY_CHECK_GLOBAL( array, offset, count ) JAVA_ARRAY_CHECK_( GLOBAL, array, offset, count ) #define JAVA_ARRAY_CHECK_LOCAL( array, offset, count ) JAVA_ARRAY_CHECK_( LOCAL, array, offset, count ) #endif /* !_INCLUDE_JAVA_ARRAY_METHODS_H_ */