Compile as C! Whoop!

This commit is contained in:
Ginger Bill
2016-11-23 12:25:37 +00:00
parent ef8563a818
commit a77c6b3e55
19 changed files with 231 additions and 222 deletions
+4 -4
View File
@@ -6,7 +6,7 @@ set exe_name=odin.exe
:: Debug = 0, Release = 1 :: Debug = 0, Release = 1
set release_mode=0 set release_mode=0
set compiler_flags= -nologo -Oi -TP -W4 -fp:fast -fp:except- -Gm- -MP -FC -GS- -EHsc- -GR- set compiler_flags= -nologo -Oi -TC -W4 -fp:fast -fp:except- -Gm- -MP -FC -GS- -EHsc- -GR-
if %release_mode% EQU 0 ( rem Debug if %release_mode% EQU 0 ( rem Debug
set compiler_flags=%compiler_flags% -Od -MDd -Z7 set compiler_flags=%compiler_flags% -Od -MDd -Z7
@@ -17,7 +17,7 @@ if %release_mode% EQU 0 ( rem Debug
set compiler_warnings= ^ set compiler_warnings= ^
-we4013 -we4706 -we4002 ^ -we4013 -we4706 -we4002 ^
-wd4100 -wd4127 -wd4189 ^ -wd4100 -wd4101 -wd4127 -wd4189 ^
-wd4201 -wd4204 -wd4244 ^ -wd4201 -wd4204 -wd4244 ^
-wd4306 ^ -wd4306 ^
-wd4456 -wd4457 -wd4480 ^ -wd4456 -wd4457 -wd4480 ^
@@ -47,8 +47,8 @@ rem pushd %build_dir%
del *.ilk > NUL 2> NUL del *.ilk > NUL 2> NUL
cl %compiler_settings% "src\main.cpp" ^ cl %compiler_settings% "src\main.cpp" ^
/link %linker_settings% -OUT:%exe_name% /link %linker_settings% -OUT:%exe_name% ^
rem && odin run code/demo.odin && odin run code/demo.odin
rem odin run code/demo.odin rem odin run code/demo.odin
+1 -1
View File
@@ -148,7 +148,7 @@ void array_init_count(Array<T> *array, gbAllocator a, isize count) {
template <typename T> template <typename T>
Array<T> array_make(T *data, isize count, isize capacity) { Array<T> array_make(T *data, isize count, isize capacity) {
Array<T> a = {}; Array<T> a = {0};
a.data = data; a.data = data;
a.count = count; a.count = count;
a.capacity = capacity; a.capacity = capacity;
+6 -6
View File
@@ -186,7 +186,7 @@ typedef struct ImplicitValueInfo {
Type * type; Type * type;
} ImplicitValueInfo; } ImplicitValueInfo;
// NOTE(bill): This is initialized later // NOTE(bill): This is initialized later
gb_global ImplicitValueInfo implicit_value_infos[ImplicitValue_Count] = {}; gb_global ImplicitValueInfo implicit_value_infos[ImplicitValue_Count] = {0};
@@ -667,7 +667,7 @@ void add_type_and_value(CheckerInfo *i, AstNode *expression, AddressingMode mode
} }
} }
TypeAndValue tv = {}; TypeAndValue tv = {0};
tv.type = type; tv.type = type;
tv.value = value; tv.value = value;
tv.mode = mode; tv.mode = mode;
@@ -852,7 +852,7 @@ void add_type_info_type(Checker *c, Type *t) {
void check_procedure_later(Checker *c, AstFile *file, Token token, DeclInfo *decl, Type *type, AstNode *body, u32 tags) { void check_procedure_later(Checker *c, AstFile *file, Token token, DeclInfo *decl, Type *type, AstNode *body, u32 tags) {
ProcedureInfo info = {}; ProcedureInfo info = {0};
info.file = file; info.file = file;
info.token = token; info.token = token;
info.decl = decl; info.decl = decl;
@@ -879,7 +879,7 @@ Type *const curr_procedure(Checker *c) {
} }
void add_curr_ast_file(Checker *c, AstFile *file) { void add_curr_ast_file(Checker *c, AstFile *file) {
TokenPos zero_pos = {}; TokenPos zero_pos = {0};
global_error_collector.prev = zero_pos; global_error_collector.prev = zero_pos;
c->curr_ast_file = file; c->curr_ast_file = file;
c->context.decl = file->decl_info; c->context.decl = file->decl_info;
@@ -911,7 +911,7 @@ void add_dependency_to_map(MapEntity *map, CheckerInfo *info, Entity *node) {
} }
MapEntity generate_minimum_dependency_map(CheckerInfo *info, Entity *start) { MapEntity generate_minimum_dependency_map(CheckerInfo *info, Entity *start) {
MapEntity map = {}; // Key: Entity * MapEntity map = {0}; // Key: Entity *
map_entity_init(&map, heap_allocator()); map_entity_init(&map, heap_allocator());
for_array(i, info->entities.entries) { for_array(i, info->entities.entries) {
@@ -1027,7 +1027,7 @@ void check_global_entity(Checker *c, EntityKind kind) {
Scope *prev_scope = c->context.scope; Scope *prev_scope = c->context.scope;
c->context.scope = d->scope; c->context.scope = d->scope;
check_entity_decl(c, e, d, NULL); check_entity_decl(c, e, d, NULL, NULL);
} }
} }
} }
+7 -7
View File
@@ -69,7 +69,7 @@ void check_init_variables(Checker *c, Entity **lhs, isize lhs_count, AstNodeArra
for_array(i, inits) { for_array(i, inits) {
AstNode *rhs = inits.e[i]; AstNode *rhs = inits.e[i];
Operand o = {}; Operand o = {0};
check_multi_expr(c, &o, rhs); check_multi_expr(c, &o, rhs);
if (o.type->kind != Type_Tuple) { if (o.type->kind != Type_Tuple) {
array_add(&operands, o); array_add(&operands, o);
@@ -185,7 +185,7 @@ void check_var_decl_node(Checker *c, AstNode *node) {
Type *init_type = NULL; Type *init_type = NULL;
if (vd->type) { if (vd->type) {
init_type = check_type(c, vd->type, NULL); init_type = check_type_extra(c, vd->type, NULL, NULL);
if (init_type == NULL) if (init_type == NULL)
init_type = t_invalid; init_type = t_invalid;
} }
@@ -280,7 +280,7 @@ void check_const_decl(Checker *c, Entity *e, AstNode *type_expr, AstNode *init_e
e->type = t; e->type = t;
} }
Operand operand = {}; Operand operand = {0};
if (init_expr) { if (init_expr) {
check_expr(c, &operand, init_expr); check_expr(c, &operand, init_expr);
} }
@@ -296,12 +296,12 @@ void check_type_decl(Checker *c, Entity *e, AstNode *type_expr, Type *def, Cycle
} }
e->type = named; e->type = named;
CycleChecker local_cycle_checker = {}; CycleChecker local_cycle_checker = {0};
if (cycle_checker == NULL) { if (cycle_checker == NULL) {
cycle_checker = &local_cycle_checker; cycle_checker = &local_cycle_checker;
} }
Type *bt = check_type(c, type_expr, named, cycle_checker_add(cycle_checker, e)); Type *bt = check_type_extra(c, type_expr, named, cycle_checker_add(cycle_checker, e));
named->Named.base = bt; named->Named.base = bt;
named->Named.base = base_type(named->Named.base); named->Named.base = base_type(named->Named.base);
if (named->Named.base == t_invalid) { if (named->Named.base == t_invalid) {
@@ -457,7 +457,7 @@ void check_var_decl(Checker *c, Entity *e, Entity **entities, isize entity_count
e->flags |= EntityFlag_Visited; e->flags |= EntityFlag_Visited;
if (type_expr != NULL) if (type_expr != NULL)
e->type = check_type(c, type_expr, NULL); e->type = check_type_extra(c, type_expr, NULL, NULL);
if (init_expr == NULL) { if (init_expr == NULL) {
if (type_expr == NULL) if (type_expr == NULL)
@@ -467,7 +467,7 @@ void check_var_decl(Checker *c, Entity *e, Entity **entities, isize entity_count
if (entities == NULL || entity_count == 1) { if (entities == NULL || entity_count == 1) {
GB_ASSERT(entities == NULL || entities[0] == e); GB_ASSERT(entities == NULL || entities[0] == e);
Operand operand = {}; Operand operand = {0};
check_expr(c, &operand, init_expr); check_expr(c, &operand, init_expr);
check_init_variable(c, e, &operand, str_lit("variable declaration")); check_init_variable(c, e, &operand, str_lit("variable declaration"));
} }
+6 -5
View File
@@ -37,7 +37,8 @@ typedef enum EntityFlag {
EntityFlag_VectorElem = 1<<5, EntityFlag_VectorElem = 1<<5,
} EntityFlag; } EntityFlag;
typedef struct Entity { typedef struct Entity Entity;
struct Entity {
EntityKind kind; EntityKind kind;
u32 flags; u32 flags;
Token token; Token token;
@@ -57,8 +58,8 @@ typedef struct Entity {
i32 field_index; i32 field_index;
i32 field_src_index; i32 field_src_index;
} Variable; } Variable;
struct {} TypeName; i32 TypeName;
struct {} Procedure; i32 Procedure;
struct { struct {
BuiltinProcId id; BuiltinProcId id;
} Builtin; } Builtin;
@@ -68,14 +69,14 @@ typedef struct Entity {
Scope *scope; Scope *scope;
bool used; bool used;
} ImportName; } ImportName;
struct {} Nil; i32 Nil;
struct { struct {
// TODO(bill): Should this be a user-level construct rather than compiler-level? // TODO(bill): Should this be a user-level construct rather than compiler-level?
ImplicitValueId id; ImplicitValueId id;
Entity * backing; Entity * backing;
} ImplicitValue; } ImplicitValue;
}; };
} Entity; };
bool is_entity_exported(Entity *e) { bool is_entity_exported(Entity *e) {
if (e->kind == Entity_ImportName) { if (e->kind == Entity_ImportName) {
+65 -66
View File
@@ -1,18 +1,23 @@
void check_expr (Checker *c, Operand *operand, AstNode *expression); void check_expr (Checker *c, Operand *operand, AstNode *expression);
void check_multi_expr (Checker *c, Operand *operand, AstNode *expression); void check_multi_expr (Checker *c, Operand *operand, AstNode *expression);
void check_expr_or_type (Checker *c, Operand *operand, AstNode *expression); void check_expr_or_type (Checker *c, Operand *operand, AstNode *expression);
ExprKind check_expr_base (Checker *c, Operand *operand, AstNode *expression, Type *type_hint = NULL); ExprKind check_expr_base (Checker *c, Operand *operand, AstNode *expression, Type *type_hint);
Type * check_type (Checker *c, AstNode *expression, Type *named_type = NULL, CycleChecker *cycle_checker = NULL); Type * check_type_extra (Checker *c, AstNode *expression, Type *named_type, CycleChecker *cycle_checker);
Type * check_type (Checker *c, AstNode *expression);
void check_type_decl (Checker *c, Entity *e, AstNode *type_expr, Type *def, CycleChecker *cycle_checker); void check_type_decl (Checker *c, Entity *e, AstNode *type_expr, Type *def, CycleChecker *cycle_checker);
Entity * check_selector (Checker *c, Operand *operand, AstNode *node); Entity * check_selector (Checker *c, Operand *operand, AstNode *node);
void check_not_tuple (Checker *c, Operand *operand); void check_not_tuple (Checker *c, Operand *operand);
bool check_value_is_expressible(Checker *c, ExactValue in_value, Type *type, ExactValue *out_value); bool check_value_is_expressible(Checker *c, ExactValue in_value, Type *type, ExactValue *out_value);
void convert_to_typed (Checker *c, Operand *operand, Type *target_type, i32 level = 0); void convert_to_typed (Checker *c, Operand *operand, Type *target_type, i32 level);
gbString expr_to_string (AstNode *expression); gbString expr_to_string (AstNode *expression);
void check_entity_decl (Checker *c, Entity *e, DeclInfo *decl, Type *named_type, CycleChecker *cycle_checker = NULL); void check_entity_decl (Checker *c, Entity *e, DeclInfo *decl, Type *named_type, CycleChecker *cycle_checker);
void check_proc_body (Checker *c, Token token, DeclInfo *decl, Type *type, AstNode *body); void check_proc_body (Checker *c, Token token, DeclInfo *decl, Type *type, AstNode *body);
void update_expr_type (Checker *c, AstNode *e, Type *type, bool final); void update_expr_type (Checker *c, AstNode *e, Type *type, bool final);
gb_inline Type *check_type(Checker *c, AstNode *expression) {
return check_type_extra(c, expression, NULL, NULL);
}
bool check_is_assignable_to_using_subtype(Type *dst, Type *src) { bool check_is_assignable_to_using_subtype(Type *dst, Type *src) {
@@ -46,7 +51,7 @@ bool check_is_assignable_to_using_subtype(Type *dst, Type *src) {
} }
bool check_is_assignable_to(Checker *c, Operand *operand, Type *type, bool is_argument = false) { bool check_is_assignable_to(Checker *c, Operand *operand, Type *type) {
if (operand->mode == Addressing_Invalid || if (operand->mode == Addressing_Invalid ||
type == t_invalid) { type == t_invalid) {
return true; return true;
@@ -138,19 +143,12 @@ bool check_is_assignable_to(Checker *c, Operand *operand, Type *type, bool is_ar
return true; return true;
} }
if (true || is_argument) {
// NOTE(bill): Polymorphism for subtyping
if (check_is_assignable_to_using_subtype(type, src)) {
return true;
}
}
return false; return false;
} }
// NOTE(bill): `content_name` is for debugging and error messages // NOTE(bill): `content_name` is for debugging and error messages
void check_assignment(Checker *c, Operand *operand, Type *type, String context_name, bool is_argument = false) { void check_assignment(Checker *c, Operand *operand, Type *type, String context_name) {
check_not_tuple(c, operand); check_not_tuple(c, operand);
if (operand->mode == Addressing_Invalid) { if (operand->mode == Addressing_Invalid) {
return; return;
@@ -169,14 +167,14 @@ void check_assignment(Checker *c, Operand *operand, Type *type, String context_n
add_type_info_type(c, type); add_type_info_type(c, type);
target_type = default_type(operand->type); target_type = default_type(operand->type);
} }
convert_to_typed(c, operand, target_type); convert_to_typed(c, operand, target_type, 0);
if (operand->mode == Addressing_Invalid) { if (operand->mode == Addressing_Invalid) {
return; return;
} }
} }
if (type != NULL) { if (type != NULL) {
if (!check_is_assignable_to(c, operand, type, is_argument)) { if (!check_is_assignable_to(c, operand, type)) {
gbString type_str = type_to_string(type); gbString type_str = type_to_string(type);
gbString op_type_str = type_to_string(operand->type); gbString op_type_str = type_to_string(operand->type);
gbString expr_str = expr_to_string(operand->expr); gbString expr_str = expr_to_string(operand->expr);
@@ -243,7 +241,7 @@ void check_fields(Checker *c, AstNode *node, AstNodeArray decls,
CycleChecker *cycle_checker, String context) { CycleChecker *cycle_checker, String context) {
gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&c->tmp_arena); gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&c->tmp_arena);
MapEntity entity_map = {}; MapEntity entity_map = {0};
map_entity_init_with_reserve(&entity_map, c->tmp_allocator, 2*(field_count+other_field_count)); map_entity_init_with_reserve(&entity_map, c->tmp_allocator, 2*(field_count+other_field_count));
isize other_field_index = 0; isize other_field_index = 0;
@@ -350,7 +348,7 @@ void check_fields(Checker *c, AstNode *node, AstNodeArray decls,
} }
ast_node(vd, VarDecl, decl); ast_node(vd, VarDecl, decl);
Type *base_type = check_type(c, vd->type, NULL, cycle_checker); Type *base_type = check_type_extra(c, vd->type, NULL, cycle_checker);
for_array(name_index, vd->names) { for_array(name_index, vd->names) {
AstNode *name = vd->names.e[name_index]; AstNode *name = vd->names.e[name_index];
@@ -386,7 +384,7 @@ void check_fields(Checker *c, AstNode *node, AstNodeArray decls,
} }
ast_node(vd, VarDecl, decl); ast_node(vd, VarDecl, decl);
Type *type = check_type(c, vd->type, NULL, cycle_checker); Type *type = check_type_extra(c, vd->type, NULL, cycle_checker);
if (vd->is_using) { if (vd->is_using) {
if (vd->names.count > 1) { if (vd->names.count > 1) {
@@ -459,8 +457,8 @@ void check_fields(Checker *c, AstNode *node, AstNodeArray decls,
// TODO(bill): Cleanup struct field reordering // TODO(bill): Cleanup struct field reordering
// TODO(bill): Inline sorting procedure? // TODO(bill): Inline sorting procedure?
gb_global BaseTypeSizes __checker_sizes = {}; gb_global BaseTypeSizes __checker_sizes = {0};
gb_global gbAllocator __checker_allocator = {}; gb_global gbAllocator __checker_allocator = {0};
GB_COMPARE_PROC(cmp_struct_entity_size) { GB_COMPARE_PROC(cmp_struct_entity_size) {
// Rule: // Rule:
@@ -677,7 +675,7 @@ void check_enum_type(Checker *c, Type *enum_type, Type *named_type, AstNode *nod
gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&c->tmp_arena); gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&c->tmp_arena);
MapEntity entity_map = {}; MapEntity entity_map = {0};
map_entity_init_with_reserve(&entity_map, c->tmp_allocator, 2*(et->fields.count)); map_entity_init_with_reserve(&entity_map, c->tmp_allocator, 2*(et->fields.count));
Entity *blank_entity = make_entity_constant(c->allocator, c->context.scope, blank_token, constant_type, make_exact_value_integer(0));; Entity *blank_entity = make_entity_constant(c->allocator, c->context.scope, blank_token, constant_type, make_exact_value_integer(0));;
@@ -702,7 +700,7 @@ void check_enum_type(Checker *c, Type *enum_type, Type *named_type, AstNode *nod
continue; continue;
} }
Operand o = {}; Operand o = {0};
if (f->value != NULL) { if (f->value != NULL) {
check_expr(c, &o, f->value); check_expr(c, &o, f->value);
if (o.mode != Addressing_Constant) { if (o.mode != Addressing_Constant) {
@@ -892,7 +890,7 @@ void check_identifier(Checker *c, Operand *o, AstNode *n, Type *named_type, Cycl
} }
add_entity_use(c, n, e); add_entity_use(c, n, e);
// CycleChecker local_cycle_checker = {}; // CycleChecker local_cycle_checker = {0};
// if (cycle_checker == NULL) { // if (cycle_checker == NULL) {
// cycle_checker = &local_cycle_checker; // cycle_checker = &local_cycle_checker;
// } // }
@@ -990,7 +988,7 @@ i64 check_array_count(Checker *c, AstNode *e) {
if (e == NULL) { if (e == NULL) {
return 0; return 0;
} }
Operand o = {}; Operand o = {0};
check_expr(c, &o, e); check_expr(c, &o, e);
if (o.mode != Addressing_Constant) { if (o.mode != Addressing_Constant) {
if (o.mode != Addressing_Invalid) { if (o.mode != Addressing_Invalid) {
@@ -1013,14 +1011,14 @@ i64 check_array_count(Checker *c, AstNode *e) {
return 0; return 0;
} }
Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_checker) { Type *check_type_extra(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_checker) {
ExactValue null_value = {ExactValue_Invalid}; ExactValue null_value = {ExactValue_Invalid};
Type *type = NULL; Type *type = NULL;
gbString err_str = NULL; gbString err_str = NULL;
switch (e->kind) { switch (e->kind) {
case_ast_node(i, Ident, e); case_ast_node(i, Ident, e);
Operand o = {}; Operand o = {0};
check_identifier(c, &o, e, named_type, cycle_checker); check_identifier(c, &o, e, named_type, cycle_checker);
switch (o.mode) { switch (o.mode) {
@@ -1042,7 +1040,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c
case_end; case_end;
case_ast_node(se, SelectorExpr, e); case_ast_node(se, SelectorExpr, e);
Operand o = {}; Operand o = {0};
check_selector(c, &o, e); check_selector(c, &o, e);
switch (o.mode) { switch (o.mode) {
@@ -1064,7 +1062,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c
case_end; case_end;
case_ast_node(pe, ParenExpr, e); case_ast_node(pe, ParenExpr, e);
type = check_type(c, pe->expr, named_type, cycle_checker); type = check_type_extra(c, pe->expr, named_type, cycle_checker);
goto end; goto end;
case_end; case_end;
@@ -1092,7 +1090,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c
case_ast_node(at, ArrayType, e); case_ast_node(at, ArrayType, e);
if (at->count != NULL) { if (at->count != NULL) {
Type *elem = check_type(c, at->elem, NULL, cycle_checker); Type *elem = check_type_extra(c, at->elem, NULL, cycle_checker);
type = make_type_array(c->allocator, elem, check_array_count(c, at->count)); type = make_type_array(c->allocator, elem, check_array_count(c, at->count));
} else { } else {
Type *elem = check_type(c, at->elem); Type *elem = check_type(c, at->elem);
@@ -1164,7 +1162,7 @@ Type *check_type(Checker *c, AstNode *e, Type *named_type, CycleChecker *cycle_c
case_end; case_end;
case_ast_node(ce, CallExpr, e); case_ast_node(ce, CallExpr, e);
Operand o = {}; Operand o = {0};
check_expr_or_type(c, &o, e); check_expr_or_type(c, &o, e);
if (o.mode == Addressing_Type) { if (o.mode == Addressing_Type) {
type = o.type; type = o.type;
@@ -1586,7 +1584,7 @@ void check_shift(Checker *c, Operand *x, Operand *y, AstNode *node) {
GB_ASSERT(node->kind == AstNode_BinaryExpr); GB_ASSERT(node->kind == AstNode_BinaryExpr);
ast_node(be, BinaryExpr, node); ast_node(be, BinaryExpr, node);
ExactValue x_val = {}; ExactValue x_val = {0};
if (x->mode == Addressing_Constant) { if (x->mode == Addressing_Constant) {
x_val = exact_value_to_integer(x->value); x_val = exact_value_to_integer(x->value);
} }
@@ -1604,7 +1602,7 @@ void check_shift(Checker *c, Operand *x, Operand *y, AstNode *node) {
if (is_type_unsigned(y->type)) { if (is_type_unsigned(y->type)) {
} else if (is_type_untyped(y->type)) { } else if (is_type_untyped(y->type)) {
convert_to_typed(c, y, t_untyped_integer); convert_to_typed(c, y, t_untyped_integer, 0);
if (y->mode == Addressing_Invalid) { if (y->mode == Addressing_Invalid) {
x->mode = Addressing_Invalid; x->mode = Addressing_Invalid;
return; return;
@@ -1741,7 +1739,7 @@ bool check_is_castable_to(Checker *c, Operand *operand, Type *y) {
} }
String check_down_cast_name(Type *dst_, Type *src_) { String check_down_cast_name(Type *dst_, Type *src_) {
String result = {}; String result = {0};
Type *dst = type_deref(dst_); Type *dst = type_deref(dst_);
Type *src = type_deref(src_); Type *src = type_deref(src_);
Type *dst_s = base_type(dst); Type *dst_s = base_type(dst);
@@ -1776,7 +1774,7 @@ Operand check_ptr_addition(Checker *c, TokenKind op, Operand *ptr, Operand *offs
GB_ASSERT(is_type_integer(offset->type)); GB_ASSERT(is_type_integer(offset->type));
GB_ASSERT(op == Token_Add || op == Token_Sub); GB_ASSERT(op == Token_Add || op == Token_Sub);
Operand operand = {}; Operand operand = {0};
operand.mode = Addressing_Value; operand.mode = Addressing_Value;
operand.type = ptr->type; operand.type = ptr->type;
operand.expr = node; operand.expr = node;
@@ -1809,7 +1807,7 @@ Operand check_ptr_addition(Checker *c, TokenKind op, Operand *ptr, Operand *offs
void check_binary_expr(Checker *c, Operand *x, AstNode *node) { void check_binary_expr(Checker *c, Operand *x, AstNode *node) {
GB_ASSERT(node->kind == AstNode_BinaryExpr); GB_ASSERT(node->kind == AstNode_BinaryExpr);
Operand y_ = {}, *y = &y_; Operand y_ = {0}, *y = &y_;
ast_node(be, BinaryExpr, node); ast_node(be, BinaryExpr, node);
@@ -2079,11 +2077,11 @@ void check_binary_expr(Checker *c, Operand *x, AstNode *node) {
} }
convert_to_typed(c, x, y->type); convert_to_typed(c, x, y->type, 0);
if (x->mode == Addressing_Invalid) { if (x->mode == Addressing_Invalid) {
return; return;
} }
convert_to_typed(c, y, x->type); convert_to_typed(c, y, x->type, 0);
if (y->mode == Addressing_Invalid) { if (y->mode == Addressing_Invalid) {
x->mode = Addressing_Invalid; x->mode = Addressing_Invalid;
return; return;
@@ -2261,6 +2259,7 @@ void convert_untyped_error(Checker *c, Operand *operand, Type *target_type) {
operand->mode = Addressing_Invalid; operand->mode = Addressing_Invalid;
} }
// NOTE(bill): Set initial level to 0
void convert_to_typed(Checker *c, Operand *operand, Type *target_type, i32 level) { void convert_to_typed(Checker *c, Operand *operand, Type *target_type, i32 level) {
GB_ASSERT_NOT_NULL(target_type); GB_ASSERT_NOT_NULL(target_type);
if (operand->mode == Addressing_Invalid || if (operand->mode == Addressing_Invalid ||
@@ -2348,7 +2347,7 @@ bool check_index_value(Checker *c, AstNode *index_value, i64 max_count, i64 *val
return false; return false;
} }
convert_to_typed(c, &operand, t_int); convert_to_typed(c, &operand, t_int, 0);
if (operand.mode == Addressing_Invalid) { if (operand.mode == Addressing_Invalid) {
if (value) *value = 0; if (value) *value = 0;
return false; return false;
@@ -2400,7 +2399,7 @@ Entity *check_selector(Checker *c, Operand *operand, AstNode *node) {
bool check_op_expr = true; bool check_op_expr = true;
Entity *expr_entity = NULL; Entity *expr_entity = NULL;
Entity *entity = NULL; Entity *entity = NULL;
Selection sel = {}; // NOTE(bill): Not used if it's an import name Selection sel = {0}; // NOTE(bill): Not used if it's an import name
AstNode *op_expr = se->expr; AstNode *op_expr = se->expr;
AstNode *selector = unparen_expr(se->selector); AstNode *selector = unparen_expr(se->selector);
@@ -2425,7 +2424,7 @@ Entity *check_selector(Checker *c, Operand *operand, AstNode *node) {
goto error; goto error;
} }
if (entity->type == NULL) { // Not setup yet if (entity->type == NULL) { // Not setup yet
check_entity_decl(c, entity, NULL, NULL); check_entity_decl(c, entity, NULL, NULL, NULL);
} }
GB_ASSERT(entity->type != NULL); GB_ASSERT(entity->type != NULL);
bool is_not_exported = !is_entity_exported(entity); bool is_not_exported = !is_entity_exported(entity);
@@ -2449,7 +2448,7 @@ Entity *check_selector(Checker *c, Operand *operand, AstNode *node) {
} }
} }
if (check_op_expr) { if (check_op_expr) {
check_expr_base(c, operand, op_expr); check_expr_base(c, operand, op_expr, NULL);
if (operand->mode == Addressing_Invalid) { if (operand->mode == Addressing_Invalid) {
goto error; goto error;
} }
@@ -2564,7 +2563,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
switch (id) { switch (id) {
case BuiltinProc_new: { case BuiltinProc_new: {
// new :: proc(Type) -> ^Type // new :: proc(Type) -> ^Type
Operand op = {}; Operand op = {0};
check_expr_or_type(c, &op, ce->args.e[0]); check_expr_or_type(c, &op, ce->args.e[0]);
Type *type = op.type; Type *type = op.type;
if ((op.mode != Addressing_Type && type == NULL) || type == t_invalid) { if ((op.mode != Addressing_Type && type == NULL) || type == t_invalid) {
@@ -2576,7 +2575,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
} break; } break;
case BuiltinProc_new_slice: { case BuiltinProc_new_slice: {
// new_slice :: proc(Type, len: int[, cap: int]) -> []Type // new_slice :: proc(Type, len: int[, cap: int]) -> []Type
Operand op = {}; Operand op = {0};
check_expr_or_type(c, &op, ce->args.e[0]); check_expr_or_type(c, &op, ce->args.e[0]);
Type *type = op.type; Type *type = op.type;
if ((op.mode != Addressing_Type && type == NULL) || type == t_invalid) { if ((op.mode != Addressing_Type && type == NULL) || type == t_invalid) {
@@ -2679,7 +2678,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
case BuiltinProc_offset_of: { case BuiltinProc_offset_of: {
// offset_of :: proc(Type, field) -> untyped int // offset_of :: proc(Type, field) -> untyped int
Operand op = {}; Operand op = {0};
Type *bt = check_type(c, ce->args.e[0]); Type *bt = check_type(c, ce->args.e[0]);
Type *type = base_type(bt); Type *type = base_type(bt);
if (type == NULL || type == t_invalid) { if (type == NULL || type == t_invalid) {
@@ -2861,7 +2860,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
if (d->kind == Type_Slice) { if (d->kind == Type_Slice) {
dest_type = d->Slice.elem; dest_type = d->Slice.elem;
} }
Operand op = {}; Operand op = {0};
check_expr(c, &op, ce->args.e[1]); check_expr(c, &op, ce->args.e[1]);
if (op.mode == Addressing_Invalid) { if (op.mode == Addressing_Invalid) {
return false; return false;
@@ -2900,7 +2899,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
Type *x_type = NULL, *y_type = NULL; Type *x_type = NULL, *y_type = NULL;
x_type = base_type(operand->type); x_type = base_type(operand->type);
Operand op = {}; Operand op = {0};
check_expr(c, &op, ce->args.e[1]); check_expr(c, &op, ce->args.e[1]);
if (op.mode == Addressing_Invalid) { if (op.mode == Addressing_Invalid) {
return false; return false;
@@ -2951,7 +2950,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
continue; continue;
} }
AstNode *arg = ce->args.e[i]; AstNode *arg = ce->args.e[i];
Operand op = {}; Operand op = {0};
check_expr(c, &op, arg); check_expr(c, &op, arg);
if (op.mode == Addressing_Invalid) { if (op.mode == Addressing_Invalid) {
return false; return false;
@@ -3006,7 +3005,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
} }
AstNode *offset = ce->args.e[1]; AstNode *offset = ce->args.e[1];
Operand op = {}; Operand op = {0};
check_expr(c, &op, offset); check_expr(c, &op, offset);
if (op.mode == Addressing_Invalid) if (op.mode == Addressing_Invalid)
return false; return false;
@@ -3047,7 +3046,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
return false; return false;
} }
AstNode *offset = ce->args[1]; AstNode *offset = ce->args[1];
Operand op = {}; Operand op = {0};
check_expr(c, &op, offset); check_expr(c, &op, offset);
if (op.mode == Addressing_Invalid) if (op.mode == Addressing_Invalid)
return false; return false;
@@ -3115,7 +3114,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
cap = ce->args.e[2]; cap = ce->args.e[2];
} }
Operand op = {}; Operand op = {0};
check_expr(c, &op, len); check_expr(c, &op, len);
if (op.mode == Addressing_Invalid) if (op.mode == Addressing_Invalid)
return false; return false;
@@ -3165,7 +3164,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
AstNode *other_arg = ce->args.e[1]; AstNode *other_arg = ce->args.e[1];
Operand a = *operand; Operand a = *operand;
Operand b = {}; Operand b = {0};
check_expr(c, &b, other_arg); check_expr(c, &b, other_arg);
if (b.mode == Addressing_Invalid) { if (b.mode == Addressing_Invalid) {
return false; return false;
@@ -3197,11 +3196,11 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
operand->mode = Addressing_Value; operand->mode = Addressing_Value;
operand->type = type; operand->type = type;
convert_to_typed(c, &a, b.type); convert_to_typed(c, &a, b.type, 0);
if (a.mode == Addressing_Invalid) { if (a.mode == Addressing_Invalid) {
return false; return false;
} }
convert_to_typed(c, &b, a.type); convert_to_typed(c, &b, a.type, 0);
if (b.mode == Addressing_Invalid) { if (b.mode == Addressing_Invalid) {
return false; return false;
} }
@@ -3234,7 +3233,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
AstNode *other_arg = ce->args.e[1]; AstNode *other_arg = ce->args.e[1];
Operand a = *operand; Operand a = *operand;
Operand b = {}; Operand b = {0};
check_expr(c, &b, other_arg); check_expr(c, &b, other_arg);
if (b.mode == Addressing_Invalid) { if (b.mode == Addressing_Invalid) {
return false; return false;
@@ -3266,11 +3265,11 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
operand->mode = Addressing_Value; operand->mode = Addressing_Value;
operand->type = type; operand->type = type;
convert_to_typed(c, &a, b.type); convert_to_typed(c, &a, b.type, 0);
if (a.mode == Addressing_Invalid) { if (a.mode == Addressing_Invalid) {
return false; return false;
} }
convert_to_typed(c, &b, a.type); convert_to_typed(c, &b, a.type, 0);
if (b.mode == Addressing_Invalid) { if (b.mode == Addressing_Invalid) {
return false; return false;
} }
@@ -3396,7 +3395,7 @@ void check_call_arguments(Checker *c, Operand *operand, Type *proc_type, AstNode
array_init_reserve(&operands, c->tmp_allocator, 2*param_count); array_init_reserve(&operands, c->tmp_allocator, 2*param_count);
for_array(i, ce->args) { for_array(i, ce->args) {
Operand o = {}; Operand o = {0};
check_multi_expr(c, &o, ce->args.e[i]); check_multi_expr(c, &o, ce->args.e[i]);
if (o.type->kind != Type_Tuple) { if (o.type->kind != Type_Tuple) {
array_add(&operands, o); array_add(&operands, o);
@@ -3443,7 +3442,7 @@ void check_call_arguments(Checker *c, Operand *operand, Type *proc_type, AstNode
if (variadic) { if (variadic) {
o = operands.e[operand_index]; o = operands.e[operand_index];
} }
check_assignment(c, &o, arg_type, str_lit("argument"), true); check_assignment(c, &o, arg_type, str_lit("argument"));
} }
if (variadic) { if (variadic) {
@@ -3463,7 +3462,7 @@ void check_call_arguments(Checker *c, Operand *operand, Type *proc_type, AstNode
break; break;
} }
} }
check_assignment(c, &o, t, str_lit("argument"), true); check_assignment(c, &o, t, str_lit("argument"));
} }
} }
end: end:
@@ -3500,7 +3499,7 @@ ExprKind check_call_expr(Checker *c, Operand *operand, AstNode *call) {
if (operand->mode == Addressing_Invalid) { if (operand->mode == Addressing_Invalid) {
for_array(i, ce->args) { for_array(i, ce->args) {
check_expr_base(c, operand, ce->args.e[i]); check_expr_base(c, operand, ce->args.e[i], NULL);
} }
operand->mode = Addressing_Invalid; operand->mode = Addressing_Invalid;
operand->expr = call; operand->expr = call;
@@ -3799,7 +3798,7 @@ ExprKind check__expr_base(Checker *c, Operand *o, AstNode *node, Type *type_hint
case Type_Vector: case Type_Vector:
{ {
Type *elem_type = NULL; Type *elem_type = NULL;
String context_name = {}; String context_name = {0};
if (t->kind == Type_Slice) { if (t->kind == Type_Slice) {
elem_type = t->Slice.elem; elem_type = t->Slice.elem;
context_name = str_lit("slice literal"); context_name = str_lit("slice literal");
@@ -3839,7 +3838,7 @@ ExprKind check__expr_base(Checker *c, Operand *o, AstNode *node, Type *type_hint
error(ast_node_token(e), "Index %lld is out of bounds (>= %lld) for vector literal", index, t->Vector.count); error(ast_node_token(e), "Index %lld is out of bounds (>= %lld) for vector literal", index, t->Vector.count);
} }
Operand operand = {}; Operand operand = {0};
check_expr_with_type_hint(c, &operand, e, elem_type); check_expr_with_type_hint(c, &operand, e, elem_type);
check_assignment(c, &operand, elem_type, context_name); check_assignment(c, &operand, elem_type, context_name);
@@ -4023,7 +4022,7 @@ ExprKind check__expr_base(Checker *c, Operand *o, AstNode *node, Type *type_hint
o->mode = Addressing_Value; o->mode = Addressing_Value;
i64 indices[3] = {}; i64 indices[3] = {0};
AstNode *nodes[3] = {se->low, se->high, se->max}; AstNode *nodes[3] = {se->low, se->high, se->max};
for (isize i = 0; i < gb_count_of(nodes); i++) { for (isize i = 0; i < gb_count_of(nodes); i++) {
i64 index = max_count; i64 index = max_count;
@@ -4157,7 +4156,7 @@ ExprKind check_expr_base(Checker *c, Operand *o, AstNode *node, Type *type_hint)
void check_multi_expr(Checker *c, Operand *o, AstNode *e) { void check_multi_expr(Checker *c, Operand *o, AstNode *e) {
gbString err_str = NULL; gbString err_str = NULL;
check_expr_base(c, o, e); check_expr_base(c, o, e, NULL);
switch (o->mode) { switch (o->mode) {
default: default:
return; // NOTE(bill): Valid return; // NOTE(bill): Valid
@@ -4195,7 +4194,7 @@ void check_expr(Checker *c, Operand *o, AstNode *e) {
void check_expr_or_type(Checker *c, Operand *o, AstNode *e) { void check_expr_or_type(Checker *c, Operand *o, AstNode *e) {
check_expr_base(c, o, e); check_expr_base(c, o, e, NULL);
check_not_tuple(c, o); check_not_tuple(c, o);
if (o->mode == Addressing_NoValue) { if (o->mode == Addressing_NoValue) {
gbString str = expr_to_string(o->expr); gbString str = expr_to_string(o->expr);
+21 -21
View File
@@ -1,14 +1,14 @@
bool check_is_terminating(AstNode *node); bool check_is_terminating(AstNode *node);
bool check_has_break (AstNode *stmt, bool implicit); bool check_has_break (AstNode *stmt, bool implicit);
void check_stmt (Checker *c, AstNode *node, u32 flags); void check_stmt (Checker *c, AstNode *node, u32 flags);
// Statements and Declarations // Statements and Declarations
enum StmtFlag : u32 { typedef enum StmtFlag {
Stmt_BreakAllowed = GB_BIT(0), Stmt_BreakAllowed = GB_BIT(0),
Stmt_ContinueAllowed = GB_BIT(1), Stmt_ContinueAllowed = GB_BIT(1),
Stmt_FallthroughAllowed = GB_BIT(2), // TODO(bill): fallthrough Stmt_FallthroughAllowed = GB_BIT(2), // TODO(bill): fallthrough
}; } StmtFlag;
@@ -74,10 +74,10 @@ void check_stmt_list(Checker *c, AstNodeArray stmts, u32 flags) {
} }
for_array(i, delayed_type) { for_array(i, delayed_type) {
check_entity_decl(c, delayed_type.e[i].e, delayed_type.e[i].d, NULL); check_entity_decl(c, delayed_type.e[i].e, delayed_type.e[i].d, NULL, NULL);
} }
for_array(i, delayed_const) { for_array(i, delayed_const) {
check_entity_decl(c, delayed_const.e[i].e, delayed_const.e[i].d, NULL); check_entity_decl(c, delayed_const.e[i].e, delayed_const.e[i].d, NULL, NULL);
} }
bool ft_ok = (flags & Stmt_FallthroughAllowed) != 0; bool ft_ok = (flags & Stmt_FallthroughAllowed) != 0;
@@ -352,7 +352,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
case_ast_node(es, ExprStmt, node) case_ast_node(es, ExprStmt, node)
Operand operand = {Addressing_Invalid}; Operand operand = {Addressing_Invalid};
ExprKind kind = check_expr_base(c, &operand, es->expr); ExprKind kind = check_expr_base(c, &operand, es->expr, NULL);
switch (operand.mode) { switch (operand.mode) {
case Addressing_Type: case Addressing_Type:
error(ast_node_token(node), "Is not an expression"); error(ast_node_token(node), "Is not an expression");
@@ -436,7 +436,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
for_array(i, as->rhs) { for_array(i, as->rhs) {
AstNode *rhs = as->rhs.e[i]; AstNode *rhs = as->rhs.e[i];
Operand o = {}; Operand o = {0};
check_multi_expr(c, &o, rhs); check_multi_expr(c, &o, rhs);
if (o.type->kind != Type_Tuple) { if (o.type->kind != Type_Tuple) {
array_add(&operands, o); array_add(&operands, o);
@@ -592,7 +592,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
case_end; case_end;
case_ast_node(ms, MatchStmt, node); case_ast_node(ms, MatchStmt, node);
Operand x = {}; Operand x = {0};
mod_flags |= Stmt_BreakAllowed; mod_flags |= Stmt_BreakAllowed;
check_open_scope(c, node); check_open_scope(c, node);
@@ -608,7 +608,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
x.type = t_bool; x.type = t_bool;
x.value = make_exact_value_bool(true); x.value = make_exact_value_bool(true);
Token token = {}; Token token = {0};
token.pos = ast_node_token(ms->body).pos; token.pos = ast_node_token(ms->body).pos;
token.string = str_lit("true"); token.string = str_lit("true");
x.expr = make_ident(c->curr_ast_file, token); x.expr = make_ident(c->curr_ast_file, token);
@@ -642,7 +642,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
} }
; ;
MapTypeAndToken seen = {}; // NOTE(bill): Multimap MapTypeAndToken seen = {0}; // NOTE(bill): Multimap
map_type_and_token_init(&seen, heap_allocator()); map_type_and_token_init(&seen, heap_allocator());
for_array(i, bs->stmts) { for_array(i, bs->stmts) {
@@ -656,8 +656,8 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
for_array(j, cc->list) { for_array(j, cc->list) {
AstNode *expr = cc->list.e[j]; AstNode *expr = cc->list.e[j];
Operand y = {}; Operand y = {0};
Operand z = {}; Operand z = {0};
Token eq = {Token_CmpEq}; Token eq = {Token_CmpEq};
check_expr(c, &y, expr); check_expr(c, &y, expr);
@@ -665,7 +665,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
y.mode == Addressing_Invalid) { y.mode == Addressing_Invalid) {
continue; continue;
} }
convert_to_typed(c, &y, x.type); convert_to_typed(c, &y, x.type, 0);
if (y.mode == Addressing_Invalid) { if (y.mode == Addressing_Invalid) {
continue; continue;
} }
@@ -732,7 +732,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
case_end; case_end;
case_ast_node(ms, TypeMatchStmt, node); case_ast_node(ms, TypeMatchStmt, node);
Operand x = {}; Operand x = {0};
mod_flags |= Stmt_BreakAllowed; mod_flags |= Stmt_BreakAllowed;
check_open_scope(c, node); check_open_scope(c, node);
@@ -783,7 +783,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
} }
MapBool seen = {}; MapBool seen = {0};
map_bool_init(&seen, heap_allocator()); map_bool_init(&seen, heap_allocator());
for_array(i, bs->stmts) { for_array(i, bs->stmts) {
@@ -801,7 +801,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
AstNode *type_expr = cc->list.count > 0 ? cc->list.e[0] : NULL; AstNode *type_expr = cc->list.count > 0 ? cc->list.e[0] : NULL;
Type *case_type = NULL; Type *case_type = NULL;
if (type_expr != NULL) { // Otherwise it's a default expression if (type_expr != NULL) { // Otherwise it's a default expression
Operand y = {}; Operand y = {0};
check_expr_or_type(c, &y, type_expr); check_expr_or_type(c, &y, type_expr);
if (is_union_ptr) { if (is_union_ptr) {
@@ -915,7 +915,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
String name = expr->Ident.string; String name = expr->Ident.string;
e = scope_lookup_entity(c->context.scope, name); e = scope_lookup_entity(c->context.scope, name);
} else if (expr->kind == AstNode_SelectorExpr) { } else if (expr->kind == AstNode_SelectorExpr) {
Operand o = {}; Operand o = {0};
e = check_selector(c, &o, expr); e = check_selector(c, &o, expr);
is_selector = true; is_selector = true;
} }
@@ -1083,7 +1083,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
case_ast_node(pa, PushAllocator, node); case_ast_node(pa, PushAllocator, node);
Operand op = {}; Operand op = {0};
check_expr(c, &op, pa->expr); check_expr(c, &op, pa->expr);
check_assignment(c, &op, t_allocator, str_lit("argument to push_allocator")); check_assignment(c, &op, t_allocator, str_lit("argument to push_allocator"));
check_stmt(c, pa->body, mod_flags); check_stmt(c, pa->body, mod_flags);
@@ -1091,7 +1091,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
case_ast_node(pa, PushContext, node); case_ast_node(pa, PushContext, node);
Operand op = {}; Operand op = {0};
check_expr(c, &op, pa->expr); check_expr(c, &op, pa->expr);
check_assignment(c, &op, t_context, str_lit("argument to push_context")); check_assignment(c, &op, t_context, str_lit("argument to push_context"));
check_stmt(c, pa->body, mod_flags); check_stmt(c, pa->body, mod_flags);
@@ -1124,7 +1124,7 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) {
d->proc_decl = node; d->proc_decl = node;
add_entity_and_decl_info(c, pd->name, e, d); add_entity_and_decl_info(c, pd->name, e, d);
check_entity_decl(c, e, d, NULL); check_entity_decl(c, e, d, NULL, NULL);
case_end; case_end;
} }
} }
+11 -5
View File
@@ -295,7 +295,7 @@ gb_global Type *t_context_ptr = NULL;
gbString type_to_string(Type *type, gbAllocator a = heap_allocator()); gbString type_to_string(Type *type);
Type *base_type(Type *t) { Type *base_type(Type *t) {
for (;;) { for (;;) {
@@ -823,7 +823,13 @@ gb_global Entity *entity__string_count = NULL;
gb_global Entity *entity__slice_count = NULL; gb_global Entity *entity__slice_count = NULL;
gb_global Entity *entity__slice_capacity = NULL; gb_global Entity *entity__slice_capacity = NULL;
Selection lookup_field(gbAllocator a, Type *type_, String field_name, bool is_type, Selection sel = empty_selection) { Selection lookup_field_with_selection(gbAllocator a, Type *type_, String field_name, bool is_type, Selection sel);
Selection lookup_field(gbAllocator a, Type *type_, String field_name, bool is_type) {
return lookup_field_with_selection(a, type_, field_name, is_type, empty_selection);
}
Selection lookup_field_with_selection(gbAllocator a, Type *type_, String field_name, bool is_type, Selection sel) {
GB_ASSERT(type_ != NULL); GB_ASSERT(type_ != NULL);
if (str_eq(field_name, str_lit("_"))) { if (str_eq(field_name, str_lit("_"))) {
@@ -1010,7 +1016,7 @@ Selection lookup_field(gbAllocator a, Type *type_, String field_name, bool is_ty
isize prev_count = sel.index.count; isize prev_count = sel.index.count;
selection_add_index(&sel, i); // HACK(bill): Leaky memory selection_add_index(&sel, i); // HACK(bill): Leaky memory
sel = lookup_field(a, f->type, field_name, is_type, sel); sel = lookup_field_with_selection(a, f->type, field_name, is_type, sel);
if (sel.entity != NULL) { if (sel.entity != NULL) {
if (is_type_pointer(f->type)) { if (is_type_pointer(f->type)) {
@@ -1473,8 +1479,8 @@ gbString write_type_to_string(gbString str, Type *type) {
} }
gbString type_to_string(Type *type, gbAllocator a) { gbString type_to_string(Type *type) {
gbString str = gb_string_make(a, ""); gbString str = gb_string_make(gb_heap_allocator(), "");
return write_type_to_string(str, type); return write_type_to_string(str, type);
} }
+2
View File
@@ -2,6 +2,8 @@
#define GB_IMPLEMENTATION #define GB_IMPLEMENTATION
#include "gb/gb.h" #include "gb/gb.h"
typedef _Bool bool;
gbAllocator heap_allocator(void) { gbAllocator heap_allocator(void) {
return gb_heap_allocator(); return gb_heap_allocator();
} }
+6 -6
View File
@@ -54,7 +54,7 @@ ExactValue make_exact_value_string(String string) {
return result; return result;
} }
ExactValue make_exact_value_integer(String string) { ExactValue make_exact_value_integer_from_string(String string) {
// TODO(bill): Allow for numbers with underscores in them // TODO(bill): Allow for numbers with underscores in them
ExactValue result = {ExactValue_Integer}; ExactValue result = {ExactValue_Integer};
i32 base = 10; i32 base = 10;
@@ -78,7 +78,7 @@ ExactValue make_exact_value_integer(i64 i) {
return result; return result;
} }
ExactValue make_exact_value_float(String string) { ExactValue make_exact_value_float_from_string(String string) {
// TODO(bill): Allow for numbers with underscores in them // TODO(bill): Allow for numbers with underscores in them
ExactValue result = {ExactValue_Float}; ExactValue result = {ExactValue_Float};
result.value_float = gb_str_to_f64(cast(char *)string.text, NULL); result.value_float = gb_str_to_f64(cast(char *)string.text, NULL);
@@ -100,8 +100,8 @@ ExactValue make_exact_value_pointer(i64 ptr) {
ExactValue make_exact_value_from_basic_literal(Token token) { ExactValue make_exact_value_from_basic_literal(Token token) {
switch (token.kind) { switch (token.kind) {
case Token_String: return make_exact_value_string(token.string); case Token_String: return make_exact_value_string(token.string);
case Token_Integer: return make_exact_value_integer(token.string); case Token_Integer: return make_exact_value_integer_from_string(token.string);
case Token_Float: return make_exact_value_float(token.string); case Token_Float: return make_exact_value_float_from_string(token.string);
case Token_Rune: { case Token_Rune: {
Rune r = GB_RUNE_INVALID; Rune r = GB_RUNE_INVALID;
gb_utf8_decode(token.string.text, token.string.len, &r); gb_utf8_decode(token.string.text, token.string.len, &r);
@@ -209,7 +209,7 @@ ExactValue exact_unary_operator_value(Token op, ExactValue v, i32 precision) {
failure: failure:
GB_PANIC("Invalid unary operation, %.*s", LIT(token_strings[op.kind])); GB_PANIC("Invalid unary operation, %.*s", LIT(token_strings[op.kind]));
ExactValue error_value = {}; ExactValue error_value = {0};
return error_value; return error_value;
} }
@@ -323,7 +323,7 @@ ExactValue exact_binary_operator_value(Token op, ExactValue x, ExactValue y) {
} }
error: error:
ExactValue error_value = {}; ExactValue error_value = {0};
// gb_printf_err("Invalid binary operation: %s\n", token_kind_to_string(op.kind)); // gb_printf_err("Invalid binary operation: %s\n", token_kind_to_string(op.kind));
return error_value; return error_value;
} }
+5 -5
View File
@@ -76,7 +76,7 @@ gb_inline void _J2(MAP_FUNC,destroy)(MAP_NAME *h) {
} }
gb_internal isize _J2(MAP_FUNC,_add_entry)(MAP_NAME *h, HashKey key) { gb_internal isize _J2(MAP_FUNC,_add_entry)(MAP_NAME *h, HashKey key) {
MAP_ENTRY e = {}; MAP_ENTRY e = {0};
e.key = key; e.key = key;
e.next = -1; e.next = -1;
array_add(&h->entries, e); array_add(&h->entries, e);
@@ -99,7 +99,7 @@ gb_internal MapFindResult _J2(MAP_FUNC,_find)(MAP_NAME *h, HashKey key) {
return fr; return fr;
} }
gb_internal MapFindResult _J2(MAP_FUNC,_find)(MAP_NAME *h, MAP_ENTRY *e) { gb_internal MapFindResult _J2(MAP_FUNC,_find_from_entry)(MAP_NAME *h, MAP_ENTRY *e) {
MapFindResult fr = {-1, -1, -1}; MapFindResult fr = {-1, -1, -1};
if (h->hashes.count > 0) { if (h->hashes.count > 0) {
fr.hash_index = e->key.key % h->hashes.count; fr.hash_index = e->key.key % h->hashes.count;
@@ -244,7 +244,7 @@ MAP_ENTRY *_J2(MAP_FUNC,multi_find_next)(MAP_NAME *h, MAP_ENTRY *e) {
isize _J2(MAP_FUNC,multi_count)(MAP_NAME *h, HashKey key) { isize _J2(MAP_FUNC,multi_count)(MAP_NAME *h, HashKey key) {
isize count = 0; isize count = 0;
auto *e = _J2(MAP_FUNC,multi_find_first)(h, key); MAP_ENTRY *e = _J2(MAP_FUNC,multi_find_first)(h, key);
while (e != NULL) { while (e != NULL) {
count++; count++;
e = _J2(MAP_FUNC,multi_find_next)(h, e); e = _J2(MAP_FUNC,multi_find_next)(h, e);
@@ -254,7 +254,7 @@ isize _J2(MAP_FUNC,multi_count)(MAP_NAME *h, HashKey key) {
void _J2(MAP_FUNC,multi_get_all)(MAP_NAME *h, HashKey key, MAP_TYPE *items) { void _J2(MAP_FUNC,multi_get_all)(MAP_NAME *h, HashKey key, MAP_TYPE *items) {
isize i = 0; isize i = 0;
auto *e = _J2(MAP_FUNC,multi_find_first)(h, key); MAP_ENTRY *e = _J2(MAP_FUNC,multi_find_first)(h, key);
while (e != NULL) { while (e != NULL) {
items[i++] = e->value; items[i++] = e->value;
e = _J2(MAP_FUNC,multi_find_next)(h, e); e = _J2(MAP_FUNC,multi_find_next)(h, e);
@@ -280,7 +280,7 @@ void _J2(MAP_FUNC,multi_insert)(MAP_NAME *h, HashKey key, MAP_TYPE value) {
} }
void _J2(MAP_FUNC,multi_remove)(MAP_NAME *h, HashKey key, MAP_ENTRY *e) { void _J2(MAP_FUNC,multi_remove)(MAP_NAME *h, HashKey key, MAP_ENTRY *e) {
MapFindResult fr = _J2(MAP_FUNC,_find)(h, e); MapFindResult fr = _J2(MAP_FUNC,_find_from_entry)(h, e);
if (fr.entry_index >= 0) { if (fr.entry_index >= 0) {
_J2(MAP_FUNC,_erase)(h, fr); _J2(MAP_FUNC,_erase)(h, fr);
} }
+25 -25
View File
@@ -25,7 +25,7 @@ struct vmValue {
vmValue vm_make_value_ptr(Type *type, void *ptr) { vmValue vm_make_value_ptr(Type *type, void *ptr) {
GB_ASSERT(is_type_pointer(type)); GB_ASSERT(is_type_pointer(type));
vmValue v = {}; vmValue v = {0};
v.type = default_type(type); v.type = default_type(type);
v.val_ptr = ptr; v.val_ptr = ptr;
return v; return v;
@@ -34,21 +34,21 @@ vmValue vm_make_value_int(Type *type, i64 i) {
GB_ASSERT(is_type_integer(type) || GB_ASSERT(is_type_integer(type) ||
is_type_boolean(type) || is_type_boolean(type) ||
is_type_enum(type)); is_type_enum(type));
vmValue v = {}; vmValue v = {0};
v.type = default_type(type); v.type = default_type(type);
v.val_int = i; v.val_int = i;
return v; return v;
} }
vmValue vm_make_value_f32(Type *type, f32 f) { vmValue vm_make_value_f32(Type *type, f32 f) {
GB_ASSERT(is_type_f32(type)); GB_ASSERT(is_type_f32(type));
vmValue v = {}; vmValue v = {0};
v.type = default_type(type); v.type = default_type(type);
v.val_f32 = f; v.val_f32 = f;
return v; return v;
} }
vmValue vm_make_value_f64(Type *type, f64 f) { vmValue vm_make_value_f64(Type *type, f64 f) {
GB_ASSERT(is_type_f64(type)); GB_ASSERT(is_type_f64(type));
vmValue v = {}; vmValue v = {0};
v.type = default_type(type); v.type = default_type(type);
v.val_f64 = f; v.val_f64 = f;
return v; return v;
@@ -65,7 +65,7 @@ vmValue vm_make_value_comp(Type *type, gbAllocator allocator, isize count) {
is_type_raw_union(type) || is_type_raw_union(type) ||
is_type_tuple (type) || is_type_tuple (type) ||
is_type_proc (type)); is_type_proc (type));
vmValue v = {}; vmValue v = {0};
v.type = default_type(type); v.type = default_type(type);
array_init_count(&v.val_comp, allocator, count); array_init_count(&v.val_comp, allocator, count);
return v; return v;
@@ -183,7 +183,7 @@ void vm_set_value(vmFrame *f, ssaValue *v, vmValue val) {
vmFrame *vm_push_frame(VirtualMachine *vm, ssaProcedure *proc) { vmFrame *vm_push_frame(VirtualMachine *vm, ssaProcedure *proc) {
vmFrame frame = {}; vmFrame frame = {0};
frame.vm = vm; frame.vm = vm;
frame.curr_proc = proc; frame.curr_proc = proc;
@@ -227,7 +227,7 @@ vmValue vm_call_proc(VirtualMachine *vm, ssaProcedure *proc, Array<vmValue> valu
if (proc->body == NULL) { if (proc->body == NULL) {
// GB_PANIC("TODO(bill): external procedure"); // GB_PANIC("TODO(bill): external procedure");
gb_printf_err("TODO(bill): external procedure: %.*s\n", LIT(proc->name)); gb_printf_err("TODO(bill): external procedure: %.*s\n", LIT(proc->name));
vmValue result = {}; vmValue result = {0};
result.type = result_type; result.type = result_type;
return result; return result;
} }
@@ -269,7 +269,7 @@ vmValue vm_call_proc(VirtualMachine *vm, ssaProcedure *proc, Array<vmValue> valu
return vm_load(vm, result_mem, result_type); return vm_load(vm, result_mem, result_type);
} }
vmValue void_result = {}; vmValue void_result = {0};
return void_result; return void_result;
} }
@@ -323,7 +323,7 @@ vmValue vm_exact_value(VirtualMachine *vm, ssaValue *ptr, ExactValue value, Type
ast_node(cl, CompoundLit, value.value_compound); ast_node(cl, CompoundLit, value.value_compound);
if (is_type_array(t)) { if (is_type_array(t)) {
vmValue result = {}; vmValue result = {0};
isize elem_count = cl->elems.count; isize elem_count = cl->elems.count;
if (elem_count == 0) { if (elem_count == 0) {
@@ -347,7 +347,7 @@ vmValue vm_exact_value(VirtualMachine *vm, ssaValue *ptr, ExactValue value, Type
return result; return result;
} else if (is_type_vector(t)) { } else if (is_type_vector(t)) {
vmValue result = {}; vmValue result = {0};
isize elem_count = cl->elems.count; isize elem_count = cl->elems.count;
if (elem_count == 0) { if (elem_count == 0) {
@@ -409,7 +409,7 @@ vmValue vm_exact_value(VirtualMachine *vm, ssaValue *ptr, ExactValue value, Type
} }
} else if (value.kind == ExactValue_Invalid) { } else if (value.kind == ExactValue_Invalid) {
vmValue zero_result = {}; vmValue zero_result = {0};
zero_result.type = t; zero_result.type = t;
return zero_result; return zero_result;
} else { } else {
@@ -417,14 +417,14 @@ vmValue vm_exact_value(VirtualMachine *vm, ssaValue *ptr, ExactValue value, Type
} }
GB_ASSERT_MSG(t == NULL, "%s - %d", type_to_string(t), value.kind); GB_ASSERT_MSG(t == NULL, "%s - %d", type_to_string(t), value.kind);
vmValue void_result = {}; vmValue void_result = {0};
return void_result; return void_result;
} }
vmValue vm_operand_value(VirtualMachine *vm, ssaValue *value) { vmValue vm_operand_value(VirtualMachine *vm, ssaValue *value) {
vmFrame *f = vm_back_frame(vm); vmFrame *f = vm_back_frame(vm);
vmValue v = {}; vmValue v = {0};
switch (value->kind) { switch (value->kind) {
case ssaValue_Constant: { case ssaValue_Constant: {
v = vm_exact_value(vm, value, value->Constant.value, value->Constant.type); v = vm_exact_value(vm, value, value->Constant.value, value->Constant.type);
@@ -637,7 +637,7 @@ void vm_store(VirtualMachine *vm, void *dst, vmValue val, Type *type) {
vmValue vm_load_integer(VirtualMachine *vm, void *ptr, Type *type) { vmValue vm_load_integer(VirtualMachine *vm, void *ptr, Type *type) {
// TODO(bill): I assume little endian here // TODO(bill): I assume little endian here
vmValue v = {}; vmValue v = {0};
v.type = type; v.type = type;
GB_ASSERT(is_type_integer(type) || is_type_boolean(type)); GB_ASSERT(is_type_integer(type) || is_type_boolean(type));
// NOTE(bill): Only load the needed amount // NOTE(bill): Only load the needed amount
@@ -647,7 +647,7 @@ vmValue vm_load_integer(VirtualMachine *vm, void *ptr, Type *type) {
vmValue vm_load_pointer(VirtualMachine *vm, void *ptr, Type *type) { vmValue vm_load_pointer(VirtualMachine *vm, void *ptr, Type *type) {
// TODO(bill): I assume little endian here // TODO(bill): I assume little endian here
vmValue v = {}; vmValue v = {0};
v.type = type; v.type = type;
GB_ASSERT(is_type_pointer(type)); GB_ASSERT(is_type_pointer(type));
// NOTE(bill): Only load the needed amount // NOTE(bill): Only load the needed amount
@@ -783,12 +783,12 @@ vmValue vm_load(VirtualMachine *vm, void *ptr, Type *type) {
} }
GB_ASSERT(type == NULL); GB_ASSERT(type == NULL);
vmValue void_result = {}; vmValue void_result = {0};
return void_result; return void_result;
} }
vmValue vm_exec_binary_op(VirtualMachine *vm, Type *type, vmValue lhs, vmValue rhs, TokenKind op) { vmValue vm_exec_binary_op(VirtualMachine *vm, Type *type, vmValue lhs, vmValue rhs, TokenKind op) {
vmValue result = {}; vmValue result = {0};
type = base_type(type); type = base_type(type);
if (is_type_vector(type)) { if (is_type_vector(type)) {
@@ -834,7 +834,7 @@ vmValue vm_exec_binary_op(VirtualMachine *vm, Type *type, vmValue lhs, vmValue r
case Token_GtEq: result.val_f64 = lhs.val_f64 >= rhs.val_f64; break; case Token_GtEq: result.val_f64 = lhs.val_f64 >= rhs.val_f64; break;
} }
} else if (is_type_string(type)) { } else if (is_type_string(type)) {
Array<vmValue> args = {}; Array<vmValue> args = {0};
array_init_count(&args, vm->stack_allocator, 2); array_init_count(&args, vm->stack_allocator, 2);
args[0] = lhs; args[0] = lhs;
args[1] = rhs; args[1] = rhs;
@@ -912,7 +912,7 @@ void vm_exec_instr(VirtualMachine *vm, ssaValue *value) {
switch (instr->kind) { switch (instr->kind) {
case ssaInstr_StartupRuntime: { case ssaInstr_StartupRuntime: {
#if 1 #if 1
Array<vmValue> args = {}; // Empty Array<vmValue> args = {0}; // Empty
vm_call_proc_by_name(vm, make_string(SSA_STARTUP_RUNTIME_PROC_NAME), args); // NOTE(bill): No return value vm_call_proc_by_name(vm, make_string(SSA_STARTUP_RUNTIME_PROC_NAME), args); // NOTE(bill): No return value
#endif #endif
} break; } break;
@@ -1025,7 +1025,7 @@ void vm_exec_instr(VirtualMachine *vm, ssaValue *value) {
case ssaInstr_Return: { case ssaInstr_Return: {
Type *return_type = NULL; Type *return_type = NULL;
vmValue result = {}; vmValue result = {0};
if (instr->Return.value != NULL) { if (instr->Return.value != NULL) {
return_type = ssa_type(instr->Return.value); return_type = ssa_type(instr->Return.value);
@@ -1040,7 +1040,7 @@ void vm_exec_instr(VirtualMachine *vm, ssaValue *value) {
case ssaInstr_Conv: { case ssaInstr_Conv: {
// TODO(bill): Assuming little endian // TODO(bill): Assuming little endian
vmValue dst = {}; vmValue dst = {0};
vmValue src = vm_operand_value(vm, instr->Conv.value); vmValue src = vm_operand_value(vm, instr->Conv.value);
i64 from_size = vm_type_size_of(vm, instr->Conv.from); i64 from_size = vm_type_size_of(vm, instr->Conv.from);
i64 to_size = vm_type_size_of(vm, instr->Conv.to); i64 to_size = vm_type_size_of(vm, instr->Conv.to);
@@ -1129,7 +1129,7 @@ void vm_exec_instr(VirtualMachine *vm, ssaValue *value) {
} break; } break;
case ssaInstr_Call: { case ssaInstr_Call: {
Array<vmValue> args = {}; Array<vmValue> args = {0};
array_init(&args, f->stack_allocator, instr->Call.arg_count); array_init(&args, f->stack_allocator, instr->Call.arg_count);
for (isize i = 0; i < instr->Call.arg_count; i++) { for (isize i = 0; i < instr->Call.arg_count; i++) {
array_add(&args, vm_operand_value(vm, instr->Call.args[i])); array_add(&args, vm_operand_value(vm, instr->Call.args[i]));
@@ -1145,7 +1145,7 @@ void vm_exec_instr(VirtualMachine *vm, ssaValue *value) {
} break; } break;
case ssaInstr_Select: { case ssaInstr_Select: {
vmValue v = {}; vmValue v = {0};
vmValue cond = vm_operand_value(vm, instr->Select.cond); vmValue cond = vm_operand_value(vm, instr->Select.cond);
if (cond.val_int != 0) { if (cond.val_int != 0) {
v = vm_operand_value(vm, instr->Select.true_value); v = vm_operand_value(vm, instr->Select.true_value);
@@ -1184,7 +1184,7 @@ void vm_exec_instr(VirtualMachine *vm, ssaValue *value) {
case ssaInstr_BoundsCheck: { case ssaInstr_BoundsCheck: {
ssaInstrBoundsCheck *bc = &instr->BoundsCheck; ssaInstrBoundsCheck *bc = &instr->BoundsCheck;
Array<vmValue> args = {}; Array<vmValue> args = {0};
array_init(&args, vm->stack_allocator, 5); array_init(&args, vm->stack_allocator, 5);
array_add(&args, vm_exact_value(vm, NULL, make_exact_value_string(bc->pos.file), t_string)); array_add(&args, vm_exact_value(vm, NULL, make_exact_value_string(bc->pos.file), t_string));
array_add(&args, vm_exact_value(vm, NULL, make_exact_value_integer(bc->pos.line), t_int)); array_add(&args, vm_exact_value(vm, NULL, make_exact_value_integer(bc->pos.line), t_int));
@@ -1197,7 +1197,7 @@ void vm_exec_instr(VirtualMachine *vm, ssaValue *value) {
case ssaInstr_SliceBoundsCheck: { case ssaInstr_SliceBoundsCheck: {
ssaInstrSliceBoundsCheck *bc = &instr->SliceBoundsCheck; ssaInstrSliceBoundsCheck *bc = &instr->SliceBoundsCheck;
Array<vmValue> args = {}; Array<vmValue> args = {0};
array_init(&args, vm->stack_allocator, 7); array_init(&args, vm->stack_allocator, 7);
array_add(&args, vm_exact_value(vm, NULL, make_exact_value_string(bc->pos.file), t_string)); array_add(&args, vm_exact_value(vm, NULL, make_exact_value_string(bc->pos.file), t_string));
+34 -34
View File
@@ -117,7 +117,7 @@ AstNodeArray make_ast_node_array(AstFile *f) {
AstNodeArray elems; \ AstNodeArray elems; \
Token open, close; \ Token open, close; \
}) \ }) \
AST_NODE_KIND(_ExprBegin, "", struct{}) \ AST_NODE_KIND(_ExprBegin, "", i32) \
AST_NODE_KIND(BadExpr, "bad expression", struct { Token begin, end; }) \ AST_NODE_KIND(BadExpr, "bad expression", struct { Token begin, end; }) \
AST_NODE_KIND(TagExpr, "tag expression", struct { Token token, name; AstNode *expr; }) \ AST_NODE_KIND(TagExpr, "tag expression", struct { Token token, name; AstNode *expr; }) \
AST_NODE_KIND(RunExpr, "run expression", struct { Token token, name; AstNode *expr; }) \ AST_NODE_KIND(RunExpr, "run expression", struct { Token token, name; AstNode *expr; }) \
@@ -142,8 +142,8 @@ AST_NODE_KIND(_ExprBegin, "", struct{}) \
bool triple_indexed; \ bool triple_indexed; \
}) \ }) \
AST_NODE_KIND(FieldValue, "field value", struct { Token eq; AstNode *field, *value; }) \ AST_NODE_KIND(FieldValue, "field value", struct { Token eq; AstNode *field, *value; }) \
AST_NODE_KIND(_ExprEnd, "", struct{}) \ AST_NODE_KIND(_ExprEnd, "", i32) \
AST_NODE_KIND(_StmtBegin, "", struct{}) \ AST_NODE_KIND(_StmtBegin, "", i32) \
AST_NODE_KIND(BadStmt, "bad statement", struct { Token begin, end; }) \ AST_NODE_KIND(BadStmt, "bad statement", struct { Token begin, end; }) \
AST_NODE_KIND(EmptyStmt, "empty statement", struct { Token token; }) \ AST_NODE_KIND(EmptyStmt, "empty statement", struct { Token token; }) \
AST_NODE_KIND(ExprStmt, "expression statement", struct { AstNode *expr; } ) \ AST_NODE_KIND(ExprStmt, "expression statement", struct { AstNode *expr; } ) \
@@ -157,7 +157,7 @@ AST_NODE_KIND(_StmtBegin, "", struct{}) \
Token op; \ Token op; \
AstNodeArray lhs, rhs; \ AstNodeArray lhs, rhs; \
}) \ }) \
AST_NODE_KIND(_ComplexStmtBegin, "", struct{}) \ AST_NODE_KIND(_ComplexStmtBegin, "", i32) \
AST_NODE_KIND(BlockStmt, "block statement", struct { \ AST_NODE_KIND(BlockStmt, "block statement", struct { \
AstNodeArray stmts; \ AstNodeArray stmts; \
Token open, close; \ Token open, close; \
@@ -220,9 +220,9 @@ AST_NODE_KIND(_ComplexStmtBegin, "", struct{}) \
AstNode *body; \ AstNode *body; \
}) \ }) \
\ \
AST_NODE_KIND(_ComplexStmtEnd, "", struct{}) \ AST_NODE_KIND(_ComplexStmtEnd, "", i32) \
AST_NODE_KIND(_StmtEnd, "", struct{}) \ AST_NODE_KIND(_StmtEnd, "", i32) \
AST_NODE_KIND(_DeclBegin, "", struct{}) \ AST_NODE_KIND(_DeclBegin, "", i32) \
AST_NODE_KIND(BadDecl, "bad declaration", struct { Token begin, end; }) \ AST_NODE_KIND(BadDecl, "bad declaration", struct { Token begin, end; }) \
AST_NODE_KIND(VarDecl, "variable declaration", struct { \ AST_NODE_KIND(VarDecl, "variable declaration", struct { \
u64 tags; \ u64 tags; \
@@ -264,8 +264,8 @@ AST_NODE_KIND(_DeclBegin, "", struct{}) \
Token token, filepath; \ Token token, filepath; \
bool is_system; \ bool is_system; \
}) \ }) \
AST_NODE_KIND(_DeclEnd, "", struct{}) \ AST_NODE_KIND(_DeclEnd, "", i32) \
AST_NODE_KIND(_TypeBegin, "", struct{}) \ AST_NODE_KIND(_TypeBegin, "", i32) \
AST_NODE_KIND(Parameter, "parameter", struct { \ AST_NODE_KIND(Parameter, "parameter", struct { \
AstNodeArray names; \ AstNodeArray names; \
AstNode *type; \ AstNode *type; \
@@ -316,7 +316,7 @@ AST_NODE_KIND(_TypeBegin, "", struct{}) \
AstNode *base_type; \ AstNode *base_type; \
AstNodeArray fields; \ AstNodeArray fields; \
}) \ }) \
AST_NODE_KIND(_TypeEnd, "", struct{}) AST_NODE_KIND(_TypeEnd, "", i32)
typedef enum AstNodeKind { typedef enum AstNodeKind {
AstNode_Invalid, AstNode_Invalid,
@@ -1186,7 +1186,7 @@ AstNodeArray parse_element_list(AstFile *f) {
} }
AstNode *parse_literal_value(AstFile *f, AstNode *type) { AstNode *parse_literal_value(AstFile *f, AstNode *type) {
AstNodeArray elems = {}; AstNodeArray elems = {0};
Token open = expect_token(f, Token_OpenBrace); Token open = expect_token(f, Token_OpenBrace);
f->expr_level++; f->expr_level++;
if (f->curr_token.kind != Token_CloseBrace) { if (f->curr_token.kind != Token_CloseBrace) {
@@ -1206,7 +1206,7 @@ AstNode *parse_value(AstFile *f) {
return value; return value;
} }
AstNode *parse_identifier_or_type(AstFile *f, u32 flags = 0); AstNode *parse_identifier_or_type(AstFile *f, u32 flags);
void check_proc_add_tag(AstFile *f, AstNode *tag_expr, u64 *tags, ProcTag tag, String tag_name) { void check_proc_add_tag(AstFile *f, AstNode *tag_expr, u64 *tags, ProcTag tag, String tag_name) {
@@ -1418,8 +1418,8 @@ AstNode *parse_operand(AstFile *f, bool lhs) {
f->curr_proc = type; f->curr_proc = type;
u64 tags = 0; u64 tags = 0;
String foreign_name = {}; String foreign_name = {0};
String link_name = {}; String link_name = {0};
parse_proc_tags(f, &tags, &foreign_name, &link_name); parse_proc_tags(f, &tags, &foreign_name, &link_name);
if (tags & ProcTag_foreign) { if (tags & ProcTag_foreign) {
syntax_error(f->curr_token, "#foreign cannot be applied to procedure literals"); syntax_error(f->curr_token, "#foreign cannot be applied to procedure literals");
@@ -1442,7 +1442,7 @@ AstNode *parse_operand(AstFile *f, bool lhs) {
} }
default: { default: {
AstNode *type = parse_identifier_or_type(f); AstNode *type = parse_identifier_or_type(f, 0);
if (type != NULL) { if (type != NULL) {
// NOTE(bill): Sanity check as identifiers should be handled already // NOTE(bill): Sanity check as identifiers should be handled already
GB_ASSERT_MSG(type->kind != AstNode_Ident, "Type Cannot be identifier"); GB_ASSERT_MSG(type->kind != AstNode_Ident, "Type Cannot be identifier");
@@ -1473,7 +1473,7 @@ bool is_literal_type(AstNode *node) {
AstNode *parse_call_expr(AstFile *f, AstNode *operand) { AstNode *parse_call_expr(AstFile *f, AstNode *operand) {
AstNodeArray args = make_ast_node_array(f); AstNodeArray args = make_ast_node_array(f);
Token open_paren, close_paren; Token open_paren, close_paren;
Token ellipsis = {}; Token ellipsis = {0};
f->expr_level++; f->expr_level++;
open_paren = expect_token(f, Token_OpenParen); open_paren = expect_token(f, Token_OpenParen);
@@ -1555,7 +1555,7 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) {
// TODO(bill): Handle this // TODO(bill): Handle this
} }
Token open, close; Token open, close;
AstNode *indices[3] = {}; AstNode *indices[3] = {0};
f->expr_level++; f->expr_level++;
open = expect_token(f, Token_OpenBracket); open = expect_token(f, Token_OpenBracket);
@@ -1563,7 +1563,7 @@ AstNode *parse_atom_expr(AstFile *f, bool lhs) {
if (f->curr_token.kind != Token_Colon) if (f->curr_token.kind != Token_Colon)
indices[0] = parse_expr(f, false); indices[0] = parse_expr(f, false);
isize colon_count = 0; isize colon_count = 0;
Token colons[2] = {}; Token colons[2] = {0};
while (f->curr_token.kind == Token_Colon && colon_count < 2) { while (f->curr_token.kind == Token_Colon && colon_count < 2) {
colons[colon_count++] = f->curr_token; colons[colon_count++] = f->curr_token;
@@ -1720,7 +1720,7 @@ AstNode *parse_binary_expr(AstFile *f, bool lhs, i32 prec_in) {
expression = call; expression = call;
} else */{ } else */{
right = parse_binary_expr(f, false, prec+1); right = parse_binary_expr(f, false, prec+1);
AstNodeArray args = {}; AstNodeArray args = {0};
array_init_reserve(&args, gb_arena_allocator(&f->arena), 2); array_init_reserve(&args, gb_arena_allocator(&f->arena), 2);
array_add(&args, expression); array_add(&args, expression);
array_add(&args, right); array_add(&args, right);
@@ -1880,7 +1880,7 @@ AstNodeArray parse_identfier_list(AstFile *f) {
AstNode *parse_type_attempt(AstFile *f) { AstNode *parse_type_attempt(AstFile *f) {
AstNode *type = parse_identifier_or_type(f); AstNode *type = parse_identifier_or_type(f, 0);
if (type != NULL) { if (type != NULL) {
// TODO(bill): Handle? // TODO(bill): Handle?
} }
@@ -1903,8 +1903,8 @@ Token parse_procedure_signature(AstFile *f,
AstNodeArray *params, AstNodeArray *results); AstNodeArray *params, AstNodeArray *results);
AstNode *parse_proc_type(AstFile *f) { AstNode *parse_proc_type(AstFile *f) {
AstNodeArray params = {}; AstNodeArray params = {0};
AstNodeArray results = {}; AstNodeArray results = {0};
Token proc_token = parse_procedure_signature(f, &params, &results); Token proc_token = parse_procedure_signature(f, &params, &results);
@@ -2237,7 +2237,7 @@ Token parse_procedure_signature(AstFile *f,
} }
AstNode *parse_body(AstFile *f) { AstNode *parse_body(AstFile *f) {
AstNodeArray stmts = {}; AstNodeArray stmts = {0};
Token open, close; Token open, close;
open = expect_token(f, Token_OpenBrace); open = expect_token(f, Token_OpenBrace);
stmts = parse_stmt_list(f); stmts = parse_stmt_list(f);
@@ -2249,16 +2249,16 @@ AstNode *parse_body(AstFile *f) {
AstNode *parse_proc_decl(AstFile *f, Token proc_token, AstNode *name) { AstNode *parse_proc_decl(AstFile *f, Token proc_token, AstNode *name) {
AstNodeArray params = {}; AstNodeArray params = {0};
AstNodeArray results = {}; AstNodeArray results = {0};
parse_procedure_signature(f, &params, &results); parse_procedure_signature(f, &params, &results);
AstNode *proc_type = make_proc_type(f, proc_token, params, results); AstNode *proc_type = make_proc_type(f, proc_token, params, results);
AstNode *body = NULL; AstNode *body = NULL;
u64 tags = 0; u64 tags = 0;
String foreign_name = {}; String foreign_name = {0};
String link_name = {}; String link_name = {0};
parse_proc_tags(f, &tags, &foreign_name, &link_name); parse_proc_tags(f, &tags, &foreign_name, &link_name);
@@ -2277,7 +2277,7 @@ AstNode *parse_proc_decl(AstFile *f, Token proc_token, AstNode *name) {
} }
AstNode *parse_decl(AstFile *f, AstNodeArray names) { AstNode *parse_decl(AstFile *f, AstNodeArray names) {
AstNodeArray values = {}; AstNodeArray values = {0};
AstNode *type = NULL; AstNode *type = NULL;
for_array(i, names) { for_array(i, names) {
@@ -2294,7 +2294,7 @@ AstNode *parse_decl(AstFile *f, AstNodeArray names) {
if (allow_token(f, Token_Colon)) { if (allow_token(f, Token_Colon)) {
if (!allow_token(f, Token_type)) { if (!allow_token(f, Token_type)) {
type = parse_identifier_or_type(f); type = parse_identifier_or_type(f, 0);
} }
} else if (f->curr_token.kind != Token_Eq && f->curr_token.kind != Token_Semicolon) { } else if (f->curr_token.kind != Token_Eq && f->curr_token.kind != Token_Semicolon) {
syntax_error(f->curr_token, "Expected type separator `:` or `=`"); syntax_error(f->curr_token, "Expected type separator `:` or `=`");
@@ -2756,7 +2756,7 @@ AstNode *parse_stmt(AstFile *f) {
return make_bad_decl(f, token, f->curr_token); return make_bad_decl(f, token, f->curr_token);
} else if (str_eq(tag, str_lit("import"))) { } else if (str_eq(tag, str_lit("import"))) {
// TODO(bill): better error messages // TODO(bill): better error messages
Token import_name = {}; Token import_name = {0};
Token file_path = expect_token_after(f, Token_String, "#import"); Token file_path = expect_token_after(f, Token_String, "#import");
if (allow_token(f, Token_as)) { if (allow_token(f, Token_as)) {
// NOTE(bill): Custom import name // NOTE(bill): Custom import name
@@ -2970,7 +2970,7 @@ bool try_add_import_path(Parser *p, String path, String rel_path, TokenPos pos)
} }
String get_fullpath_relative(gbAllocator a, String base_dir, String path) { String get_fullpath_relative(gbAllocator a, String base_dir, String path) {
String res = {}; String res = {0};
isize str_len = base_dir.len+path.len; isize str_len = base_dir.len+path.len;
u8 *str = gb_alloc_array(heap_allocator(), u8, str_len+1); u8 *str = gb_alloc_array(heap_allocator(), u8, str_len+1);
@@ -2986,7 +2986,7 @@ String get_fullpath_relative(gbAllocator a, String base_dir, String path) {
String get_fullpath_core(gbAllocator a, String path) { String get_fullpath_core(gbAllocator a, String path) {
String module_dir = get_module_dir(); String module_dir = get_module_dir();
String res = {}; String res = {0};
char core[] = "core/"; char core[] = "core/";
isize core_len = gb_size_of(core)-1; isize core_len = gb_size_of(core)-1;
@@ -3170,7 +3170,7 @@ void parse_file(Parser *p, AstFile *f) {
ParseFileError parse_files(Parser *p, char *init_filename) { ParseFileError parse_files(Parser *p, char *init_filename) {
char *fullpath_str = gb_path_get_full_name(heap_allocator(), init_filename); char *fullpath_str = gb_path_get_full_name(heap_allocator(), init_filename);
String init_fullpath = make_string_c(fullpath_str); String init_fullpath = make_string_c(fullpath_str);
TokenPos init_pos = {}; TokenPos init_pos = {0};
ImportedFile init_imported_file = {init_fullpath, init_fullpath, init_pos}; ImportedFile init_imported_file = {init_fullpath, init_fullpath, init_pos};
array_add(&p->imports, init_imported_file); array_add(&p->imports, init_imported_file);
p->init_fullpath = init_fullpath; p->init_fullpath = init_fullpath;
@@ -3191,7 +3191,7 @@ ParseFileError parse_files(Parser *p, char *init_filename) {
String import_path = imported_file.path; String import_path = imported_file.path;
String import_rel_path = imported_file.rel_path; String import_rel_path = imported_file.rel_path;
TokenPos pos = imported_file.pos; TokenPos pos = imported_file.pos;
AstFile file = {}; AstFile file = {0};
ParseFileError err = init_ast_file(&file, import_path); ParseFileError err = init_ast_file(&file, import_path);
if (err != ParseFile_None) { if (err != ParseFile_None) {
+26 -25
View File
@@ -191,7 +191,7 @@ struct ssaProcedure {
ssaValue *false_value; \ ssaValue *false_value; \
}) \ }) \
SSA_INSTR_KIND(Phi, struct { ssaValueArray edges; Type *type; }) \ SSA_INSTR_KIND(Phi, struct { ssaValueArray edges; Type *type; }) \
SSA_INSTR_KIND(Unreachable, struct {}) \ SSA_INSTR_KIND(Unreachable, i32) \
SSA_INSTR_KIND(BinaryOp, struct { \ SSA_INSTR_KIND(BinaryOp, struct { \
Type * type; \ Type * type; \
TokenKind op; \ TokenKind op; \
@@ -218,7 +218,7 @@ struct ssaProcedure {
i32 index_count; \ i32 index_count; \
Type * type; \ Type * type; \
}) \ }) \
SSA_INSTR_KIND(StartupRuntime, struct {}) \ SSA_INSTR_KIND(StartupRuntime, i32) \
SSA_INSTR_KIND(BoundsCheck, struct { \ SSA_INSTR_KIND(BoundsCheck, struct { \
TokenPos pos; \ TokenPos pos; \
ssaValue *index; \ ssaValue *index; \
@@ -1181,9 +1181,9 @@ ssaValue *ssa_add_global_string_array(ssaModule *m, String string) {
ssaValue *ssa_add_local(ssaProcedure *proc, Entity *e, bool zero_initialized = true) { ssaValue *ssa_add_local(ssaProcedure *proc, Entity *e) {
ssaBlock *b = proc->decl_block; // all variables must be in the first block ssaBlock *b = proc->decl_block; // all variables must be in the first block
ssaValue *instr = ssa_make_instr_local(proc, e, zero_initialized); ssaValue *instr = ssa_make_instr_local(proc, e, true);
instr->Instr.parent = b; instr->Instr.parent = b;
array_add(&b->instrs, instr); array_add(&b->instrs, instr);
array_add(&b->locals, instr); array_add(&b->locals, instr);
@@ -1201,7 +1201,7 @@ ssaValue *ssa_add_local_for_identifier(ssaProcedure *proc, AstNode *name, bool z
if (found) { if (found) {
Entity *e = *found; Entity *e = *found;
ssa_emit_comment(proc, e->token.string); ssa_emit_comment(proc, e->token.string);
return ssa_add_local(proc, e, zero_initialized); return ssa_add_local(proc, e);
} }
return NULL; return NULL;
} }
@@ -1217,7 +1217,7 @@ ssaValue *ssa_add_local_generated(ssaProcedure *proc, Type *type) {
scope, scope,
empty_token, empty_token,
type); type);
return ssa_add_local(proc, e, true); return ssa_add_local(proc, e);
} }
ssaValue *ssa_add_param(ssaProcedure *proc, Entity *e) { ssaValue *ssa_add_param(ssaProcedure *proc, Entity *e) {
@@ -1543,6 +1543,7 @@ ssaValue *ssa_emit_comp(ssaProcedure *proc, TokenKind op_kind, ssaValue *left, s
} }
ssaValue *ssa_emit_array_ep(ssaProcedure *proc, ssaValue *s, ssaValue *index) { ssaValue *ssa_emit_array_ep(ssaProcedure *proc, ssaValue *s, ssaValue *index) {
GB_ASSERT(index != NULL);
Type *st = base_type(type_deref(ssa_type(s))); Type *st = base_type(type_deref(ssa_type(s)));
GB_ASSERT(is_type_array(st) || is_type_vector(st)); GB_ASSERT(is_type_array(st) || is_type_vector(st));
@@ -1551,7 +1552,7 @@ ssaValue *ssa_emit_array_ep(ssaProcedure *proc, ssaValue *s, ssaValue *index) {
return ssa_emit(proc, ssa_make_instr_array_element_ptr(proc, s, index)); return ssa_emit(proc, ssa_make_instr_array_element_ptr(proc, s, index));
} }
ssaValue *ssa_emit_array_ep(ssaProcedure *proc, ssaValue *s, i32 index) { ssaValue *ssa_emit_array_epi(ssaProcedure *proc, ssaValue *s, i32 index) {
return ssa_emit_array_ep(proc, s, ssa_make_const_i32(proc->module->allocator, index)); return ssa_emit_array_ep(proc, s, ssa_make_const_i32(proc->module->allocator, index));
} }
@@ -1710,9 +1711,9 @@ ssaValue *ssa_emit_deep_field_gep(ssaProcedure *proc, Type *type, ssaValue *e, S
} else if (type->kind == Type_Slice) { } else if (type->kind == Type_Slice) {
e = ssa_emit_struct_ep(proc, e, index); e = ssa_emit_struct_ep(proc, e, index);
} else if (type->kind == Type_Vector) { } else if (type->kind == Type_Vector) {
e = ssa_emit_array_ep(proc, e, index); e = ssa_emit_array_epi(proc, e, index);
} else if (type->kind == Type_Array) { } else if (type->kind == Type_Array) {
e = ssa_emit_array_ep(proc, e, index); e = ssa_emit_array_epi(proc, e, index);
} else { } else {
GB_PANIC("un-gep-able type"); GB_PANIC("un-gep-able type");
} }
@@ -2404,7 +2405,7 @@ ssaValue *ssa_emit_logical_binary_expr(ssaProcedure *proc, AstNode *expr) {
return ssa_build_expr(proc, be->right); return ssa_build_expr(proc, be->right);
} }
ssaValueArray edges = {}; ssaValueArray edges = {0};
array_init_reserve(&edges, proc->module->allocator, done->preds.count+1); array_init_reserve(&edges, proc->module->allocator, done->preds.count+1);
for_array(i, done->preds) { for_array(i, done->preds) {
array_add(&edges, short_circuit); array_add(&edges, short_circuit);
@@ -2827,7 +2828,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
TokenPos pos = token.pos; TokenPos pos = token.pos;
gbString expr = expr_to_string(ce->args.e[0]); gbString expr = expr_to_string(ce->args.e[0]);
isize expr_len = gb_string_length(expr); isize expr_len = gb_string_length(expr);
String expr_str = {}; String expr_str = {0};
expr_str.text = cast(u8 *)gb_alloc_copy_align(proc->module->allocator, expr, expr_len, 1); expr_str.text = cast(u8 *)gb_alloc_copy_align(proc->module->allocator, expr, expr_len, 1);
expr_str.len = expr_len; expr_str.len = expr_len;
gb_string_free(expr); gb_string_free(expr);
@@ -3171,11 +3172,11 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
ssaValue *base_array = ssa_add_local_generated(proc, make_type_array(allocator, elem_type, slice_len)); ssaValue *base_array = ssa_add_local_generated(proc, make_type_array(allocator, elem_type, slice_len));
for (isize i = type->param_count-1, j = 0; i < arg_count; i++, j++) { for (isize i = type->param_count-1, j = 0; i < arg_count; i++, j++) {
ssaValue *addr = ssa_emit_array_ep(proc, base_array, j); ssaValue *addr = ssa_emit_array_epi(proc, base_array, j);
ssa_emit_store(proc, addr, args[i]); ssa_emit_store(proc, addr, args[i]);
} }
ssaValue *base_elem = ssa_emit_array_ep(proc, base_array, 0); ssaValue *base_elem = ssa_emit_array_epi(proc, base_array, 0);
ssaValue *slice_elem = ssa_emit_struct_ep(proc, slice, 0); ssaValue *slice_elem = ssa_emit_struct_ep(proc, slice, 0);
ssa_emit_store(proc, slice_elem, base_elem); ssa_emit_store(proc, slice_elem, base_elem);
ssaValue *len = ssa_make_const_int(allocator, slice_len); ssaValue *len = ssa_make_const_int(allocator, slice_len);
@@ -3268,7 +3269,7 @@ ssaAddr ssa_build_addr(ssaProcedure *proc, AstNode *expr) {
switch (expr->kind) { switch (expr->kind) {
case_ast_node(i, Ident, expr); case_ast_node(i, Ident, expr);
if (ssa_is_blank_ident(expr)) { if (ssa_is_blank_ident(expr)) {
ssaAddr val = {}; ssaAddr val = {0};
return val; return val;
} }
@@ -3677,7 +3678,7 @@ ssaAddr ssa_build_addr(ssaProcedure *proc, AstNode *expr) {
Type *t = ssa_type(field_expr); Type *t = ssa_type(field_expr);
GB_ASSERT(t->kind != Type_Tuple); GB_ASSERT(t->kind != Type_Tuple);
ssaValue *ev = ssa_emit_conv(proc, field_expr, et); ssaValue *ev = ssa_emit_conv(proc, field_expr, et);
ssaValue *gep = ssa_emit_array_ep(proc, v, i); ssaValue *gep = ssa_emit_array_epi(proc, v, i);
ssa_emit_store(proc, gep, ev); ssa_emit_store(proc, gep, ev);
} }
} }
@@ -4004,7 +4005,7 @@ void ssa_build_stmt_internal(ssaProcedure *proc, AstNode *node) {
for_array(i, as->lhs) { for_array(i, as->lhs) {
AstNode *lhs = as->lhs.e[i]; AstNode *lhs = as->lhs.e[i];
ssaAddr lval = {}; ssaAddr lval = {0};
if (!ssa_is_blank_ident(lhs)) { if (!ssa_is_blank_ident(lhs)) {
lval = ssa_build_addr(proc, lhs); lval = ssa_build_addr(proc, lhs);
} }
@@ -4233,7 +4234,7 @@ void ssa_build_stmt_internal(ssaProcedure *proc, AstNode *node) {
ast_node(body, BlockStmt, ms->body); ast_node(body, BlockStmt, ms->body);
AstNodeArray default_stmts = {}; AstNodeArray default_stmts = {0};
ssaBlock *default_fall = NULL; ssaBlock *default_fall = NULL;
ssaBlock *default_block = NULL; ssaBlock *default_block = NULL;
@@ -4336,7 +4337,7 @@ void ssa_build_stmt_internal(ssaProcedure *proc, AstNode *node) {
String tag_var_name = ms->var->Ident.string; String tag_var_name = ms->var->Ident.string;
AstNodeArray default_stmts = {}; AstNodeArray default_stmts = {0};
ssaBlock *default_block = NULL; ssaBlock *default_block = NULL;
@@ -4802,11 +4803,11 @@ String ssa_mangle_name(ssaGen *s, String path, String name) {
ssaValue *ssa_get_type_info_ptr(ssaProcedure *proc, ssaValue *type_info_data, Type *type) { ssaValue *ssa_get_type_info_ptr(ssaProcedure *proc, ssaValue *type_info_data, Type *type) {
i32 index = cast(i32)ssa_type_info_index(proc->module->info, type); i32 index = cast(i32)ssa_type_info_index(proc->module->info, type);
// gb_printf_err("%d %s\n", index, type_to_string(type)); // gb_printf_err("%d %s\n", index, type_to_string(type));
return ssa_emit_array_ep(proc, type_info_data, index); return ssa_emit_array_epi(proc, type_info_data, index);
} }
ssaValue *ssa_type_info_member_offset(ssaProcedure *proc, ssaValue *data, isize count, i32 *index) { ssaValue *ssa_type_info_member_offset(ssaProcedure *proc, ssaValue *data, isize count, i32 *index) {
ssaValue *offset = ssa_emit_array_ep(proc, data, *index); ssaValue *offset = ssa_emit_array_epi(proc, data, *index);
*index += count; *index += count;
return offset; return offset;
} }
@@ -4884,7 +4885,7 @@ void ssa_gen_tree(ssaGen *s) {
if (decl->var_decl_tags & VarDeclTag_thread_local) { if (decl->var_decl_tags & VarDeclTag_thread_local) {
g->Global.is_thread_local = true; g->Global.is_thread_local = true;
} }
ssaGlobalVariable var = {}; ssaGlobalVariable var = {0};
var.var = g; var.var = g;
var.decl = decl; var.decl = decl;
@@ -4977,7 +4978,7 @@ void ssa_gen_tree(ssaGen *s) {
NULL, 0, false); NULL, 0, false);
AstNode *body = gb_alloc_item(a, AstNode); AstNode *body = gb_alloc_item(a, AstNode);
ssaValue *p = ssa_make_value_procedure(a, m, NULL, proc_type, NULL, body, name); ssaValue *p = ssa_make_value_procedure(a, m, NULL, proc_type, NULL, body, name);
Token token = {}; Token token = {0};
token.string = name; token.string = name;
Entity *e = make_entity_procedure(a, NULL, token, proc_type); Entity *e = make_entity_procedure(a, NULL, token, proc_type);
@@ -5302,8 +5303,8 @@ void ssa_gen_tree(ssaGen *s) {
} }
for (isize i = 0; i < count; i++) { for (isize i = 0; i < count; i++) {
ssaValue *value_gep = ssa_emit_array_ep(proc, value_array, i); ssaValue *value_gep = ssa_emit_array_epi(proc, value_array, i);
ssaValue *name_gep = ssa_emit_array_ep(proc, name_array, i); ssaValue *name_gep = ssa_emit_array_epi(proc, name_array, i);
ssa_emit_store(proc, value_gep, ssa_make_const_i64(a, fields[i]->Constant.value.value_integer)); ssa_emit_store(proc, value_gep, ssa_make_const_i64(a, fields[i]->Constant.value.value_integer));
ssa_emit_store(proc, name_gep, ssa_make_const_string(a, fields[i]->token.string)); ssa_emit_store(proc, name_gep, ssa_make_const_string(a, fields[i]->token.string));
@@ -5391,7 +5392,7 @@ void ssa_gen_tree(ssaGen *s) {
} }
if (tag != NULL) { if (tag != NULL) {
ssaValue *gep = ssa_emit_array_ep(proc, type_info_data, entry_index); ssaValue *gep = ssa_emit_array_epi(proc, type_info_data, entry_index);
ssaValue *val = ssa_emit_conv(proc, ssa_emit_load(proc, tag), t_type_info); ssaValue *val = ssa_emit_conv(proc, ssa_emit_load(proc, tag), t_type_info);
ssa_emit_store(proc, gep, val); ssa_emit_store(proc, gep, val);
} }
+3 -3
View File
@@ -129,7 +129,7 @@ bool ssa_opt_block_has_phi(ssaBlock *b) {
ssaValueArray ssa_get_block_phi_nodes(ssaBlock *b) { ssaValueArray ssa_get_block_phi_nodes(ssaBlock *b) {
ssaValueArray phis = {}; ssaValueArray phis = {0};
for_array(i, b->instrs) { for_array(i, b->instrs) {
ssaInstr *instr = &b->instrs.e[i]->Instr; ssaInstr *instr = &b->instrs.e[i]->Instr;
if (instr->kind != ssaInstr_Phi) { if (instr->kind != ssaInstr_Phi) {
@@ -275,7 +275,7 @@ void ssa_opt_blocks(ssaProcedure *proc) {
void ssa_opt_build_referrers(ssaProcedure *proc) { void ssa_opt_build_referrers(ssaProcedure *proc) {
gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&proc->module->tmp_arena); gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&proc->module->tmp_arena);
ssaValueArray ops = {}; // NOTE(bill): Act as a buffer ssaValueArray ops = {0}; // NOTE(bill): Act as a buffer
array_init_reserve(&ops, proc->module->tmp_allocator, 64); // HACK(bill): This _could_ overflow the temp arena array_init_reserve(&ops, proc->module->tmp_allocator, 64); // HACK(bill): This _could_ overflow the temp arena
for_array(i, proc->blocks) { for_array(i, proc->blocks) {
ssaBlock *b = proc->blocks.e[i]; ssaBlock *b = proc->blocks.e[i];
@@ -375,7 +375,7 @@ void ssa_opt_build_dom_tree(ssaProcedure *proc) {
isize n = proc->blocks.count; isize n = proc->blocks.count;
ssaBlock **buf = gb_alloc_array(proc->module->tmp_allocator, ssaBlock *, 5*n); ssaBlock **buf = gb_alloc_array(proc->module->tmp_allocator, ssaBlock *, 5*n);
ssaLTState lt = {}; ssaLTState lt = {0};
lt.count = n; lt.count = n;
lt.sdom = &buf[0*n]; lt.sdom = &buf[0*n];
lt.parent = &buf[1*n]; lt.parent = &buf[1*n];
+3 -3
View File
@@ -39,7 +39,7 @@ void ssa_file_buffer_write(ssaFileBuffer *f, void *data, isize len) {
void ssa_fprintf(ssaFileBuffer *f, char *fmt, ...) { void ssa_fprintf(ssaFileBuffer *f, char *fmt, ...) {
va_list va; va_list va;
va_start(va, fmt); va_start(va, fmt);
char buf[4096] = {}; char buf[4096] = {0};
isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va); isize len = gb_snprintf_va(buf, gb_size_of(buf), fmt, va);
ssa_file_buffer_write(f, buf, len-1); ssa_file_buffer_write(f, buf, len-1);
va_end(va); va_end(va);
@@ -407,7 +407,7 @@ void ssa_print_exact_value(ssaFileBuffer *f, ssaModule *m, ExactValue value, Typ
} }
} break; } break;
case ExactValue_Pointer: case ExactValue_Pointer:
if (value.value_pointer == NULL) { if (value.value_pointer == 0) {
ssa_fprintf(f, "null"); ssa_fprintf(f, "null");
} else { } else {
ssa_fprintf(f, "inttoptr ("); ssa_fprintf(f, "inttoptr (");
@@ -1273,7 +1273,7 @@ void ssa_print_type_name(ssaFileBuffer *f, ssaModule *m, ssaValue *v) {
void ssa_print_llvm_ir(ssaGen *ssa) { void ssa_print_llvm_ir(ssaGen *ssa) {
ssaModule *m = &ssa->module; ssaModule *m = &ssa->module;
ssaFileBuffer buf = {}, *f = &buf; ssaFileBuffer buf = {0}, *f = &buf;
ssa_file_buffer_init(f, &ssa->output_file); ssa_file_buffer_init(f, &ssa->output_file);
if (m->layout.len > 0) { if (m->layout.len > 0) {
+1 -1
View File
@@ -44,7 +44,7 @@ u64 time_stamp__freq(void) {
} }
TimeStamp make_time_stamp(String label) { TimeStamp make_time_stamp(String label) {
TimeStamp ts = {}; TimeStamp ts = {0};
ts.start = time_stamp_time_now(); ts.start = time_stamp_time_now();
ts.label = label; ts.label = label;
return ts; return ts;
+4 -4
View File
@@ -373,7 +373,7 @@ TokenizerInitError init_tokenizer(Tokenizer *t, String fullpath) {
array_init(&t->allocated_strings, heap_allocator()); array_init(&t->allocated_strings, heap_allocator());
} else { } else {
gbFile f = {}; gbFile f = {0};
gbFileError file_err = gb_file_open(&f, c_str); gbFileError file_err = gb_file_open(&f, c_str);
switch (file_err) { switch (file_err) {
@@ -431,7 +431,7 @@ gb_inline void scan_mantissa(Tokenizer *t, i32 base) {
Token scan_number_to_token(Tokenizer *t, bool seen_decimal_point) { Token scan_number_to_token(Tokenizer *t, bool seen_decimal_point) {
Token token = {}; Token token = {0};
token.kind = Token_Integer; token.kind = Token_Integer;
token.string = make_string(t->curr, 1); token.string = make_string(t->curr, 1);
token.pos.file = t->fullpath; token.pos.file = t->fullpath;
@@ -609,7 +609,7 @@ gb_inline TokenKind token_kind_dub_eq(Tokenizer *t, Rune sing_rune, TokenKind si
} }
Token tokenizer_get_token(Tokenizer *t) { Token tokenizer_get_token(Tokenizer *t) {
Token token = {}; Token token = {0};
Rune curr_rune; Rune curr_rune;
tokenizer_skip_whitespace(t); tokenizer_skip_whitespace(t);
@@ -802,7 +802,7 @@ Token tokenizer_get_token(Tokenizer *t) {
default: default:
if (curr_rune != GB_RUNE_BOM) { if (curr_rune != GB_RUNE_BOM) {
u8 str[4] = {}; u8 str[4] = {0};
int len = cast(int)gb_utf8_encode_rune(str, curr_rune); int len = cast(int)gb_utf8_encode_rune(str, curr_rune);
tokenizer_err(t, "Illegal character: %.*s (%d) ", len, str, curr_rune); tokenizer_err(t, "Illegal character: %.*s (%d) ", len, str, curr_rune);
} }
+1 -1
View File
@@ -94,7 +94,7 @@ typedef unsigned int utf8proc_size_t;
# endif # endif
# ifndef __cplusplus # ifndef __cplusplus
typedef unsigned char utf8proc_bool; typedef unsigned char utf8proc_bool;
enum {false, true}; // enum {false, true};
# else # else
typedef bool utf8proc_bool; typedef bool utf8proc_bool;
# endif # endif