summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pit/include/lcq/pit/runtime/value.h2
-rw-r--r--pit/src/runtime/value.c16
2 files changed, 18 insertions, 0 deletions
diff --git a/pit/include/lcq/pit/runtime/value.h b/pit/include/lcq/pit/runtime/value.h
index e3596fe..8497ad0 100644
--- a/pit/include/lcq/pit/runtime/value.h
+++ b/pit/include/lcq/pit/runtime/value.h
@@ -44,6 +44,8 @@ typedef struct {
} in;
} pit_value_heavy;
+i64 pit_value_sort_or_heavy_sort(pit_runtime *rt, pit_value v);
+
pit_value pit_value_new(struct pit_runtime *rt, enum pit_value_sort s, u64 data);
bool pit_value_eq(pit_value a, pit_value b);
diff --git a/pit/src/runtime/value.c b/pit/src/runtime/value.c
index 154e6a1..4de7402 100644
--- a/pit/src/runtime/value.c
+++ b/pit/src/runtime/value.c
@@ -11,6 +11,22 @@ const i64 PIT__SORT_FUNC = PIT_VALUE_SORT_REF + PIT_VALUE_HEAVY_SORT_FUNC;
const i64 PIT__SORT_NATIVEFUNC = PIT_VALUE_SORT_REF + PIT_VALUE_HEAVY_SORT_NATIVEFUNC;
const i64 PIT__SORT_NATIVEDATA = PIT_VALUE_SORT_REF + PIT_VALUE_HEAVY_SORT_NATIVEDATA;
+i64 pit_value_sort_or_heavy_sort(pit_runtime *rt, pit_value v) {
+ switch (pit_value_sort(v)) {
+ case PIT_VALUE_SORT_DOUBLE: return PIT__SORT_DOUBLE;
+ case PIT_VALUE_SORT_INTEGER: return PIT__SORT_INTEGER;
+ case PIT_VALUE_SORT_SYMBOL: return PIT__SORT_SYMBOL;
+ case PIT_VALUE_SORT_REF: {
+ pit_ref r = pit_value_as_ref(rt, v);
+ if (r < 0) return -1;
+ pit_value_heavy *h = pit_value_ref_deref(rt, r);
+ if (!h) return -1;
+ return PIT_VALUE_SORT_REF + h->hsort;
+ }
+ default: return -1;
+ }
+}
+
pit_value pit_value_new(pit_runtime *rt, enum pit_value_sort s, u64 data) {
if (s == PIT_VALUE_SORT_DOUBLE) {
/* if (((data >> 52) & 0b011111111111) == 0b011111111111 && ((data >> 51) & 0b1) == 0) { */