better binary operator error messages
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 15 Apr 2021 15:51:42 +0000 (10:51 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 15 Apr 2021 15:51:42 +0000 (10:51 -0500)
bin/onyx
core/alloc/heap.onyx
src/onyx.c
src/onyxchecker.c

index 944d40c2d01e56a375c1dbee4c5511f58b68b173..548bc76d47bd53ca0895461f100f40d06da1e886 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 52a43c5f83e292bafdf98b93555dcef70ddf7f86..4bc70bee30474ec0f6cc74dbbed3ed39ebd1a10a 100644 (file)
@@ -9,8 +9,10 @@ package core.alloc.heap
 #load "core/memory"
 #load "core/intrinsics/wasm"
 
-use package core.intrinsics.wasm { memory_size, memory_grow }
-#private_file memory :: package core.memory
+use package core.intrinsics.wasm {
+    memory_size, memory_grow,
+    memory_copy,
+}
 
 // The global heap state
 #private_file
@@ -117,7 +119,7 @@ heap_resize :: (ptr: rawptr, new_size: u32, align: u32) -> rawptr {
     }
 
     new_ptr := heap_alloc(new_size, align);
-    memory.copy(new_ptr, ptr, old_size);
+    memory_copy(new_ptr, ptr, old_size);
     heap_free(ptr);
     return new_ptr;
 }
index cbd195101f37c15623a0b4d078086bc3067a771f..68d89d318cf05984db3209db68bc6e06da712f1d 100644 (file)
@@ -370,8 +370,8 @@ static void output_dummy_progress_bar() {
     if (bh_arr_length(eh->entities) == 0) return;
 
     static const char* state_colors[] = {
-        "\e[91m", "\e[93m", "\e[97m", "\e[93m", "\e[94m",
-        "\e[95m", "\e[94m", "\e[95m", "\e[96m", "\e[92m",
+        "\e[91m", "\e[93m", "\e[94m", "\e[93m", "\e[97m",
+        "\e[95m", "\e[97m", "\e[95m", "\e[96m", "\e[92m",
     };
 
     printf("\e[2;1H");
index 48f21eee41cac098a6dc38a2dedda6d25913370f..10e9607c8d3f3009501abc782811b3d5b4ef8575 100644 (file)
@@ -536,6 +536,13 @@ type_checking_done:
     return Check_Success;
 }
 
+static void report_bad_binaryop(AstBinaryOp* binop) {
+    onyx_report_error(binop->token->pos, "Binary operator '%s' not understood for arguments of type '%s' and '%s'.",
+            binaryop_string[binop->operation],
+            node_get_type_name(binop->left),
+            node_get_type_name(binop->right));
+}
+
 CheckStatus check_binop_assignment(AstBinaryOp* binop, b32 assignment_is_ok) {
     if (!assignment_is_ok) {
         onyx_report_error(binop->token->pos, "Assignment not valid in expression.");
@@ -638,13 +645,9 @@ CheckStatus check_binop_assignment(AstBinaryOp* binop, b32 assignment_is_ok) {
 CheckStatus check_binaryop_compare(AstBinaryOp** pbinop) {
     AstBinaryOp* binop = *pbinop;
 
-    if (type_is_structlike_strict(binop->left->type)) {
-        onyx_report_error(binop->token->pos, "Invalid type for left side of comparison operator.");
-        return Check_Error;
-    }
-
-    if (type_is_structlike_strict(binop->right->type)) {
-        onyx_report_error(binop->token->pos, "Invalid type for right side of comparison operator.");
+    if (   type_is_structlike_strict(binop->left->type)
+        || type_is_structlike_strict(binop->right->type)) {
+        report_bad_binaryop(binop);
         return Check_Error;
     }
 
@@ -689,7 +692,7 @@ CheckStatus check_binaryop_bool(AstBinaryOp** pbinop) {
     AstBinaryOp* binop = *pbinop;
 
     if (!type_is_bool(binop->left->type) || !type_is_bool(binop->right->type)) {
-        onyx_report_error(binop->token->pos, "Boolean operator expects boolean types for both operands.");
+        report_bad_binaryop(binop);
         return Check_Error;
     }
 
@@ -870,10 +873,7 @@ CheckStatus check_binaryop(AstBinaryOp** pbinop, b32 assignment_is_ok) {
     return Check_Success;
 
 bad_binaryop:
-    onyx_report_error(binop->token->pos, "Binary operator '%s' not understood for arguments of type '%s' and '%s'.",
-            binaryop_string[binop->operation],
-            node_get_type_name(binop->left),
-            node_get_type_name(binop->right));
+    report_bad_binaryop(binop);
 
     return Check_Error;
 }