summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/hal/obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/hal/obj.c')
-rw-r--r--arch/x86_64/hal/obj.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/arch/x86_64/hal/obj.c b/arch/x86_64/hal/obj.c
index c5d5c69..b8924a6 100644
--- a/arch/x86_64/hal/obj.c
+++ b/arch/x86_64/hal/obj.c
@@ -37,6 +37,12 @@ obj_gettype(jove_owned_obj_t *obj)
return obj->locked.type;
}
+uint8_t
+obj_peektype(jove_obj_t obj)
+{
+ return obj.type;
+}
+
void
obj_settype(jove_owned_obj_t *obj, uint8_t type)
{
@@ -55,6 +61,24 @@ obj_setvalue(jove_owned_obj_t *obj, uintmax_t value)
obj->locked.value = value & 0x00007FFFFFFFFFFFULL;
}
+jove_obj_t
+objdir_peeklocal(
+ jove_owned_obj_t *objdir_obj,
+ uint16_t entry)
+{
+ if(obj_gettype_linked(objdir_obj) != JOVE_OBJ_OBJDIR) {
+ errno = EBADOBJ;
+ return (jove_obj_t) { 0 };
+ }
+ if(entry >= JOVE_OBJDIR_ENTRIES) {
+ errno = EBADPATH;
+ return (jove_obj_t) { 0 };
+ }
+
+ jove_objdir_t *objtab = obj_deref_linked(objdir_obj);
+ return objtab->entries[entry];
+}
+
jove_owned_obj_t*
objdir_getlocal(
jove_owned_obj_t *objdir_obj,
@@ -64,7 +88,7 @@ objdir_getlocal(
reterr(EBADOBJ);
}
if(entry >= JOVE_OBJDIR_ENTRIES) {
- reterr(EOOB);
+ reterr(EBADPATH);
}
jove_objdir_t *objtab = obj_deref_linked(objdir_obj);
@@ -81,9 +105,10 @@ objdir_getobj(
return objdir_obj;
}
{
+ errno = 0;
jove_owned_obj_t *child_objdir = objdir_getlocal(objdir_obj, path[0]);
if(child_objdir == 0) {
- return 0;
+ reterr(EBADPATH);
}
jove_owned_obj_t *target_obj = objdir_getobj(child_objdir, path + 1, path_len - 1);