diff options
author | Jo-Philipp Wich <jo@mein.io> | 2021-12-07 13:40:51 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2021-12-08 15:53:40 +0100 |
commit | 99fdafd8c03a7baee265ce3dd22af5b2d02fdeb6 (patch) | |
tree | a76772653a70c610085c90f80c13ab8eda0cf010 /vm.c | |
parent | 0d29b2558987eda5d8a913638f40d506172606ac (diff) |
vm: introduce value registry
Introduce a new, lazily allocated value registry which can be used by C
code to store values which should not be garbage collected.
The registry is a plain ucode object internally and treated as GC root
but not exposed to ucode script code, this allows it to retain references
to values which are otherwise completely unreachable from ucode scripts.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -2480,3 +2480,34 @@ uc_vm_trace_set(uc_vm_t *vm, uint32_t level) { vm->trace = level; } + +bool +uc_vm_registry_exists(uc_vm_t *vm, const char *key) +{ + bool exists; + + ucv_object_get(vm->registry, key, &exists); + + return exists; +} + +uc_value_t * +uc_vm_registry_get(uc_vm_t *vm, const char *key) +{ + return ucv_object_get(vm->registry, key, NULL); +} + +void +uc_vm_registry_set(uc_vm_t *vm, const char *key, uc_value_t *value) +{ + if (!vm->registry) + vm->registry = ucv_object_new(vm); + + ucv_object_add(vm->registry, key, value); +} + +bool +uc_vm_registry_delete(uc_vm_t *vm, const char *key) +{ + return ucv_object_delete(vm->registry, key); +} |