diff options
| author | LLLL Colonq <llll@colonq> | 2025-12-19 21:47:32 -0500 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2025-12-19 21:47:32 -0500 |
| commit | e6329f2ce1df83fd729e79f7e92e55fe96a2e826 (patch) | |
| tree | 5580028c277399c997e61436d2e7e5bcc2052160 /src/runtime.c | |
| parent | 0a6ce352be7d0a8a2cdb2f9a3ae3b0189c5f23b5 (diff) | |
Add pit_nativedata_get
Diffstat (limited to 'src/runtime.c')
| -rw-r--r-- | src/runtime.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/runtime.c b/src/runtime.c index 86c5fea..b7e722a 100644 --- a/src/runtime.c +++ b/src/runtime.c @@ -853,6 +853,28 @@ pit_value pit_nativedata_new(pit_runtime *rt, pit_value tag, void *d) { h->in.nativedata.data = d; return ret; } +void *pit_nativedata_get(pit_runtime *rt, pit_value tag, pit_value v) { + pit_value_heavy *h = NULL; + if (pit_value_sort(v) != PIT_VALUE_SORT_REF) { + pit_error(rt, "value was not a reference"); + return NULL; + } + h = pit_deref(rt, pit_as_ref(rt, v)); + if (!h) { pit_error(rt, "bad ref"); return NULL; } + if (h->hsort != PIT_VALUE_HEAVY_SORT_NATIVEDATA) { + pit_error(rt, "invalid use of value as nativedata"); + return NULL; + } + if (!pit_eq(h->in.nativedata.tag, tag)) { + pit_error(rt, "native value does not match tag"); + return NULL; + } + if (!h->in.nativedata.data) { + pit_error(rt, "nativedata was already freed"); + return NULL; + } + return h->in.nativedata.data; +} pit_values *pit_values_new(i64 capacity) { i64 cap = capacity / (i64) sizeof(pit_value); |
