diff options
| -rw-r--r-- | include/lcq/pit/runtime.h | 1 | ||||
| -rw-r--r-- | src/library.c | 27 | ||||
| -rw-r--r-- | src/runtime.c | 22 |
3 files changed, 26 insertions, 24 deletions
diff --git a/include/lcq/pit/runtime.h b/include/lcq/pit/runtime.h index 8206a4b..0e92b7f 100644 --- a/include/lcq/pit/runtime.h +++ b/include/lcq/pit/runtime.h @@ -206,6 +206,7 @@ pit_value pit_apply(pit_runtime *rt, pit_value f, pit_value args); /* working with native data */ pit_value pit_nativedata_new(pit_runtime *rt, pit_value tag, void *d); +void *pit_nativedata_get(pit_runtime *rt, pit_value tag, pit_value v); /* evaluation! */ pit_value pit_expand_macros(pit_runtime *rt, pit_value top); diff --git a/src/library.c b/src/library.c index 5b04e51..33982dc 100644 --- a/src/library.c +++ b/src/library.c @@ -336,27 +336,6 @@ struct bytestring { i64 len, cap; u8 *data; }; -static struct bytestring *bytestring_get(pit_runtime *rt, pit_value v) { - if (pit_value_sort(v) != PIT_VALUE_SORT_REF) { - pit_error(rt, "value was not a reference (to a bytestring)"); - return NULL; - } - pit_value_heavy *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 bytestring nativedata"); - return NULL; - } - if (!pit_eq(h->in.nativedata.tag, pit_intern_cstr(rt, "bs"))) { - pit_error(rt, "native value is not a bytestring"); - return NULL; - } - if (!h->in.nativedata.data) { - pit_error(rt, "bytestring was already freed"); - return NULL; - } - return h->in.nativedata.data; -} static pit_value impl_bs_new(pit_runtime *rt, pit_value args) { (void) args; i64 cap = 256; @@ -392,7 +371,7 @@ static pit_value impl_bs_delete(pit_runtime *rt, pit_value args) { static pit_value impl_bs_grow(pit_runtime *rt, pit_value args) { pit_value vsz = pit_car(rt, args); pit_value v = pit_car(rt, pit_cdr(rt, args)); - struct bytestring *bs = bytestring_get(rt, v); + struct bytestring *bs = pit_nativedata_get(rt, pit_intern_cstr(rt, "bs"), v); if (!bs) return PIT_NIL; i64 sz = pit_as_integer(rt, vsz); if (sz > bs->len) { @@ -411,7 +390,7 @@ static pit_value impl_bs_spit(pit_runtime *rt, pit_value args) { if (len < 0) { pit_error(rt, "path was not a string"); return PIT_NIL; } pathbuf[len] = 0; pit_value v = pit_car(rt, pit_cdr(rt, args)); - struct bytestring *bs = bytestring_get(rt, v); + struct bytestring *bs = pit_nativedata_get(rt, pit_intern_cstr(rt, "bs"), v); if (!bs) return PIT_NIL; FILE *f = fopen(pathbuf, "w+"); if (!f) { pit_error(rt, "failed to open file: %s", pathbuf); return PIT_NIL; } @@ -427,7 +406,7 @@ static pit_value impl_bs_write8(pit_runtime *rt, pit_value args) { pit_value v = pit_car(rt, args); pit_value vidx = pit_car(rt, pit_cdr(rt, args)); pit_value vx = pit_car(rt, pit_cdr(rt, pit_cdr(rt, args))); - struct bytestring *bs = bytestring_get(rt, v); + struct bytestring *bs = pit_nativedata_get(rt, pit_intern_cstr(rt, "bs"), v); if (!bs) return PIT_NIL; i64 idx = pit_as_integer(rt, vidx); u8 x = (u8) pit_as_integer(rt, vx); 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); |
