diff options
| author | gingerBill <bill@gingerbill.org> | 2022-08-11 14:30:14 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-08-11 14:30:14 +0100 |
| commit | a7c39060038f63b1840f6eb5c0750bdb47e7d3ea (patch) | |
| tree | 3ea12b5e4905ec2b571ce8b5564f50ea10c260b7 /src/types.cpp | |
| parent | 70dc0c15fd244bdc4a769b0d91b50ecc210bca65 (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.cpp | 51 |
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; |