diff options
Diffstat (limited to 'src/types.cpp')
| -rw-r--r-- | src/types.cpp | 215 |
1 files changed, 148 insertions, 67 deletions
diff --git a/src/types.cpp b/src/types.cpp index c02bf7dd2..f4423ba69 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -177,6 +177,14 @@ struct TypeUnion { i64 count; \ Type *generic_count; \ }) \ + TYPE_KIND(EnumeratedArray, struct { \ + Type *elem; \ + Type *index; \ + ExactValue min_value; \ + ExactValue max_value; \ + i64 count; \ + TokenKind op; \ + }) \ TYPE_KIND(Slice, struct { Type *elem; }) \ TYPE_KIND(DynamicArray, struct { Type *elem; }) \ TYPE_KIND(Map, struct { \ @@ -197,6 +205,8 @@ struct TypeUnion { Type * base_type; \ ExactValue min_value; \ ExactValue max_value; \ + isize min_value_index; \ + isize max_value_index; \ }) \ TYPE_KIND(Tuple, struct { \ Array<Entity *> variables; /* Entity_Variable */ \ @@ -489,73 +499,75 @@ gb_global Type *t_string_slice = nullptr; // Type generated for the "preload" file -gb_global Type *t_type_info = nullptr; -gb_global Type *t_type_info_enum_value = nullptr; -gb_global Type *t_type_info_ptr = nullptr; -gb_global Type *t_type_info_enum_value_ptr = nullptr; - -gb_global Type *t_type_info_named = nullptr; -gb_global Type *t_type_info_integer = nullptr; -gb_global Type *t_type_info_rune = nullptr; -gb_global Type *t_type_info_float = nullptr; -gb_global Type *t_type_info_complex = nullptr; -gb_global Type *t_type_info_quaternion = nullptr; -gb_global Type *t_type_info_any = nullptr; -gb_global Type *t_type_info_typeid = nullptr; -gb_global Type *t_type_info_string = nullptr; -gb_global Type *t_type_info_boolean = nullptr; -gb_global Type *t_type_info_pointer = nullptr; -gb_global Type *t_type_info_procedure = nullptr; -gb_global Type *t_type_info_array = nullptr; -gb_global Type *t_type_info_dynamic_array = nullptr; -gb_global Type *t_type_info_slice = nullptr; -gb_global Type *t_type_info_tuple = nullptr; -gb_global Type *t_type_info_struct = nullptr; -gb_global Type *t_type_info_union = nullptr; -gb_global Type *t_type_info_enum = nullptr; -gb_global Type *t_type_info_map = nullptr; -gb_global Type *t_type_info_bit_field = nullptr; -gb_global Type *t_type_info_bit_set = nullptr; -gb_global Type *t_type_info_opaque = nullptr; -gb_global Type *t_type_info_simd_vector = nullptr; - -gb_global Type *t_type_info_named_ptr = nullptr; -gb_global Type *t_type_info_integer_ptr = nullptr; -gb_global Type *t_type_info_rune_ptr = nullptr; -gb_global Type *t_type_info_float_ptr = nullptr; -gb_global Type *t_type_info_complex_ptr = nullptr; -gb_global Type *t_type_info_quaternion_ptr = nullptr; -gb_global Type *t_type_info_any_ptr = nullptr; -gb_global Type *t_type_info_typeid_ptr = nullptr; -gb_global Type *t_type_info_string_ptr = nullptr; -gb_global Type *t_type_info_boolean_ptr = nullptr; -gb_global Type *t_type_info_pointer_ptr = nullptr; -gb_global Type *t_type_info_procedure_ptr = nullptr; -gb_global Type *t_type_info_array_ptr = nullptr; -gb_global Type *t_type_info_dynamic_array_ptr = nullptr; -gb_global Type *t_type_info_slice_ptr = nullptr; -gb_global Type *t_type_info_tuple_ptr = nullptr; -gb_global Type *t_type_info_struct_ptr = nullptr; -gb_global Type *t_type_info_union_ptr = nullptr; -gb_global Type *t_type_info_enum_ptr = nullptr; -gb_global Type *t_type_info_map_ptr = nullptr; -gb_global Type *t_type_info_bit_field_ptr = nullptr; -gb_global Type *t_type_info_bit_set_ptr = nullptr; -gb_global Type *t_type_info_opaque_ptr = nullptr; -gb_global Type *t_type_info_simd_vector_ptr = nullptr; - -gb_global Type *t_allocator = nullptr; -gb_global Type *t_allocator_ptr = nullptr; -gb_global Type *t_context = nullptr; -gb_global Type *t_context_ptr = nullptr; - -gb_global Type *t_source_code_location = nullptr; -gb_global Type *t_source_code_location_ptr = nullptr; - -gb_global Type *t_map_key = nullptr; -gb_global Type *t_map_header = nullptr; - -gb_global Type *t_vector_x86_mmx = nullptr; +gb_global Type *t_type_info = nullptr; +gb_global Type *t_type_info_enum_value = nullptr; +gb_global Type *t_type_info_ptr = nullptr; +gb_global Type *t_type_info_enum_value_ptr = nullptr; + +gb_global Type *t_type_info_named = nullptr; +gb_global Type *t_type_info_integer = nullptr; +gb_global Type *t_type_info_rune = nullptr; +gb_global Type *t_type_info_float = nullptr; +gb_global Type *t_type_info_complex = nullptr; +gb_global Type *t_type_info_quaternion = nullptr; +gb_global Type *t_type_info_any = nullptr; +gb_global Type *t_type_info_typeid = nullptr; +gb_global Type *t_type_info_string = nullptr; +gb_global Type *t_type_info_boolean = nullptr; +gb_global Type *t_type_info_pointer = nullptr; +gb_global Type *t_type_info_procedure = nullptr; +gb_global Type *t_type_info_array = nullptr; +gb_global Type *t_type_info_enumerated_array = nullptr; +gb_global Type *t_type_info_dynamic_array = nullptr; +gb_global Type *t_type_info_slice = nullptr; +gb_global Type *t_type_info_tuple = nullptr; +gb_global Type *t_type_info_struct = nullptr; +gb_global Type *t_type_info_union = nullptr; +gb_global Type *t_type_info_enum = nullptr; +gb_global Type *t_type_info_map = nullptr; +gb_global Type *t_type_info_bit_field = nullptr; +gb_global Type *t_type_info_bit_set = nullptr; +gb_global Type *t_type_info_opaque = nullptr; +gb_global Type *t_type_info_simd_vector = nullptr; + +gb_global Type *t_type_info_named_ptr = nullptr; +gb_global Type *t_type_info_integer_ptr = nullptr; +gb_global Type *t_type_info_rune_ptr = nullptr; +gb_global Type *t_type_info_float_ptr = nullptr; +gb_global Type *t_type_info_complex_ptr = nullptr; +gb_global Type *t_type_info_quaternion_ptr = nullptr; +gb_global Type *t_type_info_any_ptr = nullptr; +gb_global Type *t_type_info_typeid_ptr = nullptr; +gb_global Type *t_type_info_string_ptr = nullptr; +gb_global Type *t_type_info_boolean_ptr = nullptr; +gb_global Type *t_type_info_pointer_ptr = nullptr; +gb_global Type *t_type_info_procedure_ptr = nullptr; +gb_global Type *t_type_info_array_ptr = nullptr; +gb_global Type *t_type_info_enumerated_array_ptr = nullptr; +gb_global Type *t_type_info_dynamic_array_ptr = nullptr; +gb_global Type *t_type_info_slice_ptr = nullptr; +gb_global Type *t_type_info_tuple_ptr = nullptr; +gb_global Type *t_type_info_struct_ptr = nullptr; +gb_global Type *t_type_info_union_ptr = nullptr; +gb_global Type *t_type_info_enum_ptr = nullptr; +gb_global Type *t_type_info_map_ptr = nullptr; +gb_global Type *t_type_info_bit_field_ptr = nullptr; +gb_global Type *t_type_info_bit_set_ptr = nullptr; +gb_global Type *t_type_info_opaque_ptr = nullptr; +gb_global Type *t_type_info_simd_vector_ptr = nullptr; + +gb_global Type *t_allocator = nullptr; +gb_global Type *t_allocator_ptr = nullptr; +gb_global Type *t_context = nullptr; +gb_global Type *t_context_ptr = nullptr; + +gb_global Type *t_source_code_location = nullptr; +gb_global Type *t_source_code_location_ptr = nullptr; + +gb_global Type *t_map_key = nullptr; +gb_global Type *t_map_header = nullptr; + +gb_global Type *t_vector_x86_mmx = nullptr; @@ -702,6 +714,19 @@ Type *alloc_type_array(Type *elem, i64 count, Type *generic_count = nullptr) { return t; } +Type *alloc_type_enumerated_array(Type *elem, Type *index, ExactValue min_value, ExactValue max_value, TokenKind op) { + Type *t = alloc_type(Type_EnumeratedArray); + t->EnumeratedArray.elem = elem; + t->EnumeratedArray.index = index; + t->EnumeratedArray.min_value = min_value; + t->EnumeratedArray.max_value = max_value; + t->EnumeratedArray.op = op; + + t->EnumeratedArray.count = 1 + exact_value_to_i64(exact_value_sub(max_value, min_value)); + return t; +} + + Type *alloc_type_slice(Type *elem) { Type *t = alloc_type(Type_Slice); t->Array.elem = elem; @@ -1031,6 +1056,10 @@ bool is_type_array(Type *t) { t = base_type(t); return t->kind == Type_Array; } +bool is_type_enumerated_array(Type *t) { + t = base_type(t); + return t->kind == Type_EnumeratedArray; +} bool is_type_dynamic_array(Type *t) { t = base_type(t); return t->kind == Type_DynamicArray; @@ -1381,6 +1410,8 @@ bool is_type_indexable(Type *t) { case Type_DynamicArray: case Type_Map: return true; + case Type_EnumeratedArray: + return true; } return false; } @@ -1394,6 +1425,8 @@ bool is_type_sliceable(Type *t) { case Type_Slice: case Type_DynamicArray: return true; + case Type_EnumeratedArray: + return false; } return false; } @@ -1470,6 +1503,12 @@ bool is_type_polymorphic(Type *t, bool or_specialized=false) { return is_type_polymorphic(t->Opaque.elem, or_specialized); case Type_Pointer: return is_type_polymorphic(t->Pointer.elem, or_specialized); + + case Type_EnumeratedArray: + if (is_type_polymorphic(t->EnumeratedArray.index, or_specialized)) { + return true; + } + return is_type_polymorphic(t->EnumeratedArray.elem, or_specialized); case Type_Array: if (t->Array.generic_count != nullptr) { return true; @@ -1633,6 +1672,8 @@ bool is_type_comparable(Type *t) { return true; case Type_Enum: return is_type_comparable(core_type(t)); + case Type_EnumeratedArray: + return is_type_comparable(t->EnumeratedArray.elem); case Type_Array: return is_type_comparable(t->Array.elem); case Type_Proc: @@ -1695,6 +1736,13 @@ bool are_types_identical(Type *x, Type *y) { } break; + case Type_EnumeratedArray: + if (y->kind == Type_EnumeratedArray) { + return are_types_identical(x->EnumeratedArray.index, y->EnumeratedArray.index) && + are_types_identical(x->EnumeratedArray.elem, y->EnumeratedArray.elem); + } + break; + case Type_Array: if (y->kind == Type_Array) { return (x->Array.count == y->Array.count) && are_types_identical(x->Array.elem, y->Array.elem); @@ -2471,6 +2519,17 @@ i64 type_align_of_internal(Type *t, TypePath *path) { return align; } + case Type_EnumeratedArray: { + Type *elem = t->EnumeratedArray.elem; + bool pop = type_path_push(path, elem); + if (path->failure) { + return FAILURE_ALIGNMENT; + } + i64 align = type_align_of_internal(t->EnumeratedArray.elem, path); + if (pop) type_path_pop(path); + return align; + } + case Type_Opaque: return type_align_of_internal(t->Opaque.elem, path); @@ -2709,6 +2768,21 @@ i64 type_size_of_internal(Type *t, TypePath *path) { return alignment*(count-1) + size; } break; + case Type_EnumeratedArray: { + i64 count, align, size, alignment; + count = t->EnumeratedArray.count; + if (count == 0) { + return 0; + } + align = type_align_of_internal(t->EnumeratedArray.elem, path); + if (path->failure) { + return FAILURE_SIZE; + } + size = type_size_of_internal( t->EnumeratedArray.elem, path); + alignment = align_formula(size, align); + return alignment*(count-1) + size; + } break; + case Type_Slice: // ptr + len return 2 * build_context.word_size; @@ -2984,6 +3058,13 @@ gbString write_type_to_string(gbString str, Type *type) { str = write_type_to_string(str, type->Opaque.elem); break; + case Type_EnumeratedArray: + str = gb_string_append_rune(str, '['); + str = write_type_to_string(str, type->EnumeratedArray.index); + str = gb_string_append_rune(str, ']'); + str = write_type_to_string(str, type->EnumeratedArray.elem); + break; + case Type_Array: str = gb_string_appendc(str, gb_bprintf("[%d]", cast(int)type->Array.count)); str = write_type_to_string(str, type->Array.elem); |