1
2 #include "xmlvm.h"
3 #include "org_xmlvm_runtime_XMLVMArray.h"
4
5
6 //XMLVM_BEGIN_NATIVE_IMPLEMENTATION
7
8 #include "java_lang_Class.h"
9
10 typedef struct {
11 short sizeOfBaseType;
12 short useAtomicMalloc;
13 } TYPE_INFO;
14
15
__NEW_XMLVMArray(JAVA_OBJECT type,JAVA_INT length,JAVA_OBJECT data)16 org_xmlvm_runtime_XMLVMArray* __NEW_XMLVMArray(JAVA_OBJECT type, JAVA_INT length, JAVA_OBJECT data)
17 {
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);
20 return array;
21 }
22
23 /**
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.
28 */
XMLVMArray_getTypeInfo(JAVA_OBJECT type)29 TYPE_INFO XMLVMArray_getTypeInfo(JAVA_OBJECT type)
30 {
31 TYPE_INFO info;
32 info.useAtomicMalloc = 1;
33
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);
46 } else {
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;
51 }
52
53 return info;
54 }
55
XMLVMArray_createMultiDimensionsWithCount(JAVA_OBJECT type,JAVA_ARRAY_INT * dim,int count)56 static org_xmlvm_runtime_XMLVMArray* XMLVMArray_createMultiDimensionsWithCount(JAVA_OBJECT type, JAVA_ARRAY_INT* dim, int count)
57 {
58 JAVA_ARRAY_INT dimensions = *dim;
59 org_xmlvm_runtime_XMLVMArray* slice;
60 int i;
61 dim++;
62 count--;
63 if (count == 0) {
64 return XMLVMArray_createSingleDimension(type, dimensions);
65 }
66 slice = XMLVMArray_createSingleDimension(type, dimensions);
67 JAVA_ARRAY_OBJECT* sliceData = (JAVA_ARRAY_OBJECT*) slice->fields.org_xmlvm_runtime_XMLVMArray.array_;
68 // Get base type
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);
75 }
76 return slice;
77 }
78
org_xmlvm_runtime_XMLVMArray_getClass__(JAVA_OBJECT me)79 JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_getClass__(JAVA_OBJECT me)
80 {
81 org_xmlvm_runtime_XMLVMArray* thiz = me;
82 return thiz->fields.org_xmlvm_runtime_XMLVMArray.type_;
83 }
84
85 //XMLVM_END_NATIVE_IMPLEMENTATION
86
org_xmlvm_runtime_XMLVMArray_initNativeLayer__()87 void org_xmlvm_runtime_XMLVMArray_initNativeLayer__()
88 {
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__;
92 //XMLVM_END_NATIVE
93 }
94
org_xmlvm_runtime_XMLVMArray_createSingleDimension___java_lang_Class_int(JAVA_OBJECT n1,JAVA_INT n2)95 JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createSingleDimension___java_lang_Class_int(JAVA_OBJECT n1, JAVA_INT n2)
96 {
97 //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_createSingleDimension___java_lang_Class_int]
98 JAVA_OBJECT type = n1;
99 JAVA_INT size = n2;
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);
105 //XMLVM_END_NATIVE
106 }
107
org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object(JAVA_OBJECT n1,JAVA_INT n2,JAVA_OBJECT n3)108 JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object(JAVA_OBJECT n1, JAVA_INT n2, JAVA_OBJECT n3)
109 {
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();
117 }
118 org_xmlvm_runtime_XMLVMArray___INIT____java_lang_Class_int_java_lang_Object(array, arrayType, n2, n3);
119 return array;
120 //XMLVM_END_NATIVE
121 }
122
org_xmlvm_runtime_XMLVMArray_createMultiDimensions___java_lang_Class_org_xmlvm_runtime_XMLVMArray(JAVA_OBJECT n1,JAVA_OBJECT n2)123 JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createMultiDimensions___java_lang_Class_org_xmlvm_runtime_XMLVMArray(JAVA_OBJECT n1, JAVA_OBJECT n2)
124 {
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();
129 }
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_;
132 int i;
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();
139 }
140 }
141 return XMLVMArray_createMultiDimensionsWithCount(arrayType, data, count);
142 //XMLVM_END_NATIVE
143 }
144
org_xmlvm_runtime_XMLVMArray_fillArray___org_xmlvm_runtime_XMLVMArray_java_lang_Object(JAVA_OBJECT n1,JAVA_OBJECT n2)145 void org_xmlvm_runtime_XMLVMArray_fillArray___org_xmlvm_runtime_XMLVMArray_java_lang_Object(JAVA_OBJECT n1, JAVA_OBJECT n2)
146 {
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);
154 //XMLVM_END_NATIVE
155 }
156
org_xmlvm_runtime_XMLVMArray_clone__(JAVA_OBJECT me)157 JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_clone__(JAVA_OBJECT me)
158 {
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);
169 //XMLVM_END_NATIVE
170 }
171
172
xmlvm_init_native_org_xmlvm_runtime_XMLVMArray()173 void xmlvm_init_native_org_xmlvm_runtime_XMLVMArray()
174 {
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__;
180 #endif
181 }
182