Fix reflect.length

This commit is contained in:
gingerBill
2020-04-15 18:56:19 +01:00
parent f229084baa
commit dbaf8568d6
2 changed files with 15 additions and 9 deletions

View File

@@ -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);

View File

@@ -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;