string literal data section improvement
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 10 Aug 2020 15:27:14 +0000 (10:27 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 10 Aug 2020 15:27:14 +0000 (10:27 -0500)
include/onyxwasm.h
onyx
progs/print_funcs.onyx
progs/stack_based.onyx
src/onyxchecker.c
src/onyxwasm.c

index e0b74e7122c8a13aaecc7a2981fac8fdfc9a0d46..3ee2c499154e43db572cc76b6001d6b89d057668 100644 (file)
@@ -312,6 +312,7 @@ typedef struct OnyxWasmModule {
     bh_table(i32) type_map;
 
     bh_table(u32) loaded_file_offsets;
+    bh_table(u32) string_literals;
 
     bh_arr(u8) structured_jump_target;
 
diff --git a/onyx b/onyx
index 75bf841a04a72597ff158b95741bb4bda0b070ee..bedfe214813a519434ac328dfe9a62dbed941910 100755 (executable)
Binary files a/onyx and b/onyx differ
index 8abf5672ac070c697e7f81d3292f6f99ad20adaa..a9a63b57692c32fccf6a24942fcc54921c08f803 100644 (file)
@@ -59,22 +59,24 @@ print_u64_with_base :: proc (n_: u64, base: u64) {
             m :: n % base;
 
             ch := cast(u8) 0;
-            if m == 0l do  ch = #char "0";
-            if m == 1l do  ch = #char "1";
-            if m == 2l do  ch = #char "2";
-            if m == 3l do  ch = #char "3";
-            if m == 4l do  ch = #char "4";
-            if m == 5l do  ch = #char "5";
-            if m == 6l do  ch = #char "6";
-            if m == 7l do  ch = #char "7";
-            if m == 8l do  ch = #char "8";
-            if m == 9l do  ch = #char "9";
-            if m == 10l do ch = #char "A";
-            if m == 11l do ch = #char "B";
-            if m == 12l do ch = #char "C";
-            if m == 13l do ch = #char "D";
-            if m == 14l do ch = #char "E";
-            if m == 15l do ch = #char "F";
+
+            // TODO: Replace with array lookup when array literals are added
+            if     m == 0l  do ch = #char "0";
+            elseif m == 1l  do ch = #char "1";
+            elseif m == 2l  do ch = #char "2";
+            elseif m == 3l  do ch = #char "3";
+            elseif m == 4l  do ch = #char "4";
+            elseif m == 5l  do ch = #char "5";
+            elseif m == 6l  do ch = #char "6";
+            elseif m == 7l  do ch = #char "7";
+            elseif m == 8l  do ch = #char "8";
+            elseif m == 9l  do ch = #char "9";
+            elseif m == 10l do ch = #char "A";
+            elseif m == 11l do ch = #char "B";
+            elseif m == 12l do ch = #char "C";
+            elseif m == 13l do ch = #char "D";
+            elseif m == 14l do ch = #char "E";
+            elseif m == 15l do ch = #char "F";
 
             *c = ch;
             c -= 1;
index b8f409ec9b7ac749089738d11385c0ef989a52e3..d3a048c1e7e07d719fe373ff707689ce83a81a6c 100644 (file)
@@ -47,6 +47,7 @@ vec_add :: proc (v: Vec3, u: Vec3, use out: ^Vec3) {
 start :: proc #export {
     heap_init();
     print("Hello, World!");
+    print("Hello, World!");
     print_ptr(__heap_start);
     print_ptr(__stack_base);
     print_ptr(__stack_top);
index ac964dca94b459d2119f6c1fccdb2710d25e6478..3fb2967e182eecc909bf9de46c09436284c91245 100644 (file)
@@ -504,6 +504,20 @@ CHECK(binaryop, AstBinaryOp* binop, b32 assignment_is_ok) {
         || binop->operation == Binary_Op_Bool_Or)
         return check_binaryop_bool(binop);
 
+    if (binop->left->type == NULL) {
+        onyx_message_add(Msg_Type_Unresolved_Type,
+                binop->token->pos,
+                binop->left->token->text, binop->left->token->length);
+        return 1;
+    }
+
+    if (binop->right->type == NULL) {
+        onyx_message_add(Msg_Type_Unresolved_Type,
+                binop->token->pos,
+                binop->right->token->text, binop->right->token->length);
+        return 1;
+    }
+
     if (!type_is_numeric(binop->left->type) && !type_is_pointer(binop->left->type)) {
         onyx_message_add(Msg_Type_Literal,
                 binop->token->pos,
@@ -542,20 +556,6 @@ CHECK(binaryop, AstBinaryOp* binop, b32 assignment_is_ok) {
         return 1;
     }
 
-    if (binop->left->type == NULL) {
-        onyx_message_add(Msg_Type_Unresolved_Type,
-                binop->token->pos,
-                binop->left->token->text, binop->left->token->length);
-        return 1;
-    }
-
-    if (binop->right->type == NULL) {
-        onyx_message_add(Msg_Type_Unresolved_Type,
-                binop->token->pos,
-                binop->right->token->text, binop->right->token->length);
-        return 1;
-    }
-
     if (lptr) {
         if (!type_is_integer(binop->right->type)) {
             onyx_message_add(Msg_Type_Literal,
index 75fc778b9e629a90e2c5a18c571b806fa81ff7ee..dc821569aa45a4967bbb4110f99021561f461c6a 100644 (file)
@@ -1624,6 +1624,11 @@ static void compile_string_literal(OnyxWasmModule* mod, AstStrLit* strlit) {
     }
     *des++ = '\0';
 
+    if (bh_table_has(u32, mod->string_literals, (char *) strdata)) {
+        strlit->addr = bh_table_get(u32, mod->string_literals, (char *) strdata);
+        return;
+    }
+
     u32 length = (u32) (des - strdata);
 
     WasmDatum datum = {
@@ -1635,6 +1640,8 @@ static void compile_string_literal(OnyxWasmModule* mod, AstStrLit* strlit) {
     strlit->addr = (u32) mod->next_datum_offset,
     mod->next_datum_offset += length;
 
+    bh_table_put(u32, mod->string_literals, (char *) strdata, strlit->addr);
+
     bh_arr_push(mod->data, datum);
 }
 
@@ -1748,6 +1755,7 @@ OnyxWasmModule onyx_wasm_module_create(bh_allocator alloc) {
     bh_table_init(global_heap_allocator, module.type_map, 61);
     bh_table_init(global_heap_allocator, module.exports, 61);
     bh_table_init(global_heap_allocator, module.loaded_file_offsets, 7);
+    bh_table_init(global_heap_allocator, module.string_literals, 16);
 
     bh_imap_init(&module.index_map, global_heap_allocator, 128);
     bh_imap_init(&module.local_map, global_heap_allocator, 16);