aboutsummaryrefslogtreecommitdiff
path: root/core/runtime
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-09-26 13:42:53 +0100
committergingerBill <bill@gingerbill.org>2021-09-26 13:42:53 +0100
commitedbf2bf56f9c3cac0b996ca9f4fdccfe80637929 (patch)
treea3f955a4920cdb1f8e01e02d80457649d6623473 /core/runtime
parent93f97defb9da85faa630a1302d7b6e059e2bf500 (diff)
Correct `append_soa` for `#soa[dynamic][N]T`
Diffstat (limited to 'core/runtime')
-rw-r--r--core/runtime/core_builtin_soa.odin21
1 files changed, 18 insertions, 3 deletions
diff --git a/core/runtime/core_builtin_soa.odin b/core/runtime/core_builtin_soa.odin
index 6b6e78e5e..077027a9a 100644
--- a/core/runtime/core_builtin_soa.odin
+++ b/core/runtime/core_builtin_soa.odin
@@ -62,7 +62,12 @@ raw_soa_footer_dynamic_array :: proc(array: ^$T/#soa[dynamic]$E) -> (footer: ^Ra
if array == nil {
return nil
}
- field_count := uintptr(intrinsics.type_struct_field_count(E))
+ field_count: uintptr
+ when intrinsics.type_is_array(E) {
+ field_count = len(E)
+ } else {
+ field_count = uintptr(intrinsics.type_struct_field_count(E))
+ }
footer = (^Raw_SOA_Footer_Dynamic_Array)(uintptr(array) + field_count*size_of(rawptr))
return
}
@@ -209,7 +214,12 @@ reserve_soa :: proc(array: ^$T/#soa[dynamic]$E, capacity: int, loc := #caller_lo
ti = type_info_base(ti)
si := &ti.variant.(Type_Info_Struct)
- field_count := uintptr(intrinsics.type_struct_field_count(E))
+ field_count: uintptr
+ when intrinsics.type_is_array(E) {
+ field_count = len(E)
+ } else {
+ field_count = uintptr(intrinsics.type_struct_field_count(E))
+ }
assert(footer.cap == old_cap)
old_size := 0
@@ -287,7 +297,12 @@ append_soa_elem :: proc(array: ^$T/#soa[dynamic]$E, arg: E, loc := #caller_locat
ti := type_info_of(typeid_of(T))
ti = type_info_base(ti)
si := &ti.variant.(Type_Info_Struct)
- field_count := uintptr(intrinsics.type_struct_field_count(E))
+ field_count: uintptr
+ when intrinsics.type_is_array(E) {
+ field_count = len(E)
+ } else {
+ field_count = uintptr(intrinsics.type_struct_field_count(E))
+ }
data := (^rawptr)(array)^