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;