~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-06-11 15:45:24 UTC
  • mfrom: (1.2.1) (2.1.1 experimental)
  • Revision ID: package-import@ubuntu.com-20130611154524-rppb3w6tixlegv4n
Tags: 1.4.7~20130611~a1eb425-1
* New snapshot release
* Upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
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
 */
 
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
 
 
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
 
 
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
 
 
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
 
 
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
 
 
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
 
 
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
 
 
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
 
 
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
 
 
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
}