#include #include #include #include #include #include #include "T6Object4lang4java.h" #include "T9Cloneable4lang4java.h" #include "T5Class4lang4java.h" #include "layout!PTAjbyte.h" #include "layout!Pclass_header.h" #include "layout!PLti5cdescmT6Object4lang4java.h" /* someday, we should have one of these for each java array type with information about the element type */ /* should include Cloneable and java.io.Serializable (Java 1.1) */ static const struct interface_header *_java_array_impl[] = { (interface_header *)&fi5cdescT9Cloneable4lang4java, NULL }; static struct ti5cdescmT6Object4lang4java _java_array_desc = { { &fi5cdescT5Class4lang4java }, NULL, JavaArray, typeflag_None, _java_array_impl, /* implements */ 0, /* intf_info */ (class_header *)&fi5cdescT6Object4lang4java, /* super */ 0, /* size field (should not be trusted) */ NULL, /* nullify locals (should not be trusted) */ NULL, /* don't allow newInstance on arrays */ m8hashCodemT6Object4lang4java, m6equalsPT6Object4lang4javamT6Object4lang4java, ml10localClonemT6Object4lang4java, m5clonemT6Object4lang4java, m8toStringmT6Object4lang4java, m8finalizemT6Object4lang4java }; class_header *java_array_desc = (class_header *)&_java_array_desc; java_array_header *java_array_alloc( Region pregion, int length, int elementSize, int atomicelements, int isShared ) { const size_t size = sizeof(java_array_header) + elementSize * length; java_array_header *array; tally_memory( size, isShared ); if (pregion) { if (atomicelements) { array = (java_array_header *) ralloc_atomic( pregion, size ); memset(array, 0, size); /* not automatically cleared for atomic */ } else { array = (java_array_header *) ralloc( pregion, size ); } } else { if (atomicelements) { array = (java_array_header *) ti_malloc_atomic_huge( size ); memset(array, 0, size); /* not automatically cleared for atomic */ } else { array = (java_array_header *) ti_malloc_huge( size ); } } JAVA_ARRAY_INIT_FIELDS(array, length, elementSize, atomicelements); return array; } void java_array_free( java_array_header *array ) { assert(PL2RegionId(array) == UNK_REGIONID); #ifdef HAVE_MONITORS monitor_destroy(&array->header.monitor); #endif ti_free(array); } java_array_header *java_array_build( int length, int elementSize, void *data, int atomicelements, int isShared ) { java_array_header * const array = java_array_alloc( 0, length, elementSize, atomicelements, isShared ); if (length > 0) { memcpy( array + 1, data, length * elementSize ); } return array; } int is_java_array_global( PT6Object4lang4java object ) { typedef GP_type( TypeCategory ) GP_TypeCategory; ti5cdescmT6Object4lang4java *info; Pclass_header header; GP_TypeCategory categoryField; TypeCategory category; CLASS_INFO_GLOBAL( info, ti5cdescmT6Object4lang4java, object ); TO_GLOBALB( header, TO_BOX( object ), (class_header *) info ); FIELD_ADDR_GLOBAL( categoryField, header, category ); FENCE_PRE_READ(); /* MUST use _bulk here because width of TypeCategory might not always be sizeof(jint) */ DEREF_GLOBAL_bulk( category, categoryField ); FENCE_POST_READ(); return (category == JavaArray); } int is_java_array_local( LT6Object4lang4java object ) { jGPointer gObject; globalize( gObject, object ); return is_java_array_global(*(PT6Object4lang4java*)&gObject); } int java_array_subclass_of_global( PT6Object4lang4java sourceObject, int elementSize, int atomicelements) { jint length, size, isatomic; if (!is_java_array_global(sourceObject)) return 0; JAVA_ARRAY_INFO_GLOBAL( length, size, isatomic, *(PTAjbyte *)&sourceObject); return (size == elementSize && !!isatomic == !!atomicelements); } int java_array_subclass_of_local( LT6Object4lang4java sourceObject, int elementSize, int atomicelements) { jGPointer gsourceObject; globalize( gsourceObject, sourceObject ); return java_array_subclass_of_global(*(PT6Object4lang4java*)&gsourceObject, elementSize, atomicelements); }