summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/lcq/pit/runtime.h1
-rw-r--r--src/library.c27
-rw-r--r--src/runtime.c22
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);