diff options
| author | gingerBill <bill@gingerbill.org> | 2020-10-02 11:04:17 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-10-02 11:04:17 +0100 |
| commit | 8f28312705781ef6a4ecc3a818c39bbf663e3733 (patch) | |
| tree | 609ed058ad9416977b69a8b21367ae4c0181eefe | |
| parent | 3a4f0d85a615111f3ceabd6e17b820337bf4198f (diff) | |
Fix `pop` behaviour, and improve assert messages by using `#caller_location`
| -rw-r--r-- | core/runtime/core.odin | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 6bbebae9b..15bd66930 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -599,31 +599,28 @@ remove_range :: proc(array: ^$D/[dynamic]$T, lo, hi: int, loc := #caller_locatio @builtin -pop :: proc(array: ^$T/[dynamic]$E) -> E { - if len(array) == 0 { - return E{}; - } - assert(len(array) > 0); - res := #no_bounds_check array[len(array)-1]; +pop :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { + assert(len(array) > 0, "", loc); + res = array[len(array)-1]; (^Raw_Dynamic_Array)(array).len -= 1; return res; } @builtin -pop_safe :: proc(array: ^$T/[dynamic]$E) -> (E, bool) { +pop_safe :: proc(array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { if len(array) == 0 { - return E{}, false; + return; } - res := #no_bounds_check array[len(array)-1]; + res, ok = array[len(array)-1], true; (^Raw_Dynamic_Array)(array).len -= 1; - return res, true; + return; } @builtin -pop_front :: proc(array: ^$T/[dynamic]$E) -> E #no_bounds_check { - assert(len(array) > 0); - res := array[0]; +pop_front :: proc(array: ^$T/[dynamic]$E, loc := #caller_location) -> (res: E) #no_bounds_check { + assert(len(array) > 0, "", loc); + res = array[0]; if len(array) > 1 { copy(array[0:], array[1:]); } @@ -632,16 +629,16 @@ pop_front :: proc(array: ^$T/[dynamic]$E) -> E #no_bounds_check { } @builtin -pop_front_safe :: proc(array: ^$T/[dynamic]$E) -> (E, bool) #no_bounds_check { +pop_front_safe :: proc(array: ^$T/[dynamic]$E) -> (res: E, ok: bool) #no_bounds_check { if len(array) == 0 { - return E{}, false; + return; } - res := array[0]; + res, ok = array[0], true; if len(array) > 1 { copy(array[0:], array[1:]); } (^Raw_Dynamic_Array)(array).len -= 1; - return res, true; + return; } |