aboutsummaryrefslogtreecommitdiff
path: root/src/check_type.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-02-12 12:29:37 +0000
committergingerBill <bill@gingerbill.org>2024-02-12 12:29:37 +0000
commitc291fffce1972fcfc631dd4c6f623e3f5055f74b (patch)
tree25431e224aabafc185f1ae0167c84020b51de2a0 /src/check_type.cpp
parent900fe95ba0b54dcc83ad2dbb2f16df8482135c61 (diff)
Add metadata type to `map`s debug information to aid debuggers knowing what is in it it
Diffstat (limited to 'src/check_type.cpp')
-rw-r--r--src/check_type.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index d216ae3e6..5c70500d1 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -2265,6 +2265,35 @@ gb_internal void init_map_internal_types(Type *type) {
GB_ASSERT(key != nullptr);
GB_ASSERT(value != nullptr);
+ Scope *metadata_scope = create_scope(nullptr, nullptr);
+
+ Type *metadata_type = alloc_type_struct();
+ metadata_type->Struct.fields = slice_make<Entity *>(permanent_allocator(), 3);
+ metadata_type->Struct.fields[0] = alloc_entity_field(metadata_scope, make_token_ident("key"), key, false, 0, EntityState_Resolved);
+ metadata_type->Struct.fields[1] = alloc_entity_field(metadata_scope, make_token_ident("value"), value, false, 1, EntityState_Resolved);
+ metadata_type->Struct.fields[2] = alloc_entity_field(metadata_scope, make_token_ident("hash"), t_uintptr, false, 2, EntityState_Resolved);
+ metadata_type->Struct.scope = metadata_scope;
+
+ gb_unused(type_size_of(metadata_type));
+
+ // NOTE(bill): [0]^struct{key: Key, value: Value, hash: uintptr}
+ // This is a zero array to a pointer to keep the alignment to that of a pointer, and not effective the size of the final struct
+ metadata_type = alloc_type_array(alloc_type_pointer(metadata_type), 0);;
+
+
+ Scope *scope = create_scope(nullptr, nullptr);
+ Type *debug_type = alloc_type_struct();
+ debug_type->Struct.fields = slice_make<Entity *>(permanent_allocator(), 4);
+ debug_type->Struct.fields[0] = alloc_entity_field(scope, make_token_ident("data"), t_uintptr, false, 0, EntityState_Resolved);
+ debug_type->Struct.fields[1] = alloc_entity_field(scope, make_token_ident("len"), t_int, false, 1, EntityState_Resolved);
+ debug_type->Struct.fields[2] = alloc_entity_field(scope, make_token_ident("allocator"), t_allocator, false, 2, EntityState_Resolved);
+ debug_type->Struct.fields[3] = alloc_entity_field(scope, make_token_ident("__metadata"), metadata_type, false, 3, EntityState_Resolved);
+ debug_type->Struct.scope = scope;
+
+ gb_unused(type_size_of(debug_type));
+
+ type->Map.debug_metadata_type = debug_type;
+
type->Map.lookup_result_type = make_optional_ok_type(value);
}