mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-07 08:08:50 +00:00
Remove the need for type->Map.internal_type and replace with the definition of runtime.Raw_Map
This commit is contained in:
@@ -1364,7 +1364,6 @@ bool is_polymorphic_type_assignable(CheckerContext *c, Type *poly, Type *source,
|
|||||||
bool key = is_polymorphic_type_assignable(c, poly->Map.key, source->Map.key, true, modify_type);
|
bool key = is_polymorphic_type_assignable(c, poly->Map.key, source->Map.key, true, modify_type);
|
||||||
bool value = is_polymorphic_type_assignable(c, poly->Map.value, source->Map.value, true, modify_type);
|
bool value = is_polymorphic_type_assignable(c, poly->Map.value, source->Map.value, true, modify_type);
|
||||||
if (key || value) {
|
if (key || value) {
|
||||||
poly->Map.internal_type = nullptr;
|
|
||||||
poly->Map.lookup_result_type = nullptr;
|
poly->Map.lookup_result_type = nullptr;
|
||||||
init_map_internal_types(poly);
|
init_map_internal_types(poly);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+2
-22
@@ -2198,34 +2198,14 @@ void map_cell_size_and_len(Type *type, i64 *size_, i64 *len_) {
|
|||||||
void init_map_internal_types(Type *type) {
|
void init_map_internal_types(Type *type) {
|
||||||
GB_ASSERT(type->kind == Type_Map);
|
GB_ASSERT(type->kind == Type_Map);
|
||||||
GB_ASSERT(t_allocator != nullptr);
|
GB_ASSERT(t_allocator != nullptr);
|
||||||
if (type->Map.internal_type != nullptr) return;
|
if (type->Map.lookup_result_type != nullptr) return;
|
||||||
|
|
||||||
Type *key = type->Map.key;
|
Type *key = type->Map.key;
|
||||||
Type *value = type->Map.value;
|
Type *value = type->Map.value;
|
||||||
GB_ASSERT(key != nullptr);
|
GB_ASSERT(key != nullptr);
|
||||||
GB_ASSERT(value != nullptr);
|
GB_ASSERT(value != nullptr);
|
||||||
|
|
||||||
Type *generated_struct_type = alloc_type_struct();
|
type->Map.lookup_result_type = make_optional_ok_type(value);
|
||||||
|
|
||||||
/*
|
|
||||||
struct {
|
|
||||||
data: uintptr,
|
|
||||||
size: uintptr,
|
|
||||||
allocator: runtime.Allocator,
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
Scope *s = create_scope(nullptr, builtin_pkg->scope);
|
|
||||||
|
|
||||||
auto fields = slice_make<Entity *>(permanent_allocator(), 3);
|
|
||||||
fields[0] = alloc_entity_field(s, make_token_ident(str_lit("data")), t_uintptr, false, 0, EntityState_Resolved);
|
|
||||||
fields[1] = alloc_entity_field(s, make_token_ident(str_lit("size")), t_uintptr, false, 1, EntityState_Resolved);
|
|
||||||
fields[2] = alloc_entity_field(s, make_token_ident(str_lit("allocator")), t_allocator, false, 2, EntityState_Resolved);
|
|
||||||
|
|
||||||
generated_struct_type->Struct.fields = fields;
|
|
||||||
type_set_offsets(generated_struct_type);
|
|
||||||
|
|
||||||
type->Map.internal_type = generated_struct_type;
|
|
||||||
type->Map.lookup_result_type = make_optional_ok_type(value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_map_key_type_dependencies(CheckerContext *ctx, Type *key) {
|
void add_map_key_type_dependencies(CheckerContext *ctx, Type *key) {
|
||||||
|
|||||||
+7
-4
@@ -1933,7 +1933,8 @@ void add_type_info_type_internal(CheckerContext *c, Type *t) {
|
|||||||
init_map_internal_types(bt);
|
init_map_internal_types(bt);
|
||||||
add_type_info_type_internal(c, bt->Map.key);
|
add_type_info_type_internal(c, bt->Map.key);
|
||||||
add_type_info_type_internal(c, bt->Map.value);
|
add_type_info_type_internal(c, bt->Map.value);
|
||||||
add_type_info_type_internal(c, bt->Map.internal_type);
|
add_type_info_type_internal(c, t_uintptr); // hash value
|
||||||
|
add_type_info_type_internal(c, t_allocator);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Type_Tuple:
|
case Type_Tuple:
|
||||||
@@ -2155,7 +2156,8 @@ void add_min_dep_type_info(Checker *c, Type *t) {
|
|||||||
init_map_internal_types(bt);
|
init_map_internal_types(bt);
|
||||||
add_min_dep_type_info(c, bt->Map.key);
|
add_min_dep_type_info(c, bt->Map.key);
|
||||||
add_min_dep_type_info(c, bt->Map.value);
|
add_min_dep_type_info(c, bt->Map.value);
|
||||||
add_min_dep_type_info(c, bt->Map.internal_type);
|
add_min_dep_type_info(c, t_uintptr); // hash value
|
||||||
|
add_min_dep_type_info(c, t_allocator);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Type_Tuple:
|
case Type_Tuple:
|
||||||
@@ -2845,9 +2847,10 @@ void init_core_map_type(Checker *c) {
|
|||||||
if (t_map_info != nullptr) {
|
if (t_map_info != nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
t_map_info = find_core_type(c, str_lit("Map_Info"));
|
|
||||||
t_map_cell_info = find_core_type(c, str_lit("Map_Cell_Info"));
|
|
||||||
init_mem_allocator(c);
|
init_mem_allocator(c);
|
||||||
|
t_map_info = find_core_type(c, str_lit("Map_Info"));
|
||||||
|
t_map_cell_info = find_core_type(c, str_lit("Map_Cell_Info"));
|
||||||
|
t_raw_map = find_core_type(c, str_lit("Raw_Map"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_preload(Checker *c) {
|
void init_preload(Checker *c) {
|
||||||
|
|||||||
@@ -671,7 +671,8 @@ void lb_debug_complete_types(lbModule *m) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Type_Map:
|
case Type_Map:
|
||||||
bt = bt->Map.internal_type;
|
GB_ASSERT(t_raw_map != nullptr);
|
||||||
|
bt = base_type(t_raw_map);
|
||||||
/*fallthrough*/
|
/*fallthrough*/
|
||||||
case Type_Struct:
|
case Type_Struct:
|
||||||
if (file == nullptr) {
|
if (file == nullptr) {
|
||||||
|
|||||||
@@ -1931,24 +1931,8 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
|
|||||||
|
|
||||||
case Type_Map:
|
case Type_Map:
|
||||||
init_map_internal_types(type);
|
init_map_internal_types(type);
|
||||||
{
|
GB_ASSERT(t_raw_map != nullptr);
|
||||||
Type *internal_type = type->Map.internal_type;
|
return lb_type_internal(m, t_raw_map);
|
||||||
GB_ASSERT(internal_type->kind == Type_Struct);
|
|
||||||
|
|
||||||
m->internal_type_level -= 1;
|
|
||||||
defer (m->internal_type_level += 1);
|
|
||||||
|
|
||||||
unsigned field_count = cast(unsigned)(internal_type->Struct.fields.count);
|
|
||||||
GB_ASSERT(field_count == 3);
|
|
||||||
|
|
||||||
LLVMTypeRef fields[3] = {
|
|
||||||
lb_type(m, t_uintptr), // data
|
|
||||||
lb_type(m, t_uintptr), // len
|
|
||||||
lb_type(m, t_allocator), // allocator
|
|
||||||
};
|
|
||||||
|
|
||||||
return LLVMStructTypeInContext(ctx, fields, field_count, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
case Type_Struct:
|
case Type_Struct:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -990,15 +990,13 @@ lbValue lb_emit_struct_ep(lbProcedure *p, lbValue s, i32 index) {
|
|||||||
}
|
}
|
||||||
} else if (is_type_map(t)) {
|
} else if (is_type_map(t)) {
|
||||||
init_map_internal_types(t);
|
init_map_internal_types(t);
|
||||||
Type *itp = alloc_type_pointer(t->Map.internal_type);
|
Type *itp = alloc_type_pointer(t_raw_map);
|
||||||
s = lb_emit_transmute(p, s, itp);
|
s = lb_emit_transmute(p, s, itp);
|
||||||
|
|
||||||
Type *gst = t->Map.internal_type;
|
|
||||||
GB_ASSERT(gst->kind == Type_Struct);
|
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case 0: result_type = get_struct_field_type(gst, 0); break;
|
case 0: result_type = get_struct_field_type(t_raw_map, 0); break;
|
||||||
case 1: result_type = get_struct_field_type(gst, 1); break;
|
case 1: result_type = get_struct_field_type(t_raw_map, 1); break;
|
||||||
case 2: result_type = get_struct_field_type(gst, 2); break;
|
case 2: result_type = get_struct_field_type(t_raw_map, 2); break;
|
||||||
}
|
}
|
||||||
} else if (is_type_array(t)) {
|
} else if (is_type_array(t)) {
|
||||||
return lb_emit_array_epi(p, s, index);
|
return lb_emit_array_epi(p, s, index);
|
||||||
@@ -1131,11 +1129,10 @@ lbValue lb_emit_struct_ev(lbProcedure *p, lbValue s, i32 index) {
|
|||||||
case Type_Map:
|
case Type_Map:
|
||||||
{
|
{
|
||||||
init_map_internal_types(t);
|
init_map_internal_types(t);
|
||||||
Type *gst = t->Map.internal_type;
|
|
||||||
switch (index) {
|
switch (index) {
|
||||||
case 0: result_type = get_struct_field_type(gst, 0); break;
|
case 0: result_type = get_struct_field_type(t_raw_map, 0); break;
|
||||||
case 1: result_type = get_struct_field_type(gst, 1); break;
|
case 1: result_type = get_struct_field_type(t_raw_map, 1); break;
|
||||||
case 2: result_type = get_struct_field_type(gst, 2); break;
|
case 2: result_type = get_struct_field_type(t_raw_map, 2); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
+1
-1
@@ -226,7 +226,6 @@ struct TypeProc {
|
|||||||
TYPE_KIND(Map, struct { \
|
TYPE_KIND(Map, struct { \
|
||||||
Type *key; \
|
Type *key; \
|
||||||
Type *value; \
|
Type *value; \
|
||||||
Type *internal_type; \
|
|
||||||
Type *lookup_result_type; \
|
Type *lookup_result_type; \
|
||||||
}) \
|
}) \
|
||||||
TYPE_KIND(Struct, TypeStruct) \
|
TYPE_KIND(Struct, TypeStruct) \
|
||||||
@@ -686,6 +685,7 @@ gb_global Type *t_source_code_location_ptr = nullptr;
|
|||||||
|
|
||||||
gb_global Type *t_map_info = nullptr;
|
gb_global Type *t_map_info = nullptr;
|
||||||
gb_global Type *t_map_cell_info = nullptr;
|
gb_global Type *t_map_cell_info = nullptr;
|
||||||
|
gb_global Type *t_raw_map = nullptr;
|
||||||
|
|
||||||
|
|
||||||
gb_global Type *t_equal_proc = nullptr;
|
gb_global Type *t_equal_proc = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user