Skip to content

Commit

Permalink
include: add uc_fn_thisval()
Browse files Browse the repository at this point in the history
Can be used to get rid of a layer of pointer indirection in resource type
handlers.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
  • Loading branch information
nbd168 committed Jan 6, 2023
1 parent ff32355 commit c0e413c
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
14 changes: 13 additions & 1 deletion include/ucode/lib.h
Expand Up @@ -38,14 +38,26 @@ __hidden void uc_error_message_indent(char **msg);
__hidden uc_value_t *uc_require_library(uc_vm_t *vm, uc_value_t *nameval, bool so_only);

/* vm helper */
static inline uc_value_t *
_uc_fn_this_res(uc_vm_t *vm)
{
return vm->callframes.entries[vm->callframes.count - 1].ctx;
}

static inline void *
_uc_fn_this(uc_vm_t *vm, const char *expected_type)
{
return ucv_resource_dataptr(vm->callframes.entries[vm->callframes.count - 1].ctx, expected_type);
return ucv_resource_dataptr(_uc_fn_this_res(vm), expected_type);
}

static inline void *
_uc_fn_thisval(uc_vm_t *vm, const char *expected_type)
{
return ucv_resource_data(_uc_fn_this_res(vm), expected_type);
}

#define uc_fn_this(...) _uc_fn_this(vm, __VA_ARGS__)
#define uc_fn_thisval(...) _uc_fn_thisval(vm, __VA_ARGS__)

static inline uc_value_t *
_uc_fn_arg(uc_vm_t *vm, size_t nargs, size_t n)
Expand Down
1 change: 1 addition & 0 deletions include/ucode/types.h
Expand Up @@ -392,6 +392,7 @@ uc_resource_type_t *ucv_resource_type_add(uc_vm_t *, const char *, uc_value_t *,
uc_resource_type_t *ucv_resource_type_lookup(uc_vm_t *, const char *);

uc_value_t *ucv_resource_new(uc_resource_type_t *, void *);
void *ucv_resource_data(uc_value_t *uv, const char *);
void **ucv_resource_dataptr(uc_value_t *, const char *);

uc_value_t *ucv_regexp_new(const char *, bool, bool, bool, char **);
Expand Down
22 changes: 19 additions & 3 deletions types.c
Expand Up @@ -1096,8 +1096,8 @@ ucv_resource_new(uc_resource_type_t *type, void *data)
return &res->header;
}

void **
ucv_resource_dataptr(uc_value_t *uv, const char *name)
static uc_resource_t *
ucv_resource_check(uc_value_t *uv, const char *name)
{
uc_resource_t *res = (uc_resource_t *)uv;

Expand All @@ -1109,7 +1109,23 @@ ucv_resource_dataptr(uc_value_t *uv, const char *name)
return NULL;
}

return &res->data;
return res;
}

void *
ucv_resource_data(uc_value_t *uv, const char *name)
{
uc_resource_t *res = ucv_resource_check(uv, name);

return res ? res->data : NULL;
}

void **
ucv_resource_dataptr(uc_value_t *uv, const char *name)
{
uc_resource_t *res = ucv_resource_check(uv, name);

return res ? &res->data : NULL;
}


Expand Down

0 comments on commit c0e413c

Please sign in to comment.