aboutsummaryrefslogtreecommitdiff
path: root/builtins/array.h
diff options
context:
space:
mode:
Diffstat (limited to 'builtins/array.h')
-rw-r--r--builtins/array.h6
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);})