Type* type_build_from_ast(bh_allocator alloc, struct AstType* type_node);
const char* type_get_name(Type* type);
+b32 type_is_pointer(Type* type);
+
#endif // #ifndef ONYX_TYPES
use "progs/intrinsics"
pointer_test :: proc {
- p : ^i32 = 0 as ^i32;
+ p := 0 as ^i32;
}
print :: foreign "host" "print" proc (val: i32) ---
return;
}
- if (assign->lval->type == NULL) {
- assign->lval->type = type_build_from_ast(state->node_allocator, assign->lval->type_node);
- }
-
if ((assign->lval->flags & Ast_Flag_Const) != 0 && assign->lval->type != NULL) {
onyx_message_add(state->msgs,
ONYX_MESSAGE_TYPE_ASSIGN_CONST,
return;
}
+ if (assign->lval->type == NULL) {
+ assign->lval->type = type_build_from_ast(state->node_allocator, assign->lval->type_node);
+ }
+
check_expression(state, assign->expr);
if (assign->lval->type == NULL) {
if (!types_are_compatible(formal_param->base.type, actual_param->base.type)) {
onyx_message_add(state->msgs,
ONYX_MESSAGE_TYPE_FUNCTION_PARAM_TYPE_MISMATCH,
- actual_param->value->token->pos,
+ actual_param->base.token->pos,
callee->base.token->text, callee->base.token->length,
type_get_name(formal_param->base.type),
arg_pos,
return;
}
- if (binop->left->type->kind == Type_Kind_Pointer
- || binop->right->type->kind == Type_Kind_Pointer
- || (binop->left->type->Basic.flags & Basic_Flag_Pointer)
- || (binop->right->type->Basic.flags & Basic_Flag_Pointer)) {
+ if (type_is_pointer(binop->left->type)
+ || type_is_pointer(binop->right->type)) {
onyx_message_add(state->msgs,
ONYX_MESSAGE_TYPE_LITERAL,
binop->base.token->pos,
if (((AstUnaryOp *) expr)->operation != Unary_Op_Cast) {
expr->type = ((AstUnaryOp *) expr)->expr->type;
- } else {
- expr->type = type_build_from_ast(state->node_allocator, expr->type_node);
}
break;
#include "onyxmsgs.h"
#include "onyxutils.h"
+#define MAX_MSGS 5
+
static const char* msg_formats[] = {
"%s",
"expected token '%s', got '%s'",
void onyx_message_print(OnyxMessages* msgs) {
OnyxMessage* msg = msgs->first;
- i32 msg_count = 1000;
+ i32 msg_count = MAX_MSGS;
while (msg && msg_count-- > 0) {
if (msg->pos.filename) {
AstArgument* curr = NULL;
while (parser->curr_token->type != ')') {
curr = make_node(AstArgument, Ast_Kind_Argument);
+ curr->base.token = parser->curr_token;
curr->value = parse_expression(parser);
if (curr != NULL && curr->base.kind != Ast_Kind_Error) {
case Token_Type_Literal_True:
{
AstNumLit* bool_node = make_node(AstNumLit, Ast_Kind_Literal);
- bool_node->base.type_node = (AstType *) &basic_type_i8;
+ bool_node->base.type_node = (AstType *) &basic_type_bool;
bool_node->base.token = expect(parser, Token_Type_Literal_True);
bool_node->value.i = 1;
retval = (AstTyped *) bool_node;
case Token_Type_Literal_False:
{
AstNumLit* bool_node = make_node(AstNumLit, Ast_Kind_Literal);
- bool_node->base.type_node = (AstType *) &basic_type_i8;
+ bool_node->base.type_node = (AstType *) &basic_type_bool;
bool_node->base.token = expect(parser, Token_Type_Literal_False);
bool_node->value.i = 0;
retval = (AstTyped *) bool_node;
else if (parser->curr_token->type == Token_Type_Fslash_Equal) bin_op = Binary_Op_Divide;
else if (parser->curr_token->type == Token_Type_Percent_Equal) bin_op = Binary_Op_Modulus;
- parser_next_token(parser);
-
- AstTyped* expr = parse_expression(parser);
-
AstBinaryOp* bin_op_node = make_node(AstBinaryOp, Ast_Kind_Binary_Op);
bin_op_node->operation = bin_op;
+ bin_op_node->base.token = parser->curr_token;
+
+ parser_next_token(parser);
+ AstTyped* expr = parse_expression(parser);
AstNode* bin_op_left = make_node(AstNode, Ast_Kind_Symbol);
bin_op_left->token = symbol;
bin_op_node->right = expr;
AstAssign* assign_node = make_node(AstAssign, Ast_Kind_Assignment);
+ assign_node->base.token = bin_op_node->base.token;
// TODO: Maybe I don't need to make another lval node?
AstNode* lval = make_node(AstNode, Ast_Kind_Symbol);
if (parser->curr_token->type == '^') {
parser_next_token(parser);
AstPointerType* new = make_node(AstPointerType, Ast_Kind_Pointer_Type);
+ new->base.flags |= Basic_Flag_Pointer;
*next_insertion = (AstType *) new;
next_insertion = &new->elem;
}
if (!symbol_unique_introduce(state, (*foreign)->import)) return;
}
+ // NOTE: Then, resolve all symbols in all functions
bh_arr_each(AstForeign *, foreign, program->foreigns) {
if ((*foreign)->import->kind == Ast_Kind_Function) {
symres_function(state, (AstFunction *) (*foreign)->import);
}
}
-
- // NOTE: Then, resolve all symbols in all functions
bh_arr_each(AstFunction *, function, program->functions)
symres_function(state, *function);
}
default: return "unknown";
}
}
+
+b32 type_is_pointer(Type* type) {
+ return type->kind == Type_Kind_Pointer || (type->Basic.flags & Basic_Flag_Pointer) != 0;
+}
static void compile_block(OnyxWasmModule* mod, bh_arr(WasmInstruction)* pcode, AstBlock* block) {
bh_arr(WasmInstruction) code = *pcode;
+ bh_arr_push(mod->structured_jump_target, 1);
WID(WI_BLOCK_START, 0x40);
forll (AstNode, stmt, block->body, next) {
}
WI(WI_BLOCK_END);
+ bh_arr_pop(mod->structured_jump_target);
*pcode = code;
}
/* REM */ { WI_I32_REM_S, WI_I64_REM_S, WI_NOP, WI_NOP },
/* EQ */ { WI_I32_EQ, WI_I64_EQ, WI_F32_EQ, WI_F64_EQ },
- /* NEQ */ { WI_NOP, WI_NOP, WI_F32_NE , WI_F64_NE },
+ /* NEQ */ { WI_I32_NE, WI_I64_NE, WI_F32_NE , WI_F64_NE },
/* LT */ { WI_I32_LT_S, WI_I64_LT_S, WI_F32_LT, WI_F64_LT },
/* LTE */ { WI_I32_LE_S, WI_I64_LE_S, WI_F32_LE, WI_F64_LE },
/* GT */ { WI_I32_GT_S, WI_I64_GT_S, WI_F32_GT, WI_F64_GT },