diff options
| author | gingerBill <bill@gingerbill.org> | 2020-04-15 18:56:19 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-04-15 18:56:19 +0100 |
| commit | dbaf8568d6fb25ab2b46b01a44085c1ec034d108 (patch) | |
| tree | 4028fb2854690391f056624f6f6b8f4493a84218 | |
| parent | f229084baa383ebd81c5d04db1ede5dc71017904 (diff) | |
Fix `reflect.length`
| -rw-r--r-- | core/mem/alloc.odin | 4 | ||||
| -rw-r--r-- | core/reflect/reflect.odin | 20 |
2 files changed, 15 insertions, 9 deletions
diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index fda7862c3..dbabc2138 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -53,7 +53,9 @@ resize :: inline proc(ptr: rawptr, old_size, new_size: int, alignment: int = DEF return nil; } if new_size == 0 { - free(ptr, allocator, loc); + if ptr != nil { + allocator.procedure(allocator.data, Allocator_Mode.Free, 0, 0, ptr, 0, 0, loc); + } return nil; } else if ptr == nil { return allocator.procedure(allocator.data, Allocator_Mode.Alloc, new_size, alignment, nil, 0, 0, loc); diff --git a/core/reflect/reflect.odin b/core/reflect/reflect.odin index 9d4d5a205..a9c8746c6 100644 --- a/core/reflect/reflect.odin +++ b/core/reflect/reflect.odin @@ -222,9 +222,13 @@ is_nil :: proc(v: any) -> bool { length :: proc(val: any) -> int { if val == nil do return 0; - v := val; - v.id = runtime.typeid_base(v.id); - switch a in v { + #partial switch a in type_info_of(val.id).variant { + case Type_Info_Named: + return length({val.data, a.base.id}); + + case Type_Info_Pointer: + return length({val.data, a.elem.id}); + case Type_Info_Array: return a.count; @@ -232,19 +236,19 @@ length :: proc(val: any) -> int { return a.count; case Type_Info_Slice: - return (^mem.Raw_Slice)(v.data).len; + return (^mem.Raw_Slice)(val.data).len; case Type_Info_Dynamic_Array: - return (^mem.Raw_Dynamic_Array)(v.data).len; + return (^mem.Raw_Dynamic_Array)(val.data).len; case Type_Info_Map: - return (^mem.Raw_Map)(v.data).entries.len; + return (^mem.Raw_Map)(val.data).entries.len; case Type_Info_String: if a.is_cstring { - return len((^cstring)(v.data)^); + return len((^cstring)(val.data)^); } else { - return (^mem.Raw_String)(v.data).len; + return (^mem.Raw_String)(val.data).len; } } return 0; |