summaryrefslogtreecommitdiff
path: root/tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-05-08 16:06:26 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-05-08 16:06:26 -0700
commit693682fc225e60c9c335ee910fb3c8bb5cf85470 (patch)
treeb2c1285adf65b68a7b20aa231c4c5665966b2c18 /tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c
parentb41b535aeac53740dec416f617378ec4e4e382ce (diff)
add nbody-java code
Diffstat (limited to 'tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c')
-rw-r--r--tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c b/tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c
new file mode 100644
index 00000000..3e6934b0
--- /dev/null
+++ b/tests/nbody-java/native_org_xmlvm_runtime_XMLVMArray.c
@@ -0,0 +1,181 @@
+
+#include "xmlvm.h"
+#include "org_xmlvm_runtime_XMLVMArray.h"
+
+
+//XMLVM_BEGIN_NATIVE_IMPLEMENTATION
+
+#include "java_lang_Class.h"
+
+typedef struct {
+ short sizeOfBaseType;
+ short useAtomicMalloc;
+} TYPE_INFO;
+
+
+org_xmlvm_runtime_XMLVMArray* __NEW_XMLVMArray(JAVA_OBJECT type, JAVA_INT length, JAVA_OBJECT data)
+{
+ org_xmlvm_runtime_XMLVMArray* array = __NEW_org_xmlvm_runtime_XMLVMArray();
+ org_xmlvm_runtime_XMLVMArray___INIT____java_lang_Class_int_java_lang_Object(array, type, length, data);
+ return array;
+}
+
+/**
+ * This function determines two pieces of information of a type: the size of the type in byte
+ * and whether or not an atomic malloc() should be used. For arrays of primitive type it is possible
+ * to use an atomic malloc() offered by the GC. In this case the GC knows that the memory region cannot
+ * contain any pointers and can therefore skip scanning the memory region.
+ */
+TYPE_INFO XMLVMArray_getTypeInfo(JAVA_OBJECT type)
+{
+ TYPE_INFO info;
+ info.useAtomicMalloc = 1;
+
+ if (type == __CLASS_byte || type == __CLASS_boolean) {
+ info.sizeOfBaseType = sizeof(JAVA_ARRAY_BYTE);
+ } else if (type == __CLASS_char || type == __CLASS_short) {
+ info.sizeOfBaseType = sizeof(JAVA_ARRAY_SHORT);
+ } else if (type == __CLASS_int) {
+ info.sizeOfBaseType = sizeof(JAVA_ARRAY_INT);
+ } else if (type == __CLASS_float) {
+ info.sizeOfBaseType = sizeof(JAVA_ARRAY_FLOAT);
+ } else if (type == __CLASS_double) {
+ info.sizeOfBaseType = sizeof(JAVA_ARRAY_DOUBLE);
+ } else if (type == __CLASS_long) {
+ info.sizeOfBaseType = sizeof(JAVA_ARRAY_LONG);
+ } else {
+ info.sizeOfBaseType = sizeof(void*);
+ // For arrays of object references we need to use the regular malloc() as the
+ // GC needs to scan this memory region.
+ info.useAtomicMalloc = 0;
+ }
+
+ return info;
+}
+
+static org_xmlvm_runtime_XMLVMArray* XMLVMArray_createMultiDimensionsWithCount(JAVA_OBJECT type, JAVA_ARRAY_INT* dim, int count)
+{
+ JAVA_ARRAY_INT dimensions = *dim;
+ org_xmlvm_runtime_XMLVMArray* slice;
+ int i;
+ dim++;
+ count--;
+ if (count == 0) {
+ return XMLVMArray_createSingleDimension(type, dimensions);
+ }
+ slice = XMLVMArray_createSingleDimension(type, dimensions);
+ JAVA_ARRAY_OBJECT* sliceData = (JAVA_ARRAY_OBJECT*) slice->fields.org_xmlvm_runtime_XMLVMArray.array_;
+ // Get base type
+ java_lang_Class* typeClass = (java_lang_Class*) type;
+ __TIB_DEFINITION_TEMPLATE* typeTIB = (__TIB_DEFINITION_TEMPLATE*) typeClass->fields.java_lang_Class.tib_;
+ JAVA_OBJECT baseType = typeTIB->baseType;
+ for (i = 0; i < dimensions; i++) {
+ //TODO should 'type' be baseType of this type?
+ sliceData[i] = XMLVMArray_createMultiDimensionsWithCount(baseType, dim, count);
+ }
+ return slice;
+}
+
+JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_getClass__(JAVA_OBJECT me)
+{
+ org_xmlvm_runtime_XMLVMArray* thiz = me;
+ return thiz->fields.org_xmlvm_runtime_XMLVMArray.type_;
+}
+
+//XMLVM_END_NATIVE_IMPLEMENTATION
+
+void org_xmlvm_runtime_XMLVMArray_initNativeLayer__()
+{
+ //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_initNativeLayer__]
+ __TIB_org_xmlvm_runtime_XMLVMArray.vtable[XMLVM_VTABLE_IDX_java_lang_Object_getClass__] =
+ (VTABLE_PTR) org_xmlvm_runtime_XMLVMArray_getClass__;
+ //XMLVM_END_NATIVE
+}
+
+JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createSingleDimension___java_lang_Class_int(JAVA_OBJECT n1, JAVA_INT n2)
+{
+ //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_createSingleDimension___java_lang_Class_int]
+ JAVA_OBJECT type = n1;
+ JAVA_INT size = n2;
+ TYPE_INFO info = XMLVMArray_getTypeInfo(type);
+ int mem_size = info.sizeOfBaseType * size;
+ JAVA_OBJECT data = info.useAtomicMalloc ? XMLVM_ATOMIC_MALLOC(mem_size) : XMLVM_MALLOC(mem_size);
+ XMLVM_BZERO(data, mem_size);
+ return org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object(type, size, data);
+ //XMLVM_END_NATIVE
+}
+
+JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object(JAVA_OBJECT n1, JAVA_INT n2, JAVA_OBJECT n3)
+{
+ //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_createSingleDimensionWithData___java_lang_Class_int_java_lang_Object]
+ org_xmlvm_runtime_XMLVMArray* array = __NEW_org_xmlvm_runtime_XMLVMArray();
+ java_lang_Class* baseType = n1;
+ __TIB_DEFINITION_TEMPLATE* baseTIB = baseType->fields.java_lang_Class.tib_;
+ JAVA_OBJECT arrayType = baseTIB->arrayType;
+ if (arrayType == JAVA_NULL) {
+ XMLVM_INTERNAL_ERROR();
+ }
+ org_xmlvm_runtime_XMLVMArray___INIT____java_lang_Class_int_java_lang_Object(array, arrayType, n2, n3);
+ return array;
+ //XMLVM_END_NATIVE
+}
+
+JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_createMultiDimensions___java_lang_Class_org_xmlvm_runtime_XMLVMArray(JAVA_OBJECT n1, JAVA_OBJECT n2)
+{
+ //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_createMultiDimensions___java_lang_Class_org_xmlvm_runtime_XMLVMArray]
+ org_xmlvm_runtime_XMLVMArray* dimArray = (org_xmlvm_runtime_XMLVMArray*) n2;
+ if (dimArray->fields.org_xmlvm_runtime_XMLVMArray.type_ != __CLASS_int_1ARRAY) {
+ XMLVM_INTERNAL_ERROR();
+ }
+ int count = dimArray->fields.org_xmlvm_runtime_XMLVMArray.length_;
+ JAVA_ARRAY_INT* data = (JAVA_ARRAY_INT*) dimArray->fields.org_xmlvm_runtime_XMLVMArray.array_;
+ int i;
+ java_lang_Class* arrayType = n1;
+ for (i = 0; i < count - 1; i++) {
+ __TIB_DEFINITION_TEMPLATE* arrayTIB = arrayType->fields.java_lang_Class.tib_;
+ arrayType = arrayTIB->arrayType;
+ if (arrayType == JAVA_NULL) {
+ XMLVM_INTERNAL_ERROR();
+ }
+ }
+ return XMLVMArray_createMultiDimensionsWithCount(arrayType, data, count);
+ //XMLVM_END_NATIVE
+}
+
+void org_xmlvm_runtime_XMLVMArray_fillArray___org_xmlvm_runtime_XMLVMArray_java_lang_Object(JAVA_OBJECT n1, JAVA_OBJECT n2)
+{
+ //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_fillArray___org_xmlvm_runtime_XMLVMArray_java_lang_Object]
+ org_xmlvm_runtime_XMLVMArray* array = (org_xmlvm_runtime_XMLVMArray*) n1;
+ java_lang_Class* arrayType = array->fields.org_xmlvm_runtime_XMLVMArray.type_;
+ __TIB_DEFINITION_TEMPLATE* arrayTIB = arrayType->fields.java_lang_Class.tib_;
+ TYPE_INFO info = XMLVMArray_getTypeInfo(arrayTIB->baseType);
+ int n = info.sizeOfBaseType * array->fields.org_xmlvm_runtime_XMLVMArray.length_;
+ XMLVM_MEMCPY(array->fields.org_xmlvm_runtime_XMLVMArray.array_, n2, n);
+ //XMLVM_END_NATIVE
+}
+
+JAVA_OBJECT org_xmlvm_runtime_XMLVMArray_clone__(JAVA_OBJECT me)
+{
+ //XMLVM_BEGIN_NATIVE[org_xmlvm_runtime_XMLVMArray_clone__]
+ org_xmlvm_runtime_XMLVMArray* thiz = (org_xmlvm_runtime_XMLVMArray*) me;
+ JAVA_OBJECT type = thiz->fields.org_xmlvm_runtime_XMLVMArray.type_;
+ JAVA_INT length = thiz->fields.org_xmlvm_runtime_XMLVMArray.length_;
+ JAVA_OBJECT data = thiz->fields.org_xmlvm_runtime_XMLVMArray.array_;
+ TYPE_INFO info = XMLVMArray_getTypeInfo(type);
+ int sizeOfArrayInBytes = info.sizeOfBaseType * length;
+ JAVA_OBJECT copyData = info.useAtomicMalloc ? XMLVM_ATOMIC_MALLOC(sizeOfArrayInBytes) : XMLVM_MALLOC(sizeOfArrayInBytes);
+ XMLVM_MEMCPY(copyData, data, sizeOfArrayInBytes);
+ return XMLVMArray_createSingleDimensionWithData(type, length, copyData);
+ //XMLVM_END_NATIVE
+}
+
+
+void xmlvm_init_native_org_xmlvm_runtime_XMLVMArray()
+{
+ //XMLVM_BEGIN_NATIVE_IMPLEMENTATION_INIT
+ //XMLVM_END_NATIVE_IMPLEMENTATION_INIT
+#ifdef XMLVM_VTABLE_IDX_org_xmlvm_runtime_XMLVMArray_clone__
+ __TIB_org_xmlvm_runtime_XMLVMArray.vtable[XMLVM_VTABLE_IDX_org_xmlvm_runtime_XMLVMArray_clone__] =
+ (VTABLE_PTR) org_xmlvm_runtime_XMLVMArray_clone__;
+#endif
+}