diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-09-09 23:33:54 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-09-09 23:33:54 +0100 |
| commit | 6979678ff947cecc8e6e0d0e8ceea7e0304d3f4e (patch) | |
| tree | 774b9480272eba57e1a09011107cc136b43dde65 /src/checker/checker.cpp | |
| parent | 1ca752ce049b934df5d03af2f06265e219f5f402 (diff) | |
Begin reording of struct members by default.
Diffstat (limited to 'src/checker/checker.cpp')
| -rw-r--r-- | src/checker/checker.cpp | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/src/checker/checker.cpp b/src/checker/checker.cpp index 218f3517b..735ed827c 100644 --- a/src/checker/checker.cpp +++ b/src/checker/checker.cpp @@ -133,6 +133,10 @@ enum BuiltinProcId { BuiltinProc_offset_of, BuiltinProc_offset_of_val, BuiltinProc_type_of_val, + + BuiltinProc_type_info, + + BuiltinProc_compile_assert, BuiltinProc_assert, BuiltinProc_len, @@ -150,7 +154,6 @@ enum BuiltinProcId { BuiltinProc_max, BuiltinProc_abs, - BuiltinProc_type_info, BuiltinProc_Count, }; @@ -174,6 +177,10 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_Count] = { {STR_LIT("offset_of"), 2, false, Expr_Expr}, {STR_LIT("offset_of_val"), 1, false, Expr_Expr}, {STR_LIT("type_of_val"), 1, false, Expr_Expr}, + + {STR_LIT("type_info"), 1, false, Expr_Expr}, + + {STR_LIT("compile_assert"), 1, false, Expr_Stmt}, {STR_LIT("assert"), 1, false, Expr_Stmt}, {STR_LIT("len"), 1, false, Expr_Expr}, @@ -191,7 +198,6 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_Count] = { {STR_LIT("max"), 2, false, Expr_Expr}, {STR_LIT("abs"), 1, false, Expr_Expr}, - {STR_LIT("type_info"), 1, false, Expr_Expr}, }; struct CheckerContext { @@ -682,25 +688,26 @@ void add_type_info_type(Checker *c, Type *t) { return; } - isize found = -1; + isize ti_index = -1; gb_for_array(i, c->info.type_info_map.entries) { auto *e = &c->info.type_info_map.entries[i]; Type *prev_type = cast(Type *)cast(uintptr)e->key.key; if (are_types_identical(t, prev_type)) { - found = i; + // Duplicate entry + ti_index = i; break; } } - if (found >= 0) { - // Duplicate entry - map_set(&c->info.type_info_map, hash_pointer(t), found); - } else { + if (ti_index < 0) { // Unique entry - isize index = c->info.type_info_index; + // NOTE(bill): map entries grow linearly and in order + ti_index = c->info.type_info_index; c->info.type_info_index++; - map_set(&c->info.type_info_map, hash_pointer(t), index); } + map_set(&c->info.type_info_map, hash_pointer(t), ti_index); + + // Add nested types if (t->kind == Type_Named) { // NOTE(bill): Just in case @@ -716,6 +723,11 @@ void add_type_info_type(Checker *c, Type *t) { add_type_info_type(c, t_int); } } break; + + case Type_Pointer: + add_type_info_type(c, bt->Pointer.elem); + break; + case Type_Array: add_type_info_type(c, bt->Array.elem); add_type_info_type(c, make_type_pointer(c->allocator, bt->Array.elem)); @@ -726,8 +738,11 @@ void add_type_info_type(Checker *c, Type *t) { add_type_info_type(c, make_type_pointer(c->allocator, bt->Slice.elem)); add_type_info_type(c, t_int); break; - case Type_Vector: add_type_info_type(c, bt->Vector.elem); break; - case Type_Pointer: add_type_info_type(c, bt->Pointer.elem); break; + case Type_Vector: + add_type_info_type(c, bt->Vector.elem); + add_type_info_type(c, t_int); + break; + case Type_Record: { switch (bt->Record.kind) { case TypeRecord_Enum: @@ -741,9 +756,20 @@ void add_type_info_type(Checker *c, Type *t) { break; } } break; + + case Type_Tuple: + for (isize i = 0; i < bt->Tuple.variable_count; i++) { + Entity *var = bt->Tuple.variables[i]; + add_type_info_type(c, var->type); + } + break; + + case Type_Proc: + add_type_info_type(c, bt->Proc.params); + add_type_info_type(c, bt->Proc.results); + break; } - // TODO(bill): Type info for procedures and tuples - // TODO(bill): Remove duplicate identical types efficiently + } |