diff options
Diffstat (limited to 'sys/link.c')
| -rw-r--r-- | sys/link.c | 52 |
1 files changed, 52 insertions, 0 deletions
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; +} |
