compile: give NativeArray its own C structure
[nit.git] / src / compiling / compiling_global.nit
index b2a9838..23f5791 100644 (file)
@@ -831,7 +831,9 @@ redef class MMLocalClass
                v.add_decl("")
                var pi = primitive_info
                v.add_decl("extern const classtable_elt_t VFT_{name}[];")
-               if pi == null then
+               if name == "NativeArray".to_symbol then
+                       v.add_decl("val_t NEW_NativeArray(size_t length, size_t size);")
+               else if pi == null then
                        # v.add_decl("val_t NEW_{name}(void);")
                else if not pi.tagged then
                        var t = pi.cname
@@ -876,7 +878,19 @@ redef class MMLocalClass
                end
 
                var pi = primitive_info
-               if pi == null then
+               if name == "NativeArray".to_symbol then
+                       v.add_instr("val_t NEW_NativeArray(size_t length, size_t size) \{")
+                       v.indent
+                       v.add_instr("Nit_NativeArray array;")
+                       v.add_instr("array = (Nit_NativeArray)alloc(sizeof(struct Nit_NativeArray) + ((length - 1) * size));")
+                       v.add_instr("array->vft = (classtable_elt_t*)VFT_{name};")
+                       v.add_instr("array->object_id = object_id_counter;")
+                       v.add_instr("object_id_counter = object_id_counter + 1;")
+                       v.add_instr("array->size = length;")
+                       v.add_instr("return OBJ2VAL(array);")
+                       v.unindent
+                       v.add_instr("}")
+               else if pi == null then
                        do
                                var iself = new IRegister(get_type)
                                var iselfa = [iself]