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