From d501e0294c9a7a1fbbfad8e51e3419b2048bb98e Mon Sep 17 00:00:00 2001 From: Axy Date: Mon, 4 May 2026 03:22:04 +0200 Subject: [PATCH] Arc make unique among others --- .gitignore | 2 + Makefile | 15 +++++--- a.out | Bin 25184 -> 0 bytes src/arc.c | 4 +- src/ccera.h | 79 ++++++++++++++++++++++---------------- src/eval.c | 32 ++++++++++++++++ src/value_destroy.c | 41 ++++++++++++++++++++ src/value_get.c | 18 ++------- src/value_lifetime.c | 88 +++++++++++++++++++++++++++++++++++++++++++ src/value_new.c | 37 ++++++++---------- test.c | 12 +++++- 11 files changed, 249 insertions(+), 79 deletions(-) delete mode 100755 a.out create mode 100644 src/eval.c create mode 100644 src/value_destroy.c create mode 100644 src/value_lifetime.c diff --git a/.gitignore b/.gitignore index c181c9d..e6c1414 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .build *.a .norm +a.out +a.out diff --git a/Makefile b/Makefile index 2ab5fa8..7c584c5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ NAME=ccera.a -SRCS=src/arc.c src/value_get.c src/value_new.c +SRCS=src/arc.c src/eval.c src/value_destroy.c src/value_get.c src/value_lifetime.c src/value_new.c HEADERS=src/ccera.h @@ -10,22 +10,25 @@ THIS=Makefile OBJS=${SRCS:src/%.c=${BUILDDIR}/%.o} -CFLAGS=-Wall -Wextra -Werror -g -pthread -O3 +CFLAGS=-Wall -Wextra -Werror -g -pthread -flto -ffat-lto-objects +#CFLAGS=-Wall -Wextra -Werror -g -pthread -O3 -flto -ffat-lto-objects -CC=cc +CC=gcc + +AR=ar MAKEFLAGS += --no-print-directory all : ${NAME} -${BUILDDIR}/%.o : src/%.c ${HEADERS} | ${BUILDDIR} +${BUILDDIR}/%.o : src/%.c ${HEADERS} ${THIS} | ${BUILDDIR} ${CC} ${CFLAGS} -c -o $@ $< ${BUILDDIR} : mkdir ${BUILDDIR} -${NAME} : ${OBJS} - ar rcs $@ $^ +${NAME} : ${OBJS} ${THIS} + ${AR} rcs $@ ${OBJS} clean : rm -f ${OBJS} diff --git a/a.out b/a.out deleted file mode 100755 index 96b966188a30754903aff391899c5e8dde0f9491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25184 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

