diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-03-24 14:28:20 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-03-24 14:28:20 -0400 |
| commit | a29d2ed6d1735d4f12dd250900785db4271edeca (patch) | |
| tree | e4ffc6ada53bda059ea997d87f125efd7a392fdd /builtins/array.h | |
| parent | 20d75db79a2b74697d93f395e9d07f43f46e9c6b (diff) | |
Improve COW/etc handling for update assignments
Diffstat (limited to 'builtins/array.h')
| -rw-r--r-- | builtins/array.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/builtins/array.h b/builtins/array.h index 6375f6d4..df66e636 100644 --- a/builtins/array.h +++ b/builtins/array.h @@ -17,14 +17,16 @@ if (__builtin_expect($off < 0 || $off >= $arr.length, 0)) \ fail_source(filename, start, end, "Invalid array index: %r (array has length %ld)\n", Int__as_text(&$index, USE_COLOR, NULL), $arr.length); \ (item_type*)($arr.data + $arr.stride * $off);}) -#define $Array_set(item_type, arr_expr, index_expr, value_expr, typeinfo, filename, start, end) { \ +#define $Array_lvalue(item_type, arr_expr, index_expr, typeinfo, filename, start, end) { \ array_t *$arr = arr_expr; int64_t $index = (int64_t)(index_expr); \ int64_t $off = $index + ($index < 0) * ($arr->length + 1) - 1; \ if (__builtin_expect($off < 0 || $off >= $arr->length, 0)) \ fail_source(filename, start, end, "Invalid array index: %r (array has length %ld)\n", Int__as_text(&$index, USE_COLOR, NULL), $arr->length); \ if ($arr->data_refcount > 0) \ Array__compact($arr, typeinfo); \ - *(item_type*)($arr->data + $arr->stride * $off) = value_expr; } + *(item_type*)($arr->data + $arr->stride * $off); } +#define $Array_set(item_type, arr, index, value, typeinfo, filename, start, end) \ + $Array_lvalue(item_type, arr_expr, index, typeinfo, filename, start, end) = value #define $Array_get_unchecked(type, x, i) *({ const array_t $arr = x; int64_t $index = (int64_t)(i); \ int64_t $off = $index + ($index < 0) * ($arr.length + 1) - 1; \ (type*)($arr.data + $arr.stride * $off);}) |
