diff options
author | Jo-Philipp Wich <jo@mein.io> | 2023-01-07 14:50:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-07 14:50:12 +0100 |
commit | 1e4d20932646f90523d21ea358c72901e3ee689e (patch) | |
tree | e19993595113ae8bba777278ecceabfc1ef0201e | |
parent | ff32355ea6455a59f769f96fdeee7dd055f40e50 (diff) | |
parent | c0e413c21f7b114a70282041a0049196869dd15f (diff) |
Merge pull request #134 from nbd168/thisval
include: add uc_fn_thisval()
-rw-r--r-- | include/ucode/lib.h | 14 | ||||
-rw-r--r-- | include/ucode/types.h | 1 | ||||
-rw-r--r-- | types.c | 22 |
3 files changed, 33 insertions, 4 deletions
diff --git a/include/ucode/lib.h b/include/ucode/lib.h index 0709702..74d8866 100644 --- a/include/ucode/lib.h +++ b/include/ucode/lib.h @@ -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) diff --git a/include/ucode/types.h b/include/ucode/types.h index bae2dd5..22fe9a9 100644 --- a/include/ucode/types.h +++ b/include/ucode/types.h @@ -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 **); @@ -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; @@ -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; } |