aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-04-15 18:56:19 +0100
committergingerBill <bill@gingerbill.org>2020-04-15 18:56:19 +0100
commitdbaf8568d6fb25ab2b46b01a44085c1ec034d108 (patch)
tree4028fb2854690391f056624f6f6b8f4493a84218
parentf229084baa383ebd81c5d04db1ede5dc71017904 (diff)
Fix `reflect.length`
-rw-r--r--core/mem/alloc.odin4
-rw-r--r--core/reflect/reflect.odin20
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;