Browse Source

Fix `reflect.length`

gingerBill 5 years ago
parent
commit
dbaf8568d6
2 changed files with 15 additions and 9 deletions
  1. 3 1
      core/mem/alloc.odin
  2. 12 8
      core/reflect/reflect.odin

+ 3 - 1
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);

+ 12 - 8
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;