aboutsummaryrefslogtreecommitdiff
path: root/src/types.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-08-11 14:30:14 +0100
committergingerBill <bill@gingerbill.org>2022-08-11 14:30:14 +0100
commita7c39060038f63b1840f6eb5c0750bdb47e7d3ea (patch)
tree3ea12b5e4905ec2b571ce8b5564f50ea10c260b7 /src/types.cpp
parent70dc0c15fd244bdc4a769b0d91b50ecc210bca65 (diff)
`#load(path, type)`
where `type` can be `string` or `[]T` where `T` is a simple type
Diffstat (limited to 'src/types.cpp')
-rw-r--r--src/types.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/types.cpp b/src/types.cpp
index cba27fd6f..1f4804430 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -2398,6 +2398,57 @@ bool is_type_simple_compare(Type *t) {
return false;
}
+bool is_type_load_safe(Type *type) {
+ GB_ASSERT(type != nullptr);
+ type = core_type(core_array_type(type));
+ switch (type->kind) {
+ case Type_Basic:
+ return (type->Basic.flags & (BasicFlag_Boolean|BasicFlag_Numeric|BasicFlag_Rune)) != 0;
+
+ case Type_BitSet:
+ if (type->BitSet.underlying) {
+ return is_type_load_safe(type->BitSet.underlying);
+ }
+ return true;
+
+ case Type_RelativePointer:
+ case Type_RelativeSlice:
+ return true;
+
+ case Type_Pointer:
+ case Type_MultiPointer:
+ case Type_Slice:
+ case Type_DynamicArray:
+ case Type_Proc:
+ case Type_SoaPointer:
+ return false;
+
+ case Type_Enum:
+ case Type_EnumeratedArray:
+ case Type_Array:
+ case Type_SimdVector:
+ case Type_Matrix:
+ GB_PANIC("should never be hit");
+ return false;
+
+ case Type_Struct:
+ for_array(i, type->Struct.fields) {
+ if (!is_type_load_safe(type->Struct.fields[i]->type)) {
+ return false;
+ }
+ }
+ return type_size_of(type) > 0;
+ case Type_Union:
+ for_array(i, type->Union.variants) {
+ if (!is_type_load_safe(type->Union.variants[i])) {
+ return false;
+ }
+ }
+ return type_size_of(type) > 0;
+ }
+ return false;
+}
+
String lookup_subtype_polymorphic_field(Type *dst, Type *src) {
Type *prev_src = src;
// Type *prev_dst = dst;