3
#include "org_xmlvm_runtime_XMLVMArray.h"
6
//XMLVM_BEGIN_NATIVE_IMPLEMENTATION
8
#include "java_lang_Class.h"
12
short useAtomicMalloc;
16
org_xmlvm_runtime_XMLVMArray* __NEW_XMLVMArray(JAVA_OBJECT type, JAVA_INT length, JAVA_OBJECT data)
18
org_xmlvm_runtime_XMLVMArray* array = __NEW_org_xmlvm_runtime_XMLVMArray();
19
org_xmlvm_runtime_XMLVMArray___INIT____java_lang_Class_int_java_lang_Object(array, type, length, data);
24
* This function determines two pieces of information of a type: the size of the type in byte
25
* and whether or not an atomic malloc() should be used. For arrays of primitive type it is possible
26
* to use an atomic malloc() offered by the GC. In this case the GC knows that the memory region cannot
27
* contain any pointers and can therefore skip scanning the memory region.
29
TYPE_INFO XMLVMArray_getTypeInfo(JAVA_OBJECT type)
32
info.useAtomicMalloc = 1;
34
if (type == __CLASS_byte || type == __CLASS_boolean) {
35
info.sizeOfBaseType = sizeof(JAVA_ARRAY_BYTE);
36
} else if (type == __CLASS_char || type == __CLASS_short) {
37
info.sizeOfBaseType = sizeof(JAVA_ARRAY_SHORT);
38
} else if (type == __CLASS_int) {
39
info.sizeOfBaseType = sizeof(JAVA_ARRAY_INT);
40
} else if (type == __CLASS_float) {
41
info.sizeOfBaseType = sizeof(JAVA_ARRAY_FLOAT);
42
} else if (type == __CLASS_double) {
43
info.sizeOfBaseType = sizeof(JAVA_ARRAY_DOUBLE);
44
} else if (type == __CLASS_long) {
45
info.sizeOfBaseType = sizeof(JAVA_ARRAY_LONG);
47
info.sizeOfBaseType = sizeof(void*);
48
// For arrays of object references we need to use the regular malloc() as the
49
// GC needs to scan this memory region.
50
info.useAtomicMalloc = 0;
56
static org_xmlvm_runtime_XMLVMArray* XMLVMArray_createMultiDimensionsWithCount(JAVA_OBJECT type, JAVA_ARRAY_INT* dim, int count)
58
JAVA_ARRAY_INT dimensions = *dim;
59
org_xmlvm_runtime_XMLVMArray* slice;
64
return XMLVMArray_createSingleDimension(type, dimensions);
66
slice = XMLVMArray_createSingleDimension(type, dimensions);
67
JAVA_ARRAY_OBJECT* sliceData = (JAVA_ARRAY_OBJECT*) slice->fields.org_xmlvm_runtime_XMLVMArray.array_;
69
java_lang_Class* typeClass = (java_lang_Class*) type;
70
__TIB_DEFINITION_TEMPLATE* typeTIB = (__TIB_DEFINITION_TEMPLATE*) typeClass->fields.java_lang_Class.tib_;
71
JAVA_OBJECT baseType = typeTIB->baseType;
72
for (i = 0; i < dimensions; i++) {
73
//TODO should 'type' be baseType of this type?
74
sliceData[i] = XMLVMArray_createMultiDimensionsWithCount(baseType, dim, count);
79
JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_getClass__(JAVA_OBJECT me)
81
org_xmlvm_runtime_XMLVMArray* thiz = me;
82
return thiz->fields.org_xmlvm_runtime_XMLVMArray.type_;
85
//XMLVM_END_NATIVE_IMPLEMENTATION
87
void org_xmlvm_runtime_XMLVMArray_initNativeLayer__()
89
//XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_initNativeLayer__]
90
__TIB_org_xmlvm_runtime_XMLVMArray.vtable[XMLVM_VTABLE_IDX_java_lang_Object_getClass__] =
91
(VTABLE_PTR) org_xmlvm_runtime_XMLVMArray_getClass__;
95
JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createSingleDimension___java_lang_Class_int(JAVA_OBJECT n1, JAVA_INT n2)
97
//XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_createSingleDimension___java_lang_Class_int]
98
JAVA_OBJECT type = n1;
100
TYPE_INFO info = XMLVMArray_getTypeInfo(type);
101
int mem_size = info.sizeOfBaseType * size;
102
JAVA_OBJECT data = info.useAtomicMalloc ? XMLVM_ATOMIC_MALLOC(mem_size) : XMLVM_MALLOC(mem_size);
103
XMLVM_BZERO(data, mem_size);
104
return org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object(type, size, data);
108
JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object(JAVA_OBJECT n1, JAVA_INT n2, JAVA_OBJECT n3)
110
//XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object]
111
org_xmlvm_runtime_XMLVMArray* array = __NEW_org_xmlvm_runtime_XMLVMArray();
112
java_lang_Class* baseType = n1;
113
__TIB_DEFINITION_TEMPLATE* baseTIB = baseType->fields.java_lang_Class.tib_;
114
JAVA_OBJECT arrayType = baseTIB->arrayType;
115
if (arrayType == JAVA_NULL) {
116
XMLVM_INTERNAL_ERROR();
118
org_xmlvm_runtime_XMLVMArray___INIT____java_lang_Class_int_java_lang_Object(array, arrayType, n2, n3);
123
JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createMultiDimensions___java_lang_Class_org_xmlvm_runtime_XMLVMArray(JAVA_OBJECT n1, JAVA_OBJECT n2)
125
//XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_createMultiDimensions___java_lang_Class_org_xmlvm_runtime_XMLVMArray]
126
org_xmlvm_runtime_XMLVMArray* dimArray = (org_xmlvm_runtime_XMLVMArray*) n2;
127
if (dimArray->fields.org_xmlvm_runtime_XMLVMArray.type_ != __CLASS_int_1ARRAY) {
128
XMLVM_INTERNAL_ERROR();
130
int count = dimArray->fields.org_xmlvm_runtime_XMLVMArray.length_;
131
JAVA_ARRAY_INT* data = (JAVA_ARRAY_INT*) dimArray->fields.org_xmlvm_runtime_XMLVMArray.array_;
133
java_lang_Class* arrayType = n1;
134
for (i = 0; i < count - 1; i++) {
135
__TIB_DEFINITION_TEMPLATE* arrayTIB = arrayType->fields.java_lang_Class.tib_;
136
arrayType = arrayTIB->arrayType;
137
if (arrayType == JAVA_NULL) {
138
XMLVM_INTERNAL_ERROR();
141
return XMLVMArray_createMultiDimensionsWithCount(arrayType, data, count);
145
void org_xmlvm_runtime_XMLVMArray_fillArray___org_xmlvm_runtime_XMLVMArray_java_lang_Object(JAVA_OBJECT n1, JAVA_OBJECT n2)
147
//XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_fillArray___org_xmlvm_runtime_XMLVMArray_java_lang_Object]
148
org_xmlvm_runtime_XMLVMArray* array = (org_xmlvm_runtime_XMLVMArray*) n1;
149
java_lang_Class* arrayType = array->fields.org_xmlvm_runtime_XMLVMArray.type_;
150
__TIB_DEFINITION_TEMPLATE* arrayTIB = arrayType->fields.java_lang_Class.tib_;
151
TYPE_INFO info = XMLVMArray_getTypeInfo(arrayTIB->baseType);
152
int n = info.sizeOfBaseType * array->fields.org_xmlvm_runtime_XMLVMArray.length_;
153
XMLVM_MEMCPY(array->fields.org_xmlvm_runtime_XMLVMArray.array_, n2, n);
157
JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_clone__(JAVA_OBJECT me)
159
//XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_clone__]
160
org_xmlvm_runtime_XMLVMArray* thiz = (org_xmlvm_runtime_XMLVMArray*) me;
161
JAVA_OBJECT type = thiz->fields.org_xmlvm_runtime_XMLVMArray.type_;
162
JAVA_INT length = thiz->fields.org_xmlvm_runtime_XMLVMArray.length_;
163
JAVA_OBJECT data = thiz->fields.org_xmlvm_runtime_XMLVMArray.array_;
164
TYPE_INFO info = XMLVMArray_getTypeInfo(type);
165
int sizeOfArrayInBytes = info.sizeOfBaseType * length;
166
JAVA_OBJECT copyData = info.useAtomicMalloc ? XMLVM_ATOMIC_MALLOC(sizeOfArrayInBytes) : XMLVM_MALLOC(sizeOfArrayInBytes);
167
XMLVM_MEMCPY(copyData, data, sizeOfArrayInBytes);
168
return XMLVMArray_createSingleDimensionWithData(type, length, copyData);
173
void xmlvm_init_native_org_xmlvm_runtime_XMLVMArray()
175
//XMLVM_BEGIN_NATIVE_IMPLEMENTATION_INIT
176
//XMLVM_END_NATIVE_IMPLEMENTATION_INIT
177
#ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_XMLVMArray_clone__
178
__TIB_org_xmlvm_runtime_XMLVMArray.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_XMLVMArray_clone__] =
179
(VTABLE_PTR) org_xmlvm_runtime_XMLVMArray_clone__;