aboutsummaryrefslogtreecommitdiff
path: root/src/types.c
diff options
context:
space:
mode:
authorzhiayang <zhiayang@gmail.com>2017-02-02 04:21:42 +0800
committerzhiayang <zhiayang@gmail.com>2017-02-02 04:21:42 +0800
commit5516e80ab775d1100beca7847e10520eae4b151c (patch)
treefd080deab099e74ec5f50841c6a8b5b5b8b5c3c4 /src/types.c
parent864310e3da059371ac7345ee3bf900a6055f26b4 (diff)
parent4e7082a68dd5261c3c36eccf92a62a0ce84995a8 (diff)
Merge branch 'master' of https://github.com/zhiayang/Odin
Diffstat (limited to 'src/types.c')
-rw-r--r--src/types.c60
1 files changed, 50 insertions, 10 deletions
diff --git a/src/types.c b/src/types.c
index 870dc6cf4..b3e96eb79 100644
--- a/src/types.c
+++ b/src/types.c
@@ -166,6 +166,7 @@ typedef struct BaseTypeSizes {
i64 max_align;
} BaseTypeSizes;
+
typedef Array(isize) Array_isize;
typedef struct Selection {
@@ -263,6 +264,7 @@ gb_global Type *t_int_ptr = NULL;
gb_global Type *t_i64_ptr = NULL;
gb_global Type *t_f64_ptr = NULL;
+
gb_global Type *t_type_info = NULL;
gb_global Type *t_type_info_member = NULL;
gb_global Type *t_type_info_enum_value = NULL;
@@ -892,6 +894,9 @@ bool is_type_cte_safe(Type *type) {
case Type_Array:
return is_type_cte_safe(type->Array.elem);
+ case Type_DynamicArray:
+ return false;
+
case Type_Vector: // NOTE(bill): This should always to be true but this is for sanity reasons
return is_type_cte_safe(type->Vector.elem);
@@ -1745,20 +1750,26 @@ i64 type_offset_of(BaseTypeSizes s, gbAllocator allocator, Type *t, isize index)
} else if (t->kind == Type_Basic) {
if (t->Basic.kind == Basic_string) {
switch (index) {
- case 0: return 0;
- case 1: return s.word_size;
+ case 0: return 0; // data
+ case 1: return s.word_size; // count
}
} else if (t->Basic.kind == Basic_any) {
switch (index) {
- case 0: return 0;
- case 1: return s.word_size;
+ case 0: return 0; // type_info
+ case 1: return s.word_size; // data
}
}
} else if (t->kind == Type_Slice) {
switch (index) {
- case 0: return 0;
- case 1: return 1*s.word_size;
- case 2: return 2*s.word_size;
+ case 0: return 0; // data
+ case 1: return 1*s.word_size; // count
+ }
+ } else if (t->kind == Type_DynamicArray) {
+ switch (index) {
+ case 0: return 0; // data
+ case 1: return 1*s.word_size; // count
+ case 2: return 2*s.word_size; // capacity
+ case 3: return 3*s.word_size; // allocator
}
}
return 0;
@@ -1777,7 +1788,36 @@ i64 type_offset_of_from_selection(BaseTypeSizes s, gbAllocator allocator, Type *
if (t->kind == Type_Record && t->Record.kind == TypeRecord_Struct) {
t = t->Record.fields[index]->type;
} else {
- // NOTE(bill): string/any/slices don't have record fields so this case doesn't need to be handled
+ // NOTE(bill): No need to worry about custom types, just need the alignment
+ switch (t->kind) {
+ case Type_Basic:
+ if (t->Basic.kind == Basic_string) {
+ switch (index) {
+ case 0: t = t_rawptr; break;
+ case 1: t = t_int; break;
+ }
+ } else if (t->Basic.kind == Basic_any) {
+ switch (index) {
+ case 0: t = t_type_info_ptr; break;
+ case 1: t = t_rawptr; break;
+ }
+ }
+ break;
+ case Type_DynamicArray:
+ switch (index) {
+ case 0: t = t_rawptr; break;
+ case 1: t = t_int; break;
+ case 2: t = t_int; break;
+ case 3: t = t_allocator; break;
+ }
+ break;
+ case Type_Slice:
+ switch (index) {
+ case 0: t = t_rawptr; break;
+ case 1: t = t_int; break;
+ }
+ break;
+ }
}
}
return offset;
@@ -1806,12 +1846,12 @@ gbString write_type_to_string(gbString str, Type *type) {
break;
case Type_Array:
- str = gb_string_appendc(str, gb_bprintf("[%td]", type->Array.count));
+ str = gb_string_appendc(str, gb_bprintf("[%lld]", type->Array.count));
str = write_type_to_string(str, type->Array.elem);
break;
case Type_Vector:
- str = gb_string_appendc(str, gb_bprintf("[vector %td]", type->Vector.count));
+ str = gb_string_appendc(str, gb_bprintf("[vector %lld]", type->Vector.count));
str = write_type_to_string(str, type->Vector.elem);
break;