From bb08472a04127c994d3ea5a2cbc195f7116a03b8 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Fri, 11 Sep 2026 11:16:36 -0400 Subject: preliminary object linking support. needs testing --- sys/link.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 sys/link.c (limited to 'sys/link.c') diff --git a/sys/link.c b/sys/link.c new file mode 100644 index 0000000..5be9457 --- /dev/null +++ b/sys/link.c @@ -0,0 +1,52 @@ +#include "link.h" +#include "arch/x86_64/hal/obj.h" +#include "hal/memory.h" + +void* +obj_deref_linked(jove_owned_obj_t *obj) +{ + switch(obj_gettype(obj)) { + case JOVE_OBJ_LINK: return obj_deref_linked(link_deref(obj)); + default: return obj_deref(obj); + } +} + +uint8_t +obj_gettype_linked(jove_owned_obj_t *obj) +{ + switch(obj_gettype(obj)) { + case JOVE_OBJ_LINK: return obj_gettype_linked(link_deref(obj)); + default: return obj_gettype(obj); + } +} + +uint64_t +obj_getvalue_linked(jove_owned_obj_t *obj) +{ + switch(obj_gettype(obj)) { + case JOVE_OBJ_LINK: return obj_getvalue_linked(link_deref(obj)); + default: return obj_getvalue(obj); + } +} + +jove_owned_obj_t* +link_deref(jove_owned_obj_t *link) +{ + struct obj_link *linkval = obj_deref(link); + return obj_take(&linkval->obj); +} + +jove_owned_obj_t *link_new(jove_obj_t *tgt, jove_owned_obj_t *dst) +{ + struct obj_link *linkval = obj_deref(dst); + linkval->obj = *tgt; + linkval->refcount = 2; + + { + jove_owned_obj_t *tgt_owned = obj_take(tgt); + obj_settype(tgt_owned, JOVE_OBJ_LINK); + obj_setvalue(tgt_owned, (uintptr_t)linkval); + obj_release(tgt_owned); + } + return dst; +} -- cgit v1.2.3