summaryrefslogtreecommitdiff
path: root/uscript/val.c
diff options
context:
space:
mode:
authoriamcheeseman <[email protected]>2026-04-07 10:46:07 -0400
committeriamcheeseman <[email protected]>2026-04-07 10:46:07 -0400
commit6d30c64216cd4d0b1b2a20a167d85c7fc6534378 (patch)
tree67d0600f9be759c2c76b3e017b286354b57ab00a /uscript/val.c
parentd39f7a08461b64c7378f007761d51208c226f4a4 (diff)
microscript: add arrays
Diffstat (limited to 'uscript/val.c')
-rw-r--r--uscript/val.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/uscript/val.c b/uscript/val.c
index d713645..6b2fa9b 100644
--- a/uscript/val.c
+++ b/uscript/val.c
@@ -8,6 +8,7 @@
#define STR_NUM_FMT "%g"
#define STR_FUNC_FMT "<func %s: %p>"
+#define STR_ARR_FMT "<arr: %p>"
static
void init_obj(struct us_val val, struct us_obj *obj)
@@ -37,6 +38,14 @@ struct us_str *copy_str(const char *chars, int len)
return take_str(copy, len);
}
+struct us_arr *create_arr(void)
+{
+ struct us_arr *arr = mem_alloc(sizeof(struct us_arr));
+ arr->e = da_create(struct us_val, 0);
+ init_obj(wrap_arr(arr), &arr->header);
+ return arr;
+}
+
struct us_proto *create_proto(struct us_str *name)
{
struct us_proto *proto = mem_alloc(sizeof(struct us_proto));
@@ -78,6 +87,12 @@ void free_val(struct us_val v)
mem_free(str);
break;
}
+ case VAL_ARR: {
+ struct us_arr *arr = get_arr(v);
+ da_free(arr->e);
+ mem_free(arr);
+ break;
+ }
case VAL_PROTO: {
struct us_proto *proto = get_proto(v);
da_free(proto->bytecode);
@@ -123,6 +138,7 @@ bool vals_eql(struct us_val a, struct us_val b)
return a_str->len == b_str->len &&
memcmp(a_str->chars, b_str->chars, a_str->len) == 0;
}
+ case VAL_ARR:
case VAL_FUNC:
case VAL_UPVAL:
case VAL_PROTO: return get_obj(a) == get_obj(b);
@@ -171,6 +187,15 @@ char *val_to_str(struct us_val v, int *len_out)
*len_out = us_str->len;
return str;
}
+ case VAL_ARR: {
+ const struct us_arr *arr = get_arr(v);
+ int len = snprintf(NULL, 0, STR_ARR_FMT, (void*)arr);
+ char *str = mem_alloc(sizeof(char) * (len + 1));
+ snprintf(str, len + 1, STR_ARR_FMT, (void*)arr);
+ if (len_out)
+ *len_out = len;
+ return str;
+ }
case VAL_PROTO: {
const struct us_proto *proto = get_proto(v);
int len = snprintf(