From 2eeba262e7ac66eace3bbe2a74e0565c8bdddbc2 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 2 Aug 2020 15:08:14 -0500 Subject: [PATCH] Added adding and subtracting from pointers with C style pointer arithmetic --- include/onyxtypes.h | 1 + onyx | Bin 349888 -> 350992 bytes progs/alloc.onyx | 4 +- progs/alloc_test.onyx | 16 ++- src/onyxchecker.c | 260 ++++++++++++++++++++++++++++++------------ src/onyxtypes.c | 6 + 6 files changed, 203 insertions(+), 84 deletions(-) diff --git a/include/onyxtypes.h b/include/onyxtypes.h index 12d06a75..f997d897 100644 --- a/include/onyxtypes.h +++ b/include/onyxtypes.h @@ -123,6 +123,7 @@ b32 type_is_pointer(Type* type); b32 type_is_array(Type* tyoe); b32 type_is_struct(Type* type); b32 type_is_bool(Type* type); +b32 type_is_integer(Type* type); b32 type_results_in_void(Type* type); #endif // #ifndef ONYX_TYPES diff --git a/onyx b/onyx index c72c7889fac77d065f72b2c5533253b5ba912ca2..913537647da248638c18e07a94171b53b945872a 100755 GIT binary patch delta 81846 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 BDB~&|;9F#UMe8L4p>81g$49X-l!Xgb;nI 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 i32 { - arr := cast([] i32) malloc(sizeof [8] i32); - defer if cast(rawptr) arr != null do mfree(arr); + arr := cast([] i64) malloc(sizeof [8] i64); + if cast(rawptr) arr == null do return 0; + defer mfree(arr); - for i: 0, 8 do arr[i] = i * i; - for i: 0, 8 do print(arr[i]); + for i: 0, 8 do arr[i] = cast(i64) (i * i); - return arr[1] + arr[7]; + walker := cast(^i64) arr; + for _: 0, 8 { + print(*(walker + 2)); + walker += 1; + } + + return cast(i32) (arr[1] + arr[7]); } proc #export "main" { diff --git a/src/onyxchecker.c b/src/onyxchecker.c index baea6318..cfc3afd7 100644 --- a/src/onyxchecker.c +++ b/src/onyxchecker.c @@ -341,78 +341,88 @@ CHECK(call, AstCall* call) { return 0; } -CHECK(binaryop, AstBinaryOp* binop, b32 assignment_is_ok) { - if (check_expression(&binop->left)) return 1; - if (check_expression(&binop->right)) return 1; +CHECK(binop_assignment, AstBinaryOp* binop, b32 assignment_is_ok) { + if (!assignment_is_ok) { + onyx_message_add(Msg_Type_Literal, + binop->token->pos, + "assignment not valid in expression"); + return 1; + } - if (binop_is_assignment(binop)) { - if (!assignment_is_ok) { - onyx_message_add(Msg_Type_Literal, - binop->token->pos, - "assignment not valid in expression"); - return 1; - } + if (!is_lval((AstNode *) binop->left)) { + onyx_message_add(Msg_Type_Not_Lval, + binop->left->token->pos, + binop->left->token->text, binop->left->token->length); + return 1; + } - if (!is_lval((AstNode *) binop->left)) { - onyx_message_add(Msg_Type_Not_Lval, - binop->left->token->pos, - binop->left->token->text, binop->left->token->length); - return 1; - } + if ((binop->left->flags & Ast_Flag_Const) != 0 && binop->left->type != NULL) { + onyx_message_add(Msg_Type_Assign_Const, + binop->token->pos, + binop->left->token->text, binop->left->token->length); + return 1; + } - if ((binop->left->flags & Ast_Flag_Const) != 0 && binop->left->type != NULL) { - onyx_message_add(Msg_Type_Assign_Const, - 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 (binop->operation == Binary_Op_Assign) { - // NOTE: Raw assignment - if (binop->left->type == NULL) { - binop->left->type = binop->right->type; - } + if (binop->operation == Binary_Op_Assign) { + // NOTE: Raw assignment - } else { - // NOTE: +=, -=, ... - - AstBinaryOp* binop_node = onyx_ast_node_new( - semstate.node_allocator, - sizeof(AstBinaryOp), - Ast_Kind_Binary_Op); - - binop_node->token = binop->token; - binop_node->left = binop->left; - binop_node->right = binop->right; - binop_node->type = binop->right->type; - - if (binop->operation == Binary_Op_Assign_Add) binop_node->operation = Binary_Op_Add; - else if (binop->operation == Binary_Op_Assign_Minus) binop_node->operation = Binary_Op_Minus; - else if (binop->operation == Binary_Op_Assign_Multiply) binop_node->operation = Binary_Op_Multiply; - else if (binop->operation == Binary_Op_Assign_Divide) binop_node->operation = Binary_Op_Divide; - else if (binop->operation == Binary_Op_Assign_Modulus) binop_node->operation = Binary_Op_Modulus; - else if (binop->operation == Binary_Op_Assign_And) binop_node->operation = Binary_Op_And; - else if (binop->operation == Binary_Op_Assign_Or) binop_node->operation = Binary_Op_Or; - else if (binop->operation == Binary_Op_Assign_Xor) binop_node->operation = Binary_Op_Xor; - else if (binop->operation == Binary_Op_Assign_Shl) binop_node->operation = Binary_Op_Shl; - else if (binop->operation == Binary_Op_Assign_Shr) binop_node->operation = Binary_Op_Shr; - else if (binop->operation == Binary_Op_Assign_Sar) binop_node->operation = Binary_Op_Sar; - - binop->right = (AstTyped *) binop_node; - binop->operation = Binary_Op_Assign; - } + // NOTE: This is the 'type inference' system. Very stupid, but very easy. + // If a left operand has an unknown type, fill it in with the type of + // the right hand side. + if (binop->left->type == NULL) binop->left->type = binop->right->type; } else { - if (!binop_is_compare(binop) && - (type_is_pointer(binop->left->type) - || type_is_pointer(binop->right->type))) { - onyx_message_add(Msg_Type_Literal, - binop->token->pos, - "binary operations are not supported for pointers (yet)."); - return 1; - } + // NOTE: +=, -=, ... + + AstBinaryOp* binop_node = onyx_ast_node_new( + semstate.node_allocator, + sizeof(AstBinaryOp), + Ast_Kind_Binary_Op); + + binop_node->token = binop->token; + binop_node->left = binop->left; + binop_node->right = binop->right; + binop_node->type = binop->right->type; + + if (binop->operation == Binary_Op_Assign_Add) binop_node->operation = Binary_Op_Add; + else if (binop->operation == Binary_Op_Assign_Minus) binop_node->operation = Binary_Op_Minus; + else if (binop->operation == Binary_Op_Assign_Multiply) binop_node->operation = Binary_Op_Multiply; + else if (binop->operation == Binary_Op_Assign_Divide) binop_node->operation = Binary_Op_Divide; + else if (binop->operation == Binary_Op_Assign_Modulus) binop_node->operation = Binary_Op_Modulus; + else if (binop->operation == Binary_Op_Assign_And) binop_node->operation = Binary_Op_And; + else if (binop->operation == Binary_Op_Assign_Or) binop_node->operation = Binary_Op_Or; + else if (binop->operation == Binary_Op_Assign_Xor) binop_node->operation = Binary_Op_Xor; + else if (binop->operation == Binary_Op_Assign_Shl) binop_node->operation = Binary_Op_Shl; + else if (binop->operation == Binary_Op_Assign_Shr) binop_node->operation = Binary_Op_Shr; + else if (binop->operation == Binary_Op_Assign_Sar) binop_node->operation = Binary_Op_Sar; + + binop->right = (AstTyped *) binop_node; + binop->operation = Binary_Op_Assign; + + if (check_binaryop(binop_node, 0)) return 1; } + if (!types_are_compatible(binop->left->type, binop->right->type)) { + onyx_message_add(Msg_Type_Binop_Mismatch, + binop->token->pos, + type_get_name(binop->left->type), + type_get_name(binop->right->type)); + return 1; + } + + binop->type = &basic_types[Basic_Kind_Void]; + + return 0; +} + +CHECK(binaryop_compare, AstBinaryOp* binop) { if (binop->left->type == NULL) { onyx_message_add(Msg_Type_Unresolved_Type, binop->token->pos, @@ -427,7 +437,6 @@ CHECK(binaryop, AstBinaryOp* binop, b32 assignment_is_ok) { return 1; } - if (!types_are_compatible(binop->left->type, binop->right->type)) { onyx_message_add(Msg_Type_Binop_Mismatch, binop->token->pos, @@ -436,29 +445,128 @@ CHECK(binaryop, AstBinaryOp* binop, b32 assignment_is_ok) { return 1; } - if (binop->operation >= Binary_Op_Bool_And - && binop->operation <= Binary_Op_Bool_Or) { + binop->type = &basic_types[Basic_Kind_Bool]; + return 0; +} + +CHECK(binaryop_bool, AstBinaryOp* 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 (!type_is_bool(binop->left->type) || !type_is_bool(binop->right->type)) { + 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_bool(binop->left->type) || !type_is_bool(binop->right->type)) { + onyx_message_add(Msg_Type_Literal, + binop->token->pos, + "boolean operator expects boolean types for both operands"); + return 1; + } + + binop->type = &basic_types[Basic_Kind_Bool]; + return 0; +} + +CHECK(binaryop, AstBinaryOp* binop, b32 assignment_is_ok) { + if (check_expression(&binop->left)) return 1; + if (check_expression(&binop->right)) return 1; + + if (binop_is_assignment(binop)) return check_binop_assignment(binop, assignment_is_ok); + if (binop_is_compare(binop)) return check_binaryop_compare(binop); + if (binop->operation == Binary_Op_Bool_And + || binop->operation == Binary_Op_Bool_Or) + return check_binaryop_bool(binop); + + if (type_is_pointer(binop->right->type)) { + onyx_message_add(Msg_Type_Literal, + binop->token->pos, + "right side of binary operator is a pointer"); + return 1; + } + + if (binop->left->type->kind == Type_Kind_Basic + && binop->left->type->Basic.kind == Basic_Kind_Rawptr + && !binop_is_compare(binop)) { + onyx_message_add(Msg_Type_Literal, + binop->token->pos, + "cannot operate on a rawptr"); + return 1; + } + + b32 lptr = type_is_pointer(binop->left->type); + if (lptr && (binop->operation != Binary_Op_Add && binop->operation != Binary_Op_Minus)) { + onyx_message_add(Msg_Type_Literal, + binop->token->pos, + "this operator is not supported for these operands"); + 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, - binop->token->pos, - "boolean operator expects boolean types for both operands"); + binop->right->token->pos, + "expected integer type"); return 1; } - binop->type = &basic_types[Basic_Kind_Bool]; + AstNumLit* numlit = onyx_ast_node_new( + semstate.node_allocator, + sizeof(AstNumLit), + Ast_Kind_NumLit); - } else if (binop->operation >= Binary_Op_Equal - && binop->operation <= Binary_Op_Greater_Equal) { - binop->type = &basic_types[Basic_Kind_Bool]; + numlit->token = binop->right->token; + numlit->type = binop->right->type; + numlit->value.i = type_size_of(binop->left->type->Pointer.elem); - } else if (binop_is_assignment(binop)) { - binop->type = &basic_types[Basic_Kind_Void]; + AstBinaryOp* binop_node = onyx_ast_node_new( + semstate.node_allocator, + sizeof(AstBinaryOp), + Ast_Kind_Binary_Op); - } else { + binop_node->token = binop->token; + binop_node->left = binop->right; + binop_node->right = (AstTyped *) numlit; + binop_node->type = binop->right->type; + binop_node->operation = Binary_Op_Multiply; + + if (check_binaryop(binop_node, 0)) return 1; + + binop->right = (AstTyped *) binop_node; binop->type = binop->left->type; + binop->right->type = binop->left->type; + } + + if (!types_are_compatible(binop->left->type, binop->right->type)) { + onyx_message_add(Msg_Type_Binop_Mismatch, + binop->token->pos, + type_get_name(binop->left->type), + type_get_name(binop->right->type)); + return 1; } + binop->type = binop->left->type; return 0; } diff --git a/src/onyxtypes.c b/src/onyxtypes.c index 467b91ab..c6891d4f 100644 --- a/src/onyxtypes.c +++ b/src/onyxtypes.c @@ -471,6 +471,12 @@ b32 type_is_bool(Type* type) { return type != NULL && type->kind == Type_Kind_Basic && type->Basic.kind == Basic_Kind_Bool; } +b32 type_is_integer(Type* type) { + if (type->kind != Type_Kind_Basic) return 0; + + return type->Basic.kind >= Basic_Kind_I8 && type->Basic.kind <= Basic_Kind_U64; +} + b32 type_results_in_void(Type* type) { return (type == NULL) || (type->kind == Type_Kind_Basic && type->Basic.kind == Basic_Kind_Void) -- 2.25.1