aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-08-02 11:13:53 +0100
committergingerBill <bill@gingerbill.org>2022-08-02 11:13:53 +0100
commite0ecdd4b24896d907b337d60ae1f929357dff956 (patch)
tree30c62722570639af61dd5fe93877803bdb4b00a0
parent5168cf03a9c321de464c2709a37607ea9c1edbe8 (diff)
Simplify logic of `append` of zero sized elements
-rw-r--r--core/runtime/core_builtin.odin56
1 files changed, 31 insertions, 25 deletions
diff --git a/core/runtime/core_builtin.odin b/core/runtime/core_builtin.odin
index 4f698a270..e9fc2a91e 100644
--- a/core/runtime/core_builtin.odin
+++ b/core/runtime/core_builtin.odin
@@ -339,19 +339,22 @@ append_elem :: proc(array: ^$T/[dynamic]$E, arg: E, loc := #caller_location) {
if array == nil {
return
}
-
- if cap(array) < len(array)+1 {
- cap := 2 * cap(array) + max(8, 1)
- _ = reserve(array, cap, loc)
- }
- if cap(array)-len(array) > 0 {
- a := (^Raw_Dynamic_Array)(array)
- when size_of(E) != 0 {
- data := ([^]E)(a.data)
- assert(condition=data != nil, loc=loc)
- data[a.len] = arg
- }
+ when size_of(E) == 0 {
a.len += 1
+ } else {
+ if cap(array) < len(array)+1 {
+ cap := 2 * cap(array) + max(8, 1)
+ _ = reserve(array, cap, loc)
+ }
+ if cap(array)-len(array) > 0 {
+ a := (^Raw_Dynamic_Array)(array)
+ when size_of(E) != 0 {
+ data := ([^]E)(a.data)
+ assert(condition=data != nil, loc=loc)
+ data[a.len] = arg
+ }
+ a.len += 1
+ }
}
}
@@ -366,20 +369,23 @@ append_elems :: proc(array: ^$T/[dynamic]$E, args: ..E, loc := #caller_location)
return
}
-
- if cap(array) < len(array)+arg_len {
- cap := 2 * cap(array) + max(8, arg_len)
- _ = reserve(array, cap, loc)
- }
- arg_len = min(cap(array)-len(array), arg_len)
- if arg_len > 0 {
- a := (^Raw_Dynamic_Array)(array)
- when size_of(E) != 0 {
- data := ([^]E)(a.data)
- assert(condition=data != nil, loc=loc)
- intrinsics.mem_copy(&data[a.len], raw_data(args), size_of(E) * arg_len)
- }
+ when size_of(E) == 0 {
a.len += arg_len
+ } else {
+ if cap(array) < len(array)+arg_len {
+ cap := 2 * cap(array) + max(8, arg_len)
+ _ = reserve(array, cap, loc)
+ }
+ arg_len = min(cap(array)-len(array), arg_len)
+ if arg_len > 0 {
+ a := (^Raw_Dynamic_Array)(array)
+ when size_of(E) != 0 {
+ data := ([^]E)(a.data)
+ assert(condition=data != nil, loc=loc)
+ intrinsics.mem_copy(&data[a.len], raw_data(args), size_of(E) * arg_len)
+ }
+ a.len += arg_len
+ }
}
}