diff options
Diffstat (limited to 'pit')
| -rw-r--r-- | pit/include/lcq/pit/runtime/value.h | 2 | ||||
| -rw-r--r-- | pit/src/runtime/value.c | 16 |
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) { */ |
