removed AstCall.arg_count
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 Jan 2021 22:48:42 +0000 (16:48 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 14 Jan 2021 22:48:42 +0000 (16:48 -0600)
bin/onyx
include/onyxastnodes.h
src/onyxchecker.c
src/onyxparser.c
src/onyxsymres.c
src/onyxutils.c

index 6880818d80831be3d41ec8da9351fd6ee1149266..2137d52ebdf5dce7c577b66be2445761dd4c0faa 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index 135a491c13090979ebb9aca2292d33df6a8d5b0b..5679e6d1a68eec16cd07989aac382d9181a9e6c2 100644 (file)
@@ -510,7 +510,6 @@ struct AstRangeLiteral {
 struct AstCall {
     AstTyped_base;
 
-    u64 arg_count;
     bh_arr(AstArgument *) arg_arr;
     bh_arr(AstNamedValue *) named_args; // '.value' is a pointer to AstArgument.
 
@@ -521,7 +520,6 @@ struct AstCall {
 struct AstIntrinsicCall {
     AstTyped_base;
 
-    u64 arg_count;
     bh_arr(AstArgument *) arg_arr;
     bh_arr(AstNamedValue *) named_args;
 
index e29d952cfb592471a4c91077f124f7873297b499..dbbe438022c996a5710220ae2bac5340e567fe02 100644 (file)
@@ -433,8 +433,9 @@ CheckStatus check_call(AstCall* call) {
 
     if (callee->kind == Ast_Kind_Function) {
         if (bh_arr_length(arg_arr) < bh_arr_length(callee->params)) {
-            while (bh_arr_length(arg_arr) < bh_arr_length(callee->params) && callee->params[call->arg_count].default_value != NULL) {
-                AstTyped* dv = callee->params[call->arg_count].default_value;
+            while (bh_arr_length(arg_arr) < bh_arr_length(callee->params)
+                && callee->params[bh_arr_length(arg_arr)].default_value != NULL) {
+                AstTyped* dv = callee->params[bh_arr_length(arg_arr)].default_value;
 
                 AstArgument* new_arg = make_argument(semstate.node_allocator, dv);
                 bh_arr_push(arg_arr, new_arg);
@@ -730,7 +731,6 @@ static AstCall* binaryop_try_operator_overload(AstBinaryOp* binop) {
 
     AstCall* implicit_call = onyx_ast_node_new(semstate.node_allocator, sizeof(AstCall), Ast_Kind_Call);
     implicit_call->token = binop->token;
-    implicit_call->arg_count = 2;
     implicit_call->callee = overload;
     implicit_call->va_kind = VA_Kind_Not_VA;
 
index ad1d6fcabfd9b54352b8ca4f9fcf991a8a70f855..c415e82f4625d405dafbb984531ef17ad60dff2f 100644 (file)
@@ -612,27 +612,20 @@ static AstTyped* parse_factor(OnyxParser* parser) {
                 AstCall* call_node = make_node(AstCall, Ast_Kind_Call);
                 call_node->token = expect_token(parser, '(');
                 call_node->callee = retval;
-                call_node->arg_count = 0;
 
                 bh_arr_new(global_heap_allocator, call_node->arg_arr, 2);
+                bh_arr_new(global_heap_allocator, call_node->named_args, 2);
 
-                while (parser->curr->type != ')') {
-                    if (parser->hit_unexpected_token) return retval;
-
-                    AstArgument* arg = make_node(AstArgument, Ast_Kind_Argument);
-                    arg->token = parser->curr;
-                    arg->value = parse_expression(parser, 0);
-
-                    if (arg != NULL && arg->kind != Ast_Kind_Error) {
-                        bh_arr_push(call_node->arg_arr, arg);
-                        call_node->arg_count++;
-                    }
+                parse_values_and_named_values(parser, ')',
+                    (bh_arr(AstNode *) *) &call_node->arg_arr,
+                    &call_node->named_args);
 
-                    if (parser->curr->type != ')')
-                        expect_token(parser, ',');
-                }
+                // Wrap expressions in AstArgument
+                bh_arr_each(AstArgument *, arg, call_node->arg_arr)
+                    *arg = make_argument(parser->allocator, (AstTyped *) *arg);
 
-                consume_token(parser);
+                bh_arr_each(AstNamedValue *, named_value, call_node->named_args)
+                    (*named_value)->value = (AstNode *) make_argument(parser->allocator, (AstTyped *) (*named_value)->value);
 
                 retval = (AstTyped *) call_node;
                 break;
index 1c5fbaa9fa92584c754bb477d49ab8db4663f9d3..71b90e084db78b86a9f6ef77ea46a2cd0555cec7 100644 (file)
@@ -300,7 +300,6 @@ static void symres_pipe(AstBinaryOp** pipe) {
 
     bh_arr_insertn(call_node->arg_arr, 0, 1);
     call_node->arg_arr[0] = make_argument(semstate.node_allocator, (*pipe)->left);
-    call_node->arg_count++;
     call_node->next = (*pipe)->next;
 
     // NOTE: Not a BinaryOp node
index dbb34a0853173c337f91073c4c449e1faaad09fe..4be805a6adbe0d8224ab844f4fa9b3d552311688 100644 (file)
@@ -372,7 +372,7 @@ static bh_arr(AstPolySolution) find_polymorphic_slns(AstPolyProc* pp, PolyProcLo
         Type* actual_type;
 
         if (pp_lookup == PPLM_By_Call) {
-            if (param->idx >= ((AstCall *) actual)->arg_count) {
+            if (param->idx >= (u64) bh_arr_length(((AstCall *) actual)->arg_arr)) {
                 if (err_msg) *err_msg = "Not enough arguments to polymorphic procedure.";
                 goto sln_not_found;
             }