adding array functionality and bugfixes
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 29 Aug 2020 02:34:56 +0000 (21:34 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 29 Aug 2020 02:34:56 +0000 (21:34 -0500)
core/builtin.onyx
onyx
progs/poly_test.onyx
src/onyxutils.c

index e302b25244c0e396feab25023bb225b140ad0019..0191f775bbc7cce56de59c873626d1829ff08fcf 100644 (file)
@@ -38,9 +38,9 @@ calloc  :: proc (size: u32) -> rawptr do return alloc(context.allocator, size);
 cresize :: proc (ptr: rawptr, size: u32) -> rawptr do return resize(context.allocator, ptr, size);
 cfree   :: proc (ptr: rawptr) do free(context.allocator, ptr);
 
-array_init :: proc(arr: ^[..] $T) {
+array_init :: proc(arr: ^[..] $T, initial_cap := 4) {
     arr.count = 0;
-    arr.capacity = 4;
+    arr.capacity = initial_cap;
     arr.data = calloc(sizeof T * arr.capacity);
 }
 
@@ -54,6 +54,27 @@ array_add :: proc (arr: ^[..] $T, x: T) {
     arr.count += 1;
 }
 
+array_remove_at :: proc (arr: ^[..] $T, idx: u32) {
+    if idx >= arr.count do return;
+
+    for i: idx, arr.count - 1 {
+        arr.data[i] = arr.data[i + 1];
+    }
+
+    arr.count -= 1;
+}
+
+array_remove :: proc (arr: ^[..] $T, elem: T) {
+    move  := 0;
+
+    for i: 0, arr.count - move {
+        if arr.data[i + move] == elem do move += 1;
+        if move != 0 do arr.data[i] = arr.data[i + move];
+    } 
+
+    arr.count -= move;
+}
+
 context : struct {
        allocator      : Allocator;
        temp_allocator : Allocator;
diff --git a/onyx b/onyx
index 7bf59014dd505ae7263ae8004e893d0b5d2a6c32..1ed9b95e71601b88df7cfe7eba62694c5bd728b1 100755 (executable)
Binary files a/onyx and b/onyx differ
index b1e367d82f2992adf8c587d045d0e040973db675..93ef5a1b2eb2c52d7b42e80966f6ccd10d08b7d5 100644 (file)
@@ -1,6 +1,6 @@
 package main
 
-#include_folder "/usr/share/onyx/core"
+#include_folder "./core"
 
 #include_file "builtin"
 #include_file "wasi"
@@ -33,9 +33,9 @@ print_arr_details :: proc (arr: ^[..] $T) {
     print("\n\n");
 }
 
-print_arr :: proc (arr: [..] $T) {
+print_arr :: proc (arr: ^[..] $T) {
     for i: 0, arr.count {
-        print(arr[i]);
+        print(arr.data[i]);
         print(" ");
     }
 
@@ -44,15 +44,25 @@ print_arr :: proc (arr: [..] $T) {
 
 main :: proc (args: [] cstring) {
     arr : [..] i32;
-    array_init(^arr);
+    array_init(^arr, 24);
 
     print_arr_details(^arr);
 
     array_add(^arr, 1234);
 
-    for i: 0, 12 do array_add(^arr, i * 2 + 2);
+    for i: 0, 12 do array_add(^arr, i % 5);
 
     print_arr_details(^arr);
+    print_arr(^arr);
 
-    print_arr(arr);
+    array_remove_at(^arr, 4);
+
+    print_arr_details(^arr);
+    print_arr(^arr);
+
+    array_remove(^arr, 1);
+    array_remove(^arr, 4);
+
+    print_arr_details(^arr);
+    print_arr(^arr);
 }
\ No newline at end of file
index e194fd8a7662af917ae8ccf7c8ebe893f03e59a9..73cb70e4fe02d6d2f8ab291af4d93f5b1d3e9b6a 100644 (file)
@@ -431,8 +431,10 @@ AstFunction* polymorphic_proc_lookup(AstPolyProc* pp, AstCall* call) {
     bh_table_put(AstFunction *, pp->concrete_funcs, key_buf, func);
 
     symres_function(func);
+    if (onyx_message_has_errors()) return NULL;
     if (check_function_header(func)) return NULL;
     if (check_function(func)) return NULL;
+    if (onyx_message_has_errors()) return NULL;
 
     bh_arr_push(semstate.other_entities, ((Entity) {
         .type = Entity_Type_Function_Header,