w!V- zc90ZEKPb%5^@9%41%(M{S{S4bwvHM`gVGmR97=%9fil4qXmuL0eg$Yh21bJ>y1@#e z1XLPkJOgNb1G4@FPz5j==3c0FXg3bDco8B3S_OryAJ(pd(So3WhbRS;=xy{SP#*x) z%?Haez}w5Pb~9`}IaC^cJ~WIET9E~^9~OV;=V!y>AEqANKcIzR$ogUZ6BrFz0SMCz zqS3=2w2ly2{|%@IVYCa}VIbXzaD(s|7(nR*)E0y(!*#AUOg*~$LH#^r{jh#7jD|V~ zrX3^vPJ&kOLh~?45p114>^y69`(S(+4Vtv!N7BCol%YZE`9TE>Xz?(}P$Ue~2csWC z;~uh5ngQN#gq=^$01X&eGJ@%YCQ}B`DpgSU!}UX#R2~3L3o=0VC?i>qk$zu6(;rMf ztRMOUsvmWf4-tPbcYH?E59?=IKocI!oiI1R^uhQ)p0$C0%!=kGNt)>KtL7fXXILZye z1T6xBuplHzEr +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/29 16:40:27 by agilliar #+# #+# */ -/* Updated: 2026/04/30 15:04:33 by agilliar ### ########.fr */ +/* Updated: 2026/05/04 02:01:19 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,7 +37,7 @@ t_arc arc_copy(t_arc arc) return (NULL); } -void arc_destroy(t_arc arc, void (*destructor)(void *)) +void arc_destroy(t_arc arc, t_drop destructor) { if (!arc) return ; diff --git a/src/ccera.h b/src/ccera.h index 8c8a077..3445dd2 100644 --- a/src/ccera.h +++ b/src/ccera.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/29 16:08:57 by agilliar #+# #+# */ -/* Updated: 2026/04/30 17:48:05 by agilliar ### ########.fr */ +/* Updated: 2026/05/04 02:35:51 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,37 +16,24 @@ # include # include -# if UINTPTR_MAX == 0xFFFFFFFFFFFFFFFF +# if UINTPTR_MAX != 0xFFFFFFFFFFFFFFFF +# error "Platform's pointers are not 64 bits" +# endif typedef uintptr_t t_usize; typedef intptr_t t_isize; -typedef uint8_t t_u8; typedef union u_value t_value; -typedef struct s_expr -{ - t_usize fn; - t_usize arg; -} t_expr; - typedef t_value (*t_builtin)(t_value); -typedef struct s_func -{ - t_usize consts_cnt; - t_value *consts; - t_usize exprs_count; - t_expr *exprs; -} t_func; - enum e_value: t_usize { VALUE_PTR = 0, VALUE_INT = 1, }; -# define VALUE_MASK 0x1 +# define VALUE_MASK 0x1 typedef union u_value { @@ -58,7 +45,6 @@ typedef union u_value enum e_value_ptr: t_usize { VALUE_PTR_BUILTIN, - VALUE_PTR_FUNC, VALUE_PTR_LIST, VALUE_PTR_BYTES, }; @@ -69,12 +55,6 @@ struct s_value_builtin t_builtin builtin; }; -struct s_value_func -{ - enum e_value_ptr discrim; - t_func func; -}; - struct s_value_list { t_usize len; @@ -86,25 +66,32 @@ struct s_value_bytes { t_usize len; enum e_value_ptr discrim; - t_u8 bytes[0]; + char bytes[0]; }; t_value value_builtin_new(t_builtin builtin); -t_value value_func_new(t_func func); t_value value_list_new(t_usize len); t_value value_bytes_new(t_usize len); +t_value value_undefined_new(void); t_value value_int_new(t_isize n); -t_builtin *value_builtin_get(t_value value); -t_func *value_func_get(t_value value); +struct s_value_builtin *value_builtin_get(t_value value); struct s_value_list *value_list_get(t_value value); struct s_value_bytes *value_bytes_get(t_value value); t_isize value_int_get(t_value value); -void t_value_destroy(t_value value); -t_value t_value_copy(t_value value); +void value_destroy(t_value value); + +t_value value_copy(t_value value); +struct s_value_list *value_list_unique(t_value *value); +struct s_value_bytes *value_bytes_unique(t_value *value); + +t_value value_list_new(t_usize len); +t_value value_list_new(t_usize len); typedef void *t_arc; +typedef void *(*t_unpack)(t_value); +typedef void (*t_drop)(void *); t_arc arc_create(t_usize size); t_arc arc_copy(t_arc arc); @@ -113,5 +100,33 @@ bool arc_is_unique(t_arc arc); void noop(void *ptr); -# endif +struct s_exec_context; + +typedef struct s_eval_ctx +{ + struct s_eval_ctx *parent; + struct s_value_list *state; + t_usize pos; +} t_eval_ctx; + +// The expression value is a tuple of an evaluatable and the argument to give it +// +// Value-evaluatables are laid out as follows: +// ( +// ((values | nil)* .. (exprs | nil)*), +// current_pos +// ) +// The nil values are considered to have been moved out, and it is an error for +// them to be used +// The nil expressions are locations where an argument is expected, halting +// evaluation +// An expression is as follows: +// (eval_idx, arg_idx, move) +// eval_idx is the index of the function to be evaluated +// arg_idx is the index of the argument to said function +// move is whether said value shall be moved out +// +// This function takes ownership +t_value expr_eval(t_value expr); + #endif diff --git a/src/eval.c b/src/eval.c new file mode 100644 index 0000000..98e5dd9 --- /dev/null +++ b/src/eval.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* eval.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/05/04 01:21:34 by agilliar #+# #+# */ +/* Updated: 2026/05/04 02:51:20 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ccera.h" +#include + +static t_value ctx_eval(t_eval_ctx *ctx) +{ + (void) ctx; + return (value_undefined_new()); +} + +t_value expr_eval(t_value expr) +{ + t_eval_ctx *ctx; + + (void) expr; + ctx = malloc(sizeof(t_eval_ctx)); + if (!ctx) + return (value_undefined_new()); + ctx->parent = NULL; + return (ctx_eval(ctx)); +} diff --git a/src/value_destroy.c b/src/value_destroy.c new file mode 100644 index 0000000..b67f20d --- /dev/null +++ b/src/value_destroy.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* value_destroy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/04/30 19:40:43 by agilliar #+# #+# */ +/* Updated: 2026/05/04 01:17:51 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ccera.h" +#include + +static void value_drop_arc(t_value *value, t_unpack unpack, t_drop drop) +{ + void *unpacked; + + unpacked = unpack(*value); + if (!unpacked) + return ; + *value = value_int_new(0); + arc_destroy(unpacked, drop); +} + +static void value_list_del(struct s_value_list *list) +{ + t_usize i; + + i = 0; + while (i < list->len) + value_destroy(list->list[i++]); +} + +void value_destroy(t_value value) +{ + value_drop_arc(&value, (t_unpack) value_builtin_get, noop); + value_drop_arc(&value, (t_unpack) value_list_get, (t_drop) value_list_del); + value_drop_arc(&value, (t_unpack) value_bytes_get, noop); +} diff --git a/src/value_get.c b/src/value_get.c index 6f76a46..7b79dc7 100644 --- a/src/value_get.c +++ b/src/value_get.c @@ -6,14 +6,14 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/30 17:27:40 by agilliar #+# #+# */ -/* Updated: 2026/04/30 17:48:45 by agilliar ### ########.fr */ +/* Updated: 2026/05/04 01:18:03 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ #include "ccera.h" #include -t_builtin *value_builtin_get(t_value value) +struct s_value_builtin *value_builtin_get(t_value value) { struct s_value_builtin *res; @@ -22,19 +22,7 @@ t_builtin *value_builtin_get(t_value value) res = value.ptr - offsetof(struct s_value_builtin, builtin); if (res->discrim != VALUE_PTR_BUILTIN) return (NULL); - return (&res->builtin); -} - -t_func *value_func_get(t_value value) -{ - struct s_value_func *res; - - if ((value.discrim & VALUE_MASK) != VALUE_PTR) - return (NULL); - res = value.ptr - offsetof(struct s_value_func, func); - if (res->discrim != VALUE_PTR_FUNC) - return (NULL); - return (&res->func); + return (res); } struct s_value_list *value_list_get(t_value value) diff --git a/src/value_lifetime.c b/src/value_lifetime.c new file mode 100644 index 0000000..77b8725 --- /dev/null +++ b/src/value_lifetime.c @@ -0,0 +1,88 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* value_lifetime.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/05/04 02:05:48 by agilliar #+# #+# */ +/* Updated: 2026/05/04 03:21:18 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ccera.h" +#include +#include + +t_value value_copy(t_value value) +{ + void *ptr; + + ptr = value_list_get(value); + if (ptr) + { + arc_copy(ptr); + return (value); + } + ptr = value_bytes_get(value); + if (ptr) + { + arc_copy(ptr); + return (value); + } + ptr = value_builtin_get(value); + if (ptr) + { + arc_copy(ptr); + return (value); + } + return (value_int_new(value_int_get(value))); +} + +struct s_value_list *value_list_unique(t_value *value) +{ + struct s_value_list *list; + t_value new; + struct s_value_list *new_list; + t_usize i; + + list = value_list_get(*value); + if (!list) + return (NULL); + if (arc_is_unique(list)) + return (list); + new = value_list_new(list->len); + new_list = value_list_get(new); + if (!new_list) + return (NULL); + i = 0; + while (i < list->len) + { + new_list->list[i] = value_copy(list->list[i]); + i++; + } + value_destroy(*value); + *value = new; + return (new_list); +} + +struct s_value_bytes *value_bytes_unique(t_value *value) +{ + struct s_value_bytes *bytes; + t_value new; + struct s_value_bytes *new_bytes; + + bytes = value_bytes_get(*value); + if (!bytes) + return (NULL); + if (arc_is_unique(bytes)) + return (bytes); + new = value_bytes_new(bytes->len); + new_bytes = value_bytes_get(new); + if (!new_bytes) + return (NULL); + memcpy(new_bytes->bytes, bytes->bytes, bytes->len); + value_destroy(*value); + *value = new; + return (new_bytes); +} diff --git a/src/value_new.c b/src/value_new.c index b461a2c..7dd45ad 100644 --- a/src/value_new.c +++ b/src/value_new.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/30 16:25:42 by agilliar #+# #+# */ -/* Updated: 2026/04/30 17:48:17 by agilliar ### ########.fr */ +/* Updated: 2026/05/04 01:49:28 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,7 +20,7 @@ t_value value_builtin_new(t_builtin builtin) res = arc_create(sizeof(struct s_value_builtin)); if (!res) - return (value_int_new(0)); + return (value_undefined_new()); res->discrim = VALUE_PTR_BUILTIN; res->builtin = builtin; res_raw.ptr = &res->builtin; @@ -28,21 +28,6 @@ t_value value_builtin_new(t_builtin builtin) return (res_raw); } -t_value value_func_new(t_func func) -{ - struct s_value_func *res; - t_value res_raw; - - res = arc_create(sizeof(struct s_value_func)); - if (!res) - return (value_int_new(0)); - res->discrim = VALUE_PTR_FUNC; - res->func = func; - res_raw.ptr = &res->func; - res_raw.discrim |= VALUE_PTR; - return (res_raw); -} - t_value value_list_new(t_usize len) { struct s_value_list *res; @@ -51,15 +36,15 @@ t_value value_list_new(t_usize len) if (__builtin_mul_overflow(len, sizeof(t_value), &n) || __builtin_add_overflow(n, sizeof(struct s_value_list), &n)) - return (value_int_new(0)); + return (value_undefined_new()); res = arc_create(n); if (!res) - return (value_int_new(0)); + return (value_undefined_new()); res->discrim = VALUE_PTR_LIST; res->len = len; n = 0; while (n < len) - res->list[n++] = value_int_new(0); + res->list[n++] = value_undefined_new(); res_raw.ptr = &res->list; res_raw.discrim |= VALUE_PTR; return (res_raw); @@ -72,10 +57,10 @@ t_value value_bytes_new(t_usize len) t_usize n; if (__builtin_add_overflow(len, sizeof(struct s_value_bytes), &n)) - return (value_int_new(0)); + return (value_undefined_new()); res = arc_create(n); if (!res) - return (value_int_new(0)); + return (value_undefined_new()); res->discrim = VALUE_PTR_BYTES; res->len = len; memset(&res->bytes, 0, len); @@ -84,6 +69,14 @@ t_value value_bytes_new(t_usize len) return (res_raw); } +t_value value_undefined_new(void) +{ + t_value res; + + res.ptr = NULL; + return (res); +} + t_value value_int_new(t_isize n) { t_value res; diff --git a/test.c b/test.c index 162a8e6..a45042f 100644 --- a/test.c +++ b/test.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/30 17:19:58 by agilliar #+# #+# */ -/* Updated: 2026/04/30 17:53:30 by agilliar ### ########.fr */ +/* Updated: 2026/05/04 03:20:35 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,9 +19,17 @@ int main(void) char *s = "Hello cera!"; t_value value = value_bytes_new(strlen(s) + 1); strcpy(&value_bytes_get(value)->bytes[0], s); - printf("%s\n", &value_bytes_get(value)->bytes); + printf("%s\n", &value_bytes_get(value)->bytes[0]); printf("%p\n", value_bytes_get(value)); printf("%p\n", value_list_get(value)); + char c = value_bytes_get(value)->bytes[1]; + (void) c; + t_value value_2 = value_copy(value); + value_bytes_unique(&value_2)->bytes[1] = 'f'; + printf("%s\n", &value_bytes_get(value_2)->bytes[0]); + printf("%s\n", &value_bytes_get(value)->bytes[0]); + value_destroy(value); + value_destroy(value_2); value = value_int_new(128); printf("%li\n", value_int_get(value)); } -- 2.53.0