17 KRK_VAL_BOOLEAN = 0xFFFC,
18 KRK_VAL_INTEGER = 0xFFFD,
19 KRK_VAL_HANDLER = 0xFFFE,
20 KRK_VAL_NONE = 0xFFFF,
21 KRK_VAL_KWARGS = 0x7FFC,
22 KRK_VAL_OBJECT = 0x7FFD,
23 KRK_VAL_NOTIMPL = 0x7FFE,
38 #define KRK_VAL_MASK_BOOLEAN ((uint64_t)0xFFFC000000000000)
39 #define KRK_VAL_MASK_INTEGER ((uint64_t)0xFFFD000000000000)
40 #define KRK_VAL_MASK_HANDLER ((uint64_t)0xFFFE000000000000)
41 #define KRK_VAL_MASK_NONE ((uint64_t)0xFFFF000000000000)
42 #define KRK_VAL_MASK_KWARGS ((uint64_t)0x7FFC000000000000)
43 #define KRK_VAL_MASK_OBJECT ((uint64_t)0x7FFD000000000000)
44 #define KRK_VAL_MASK_NOTIMPL ((uint64_t)0x7FFE000000000000)
45 #define KRK_VAL_MASK_NAN ((uint64_t)0x7FFC000000000000)
46 #define KRK_VAL_MASK_LOW ((uint64_t)0x0000FFFFFFFFFFFF)
184 extern KrkValue krk_parse_int(
const char * start,
size_t width,
unsigned int base);
191 #ifdef KRK_SANITIZE_OBJECT_POINTERS
197 static inline uintptr_t _krk_sanitize(uintptr_t input) {
202 #define _krk_sanitize(ptr) (ptr)
210 #ifdef KRK_HEAP_TAG_BYTE
211 #define KRK_HEAP_TAG ((uintptr_t)KRK_HEAP_TAG_BYTE << 56)
213 #define KRK_HEAP_TAG 0
216 #define NONE_VAL(value) ((KrkValue)(KRK_VAL_MASK_LOW | KRK_VAL_MASK_NONE))
217 #define NOTIMPL_VAL(value) ((KrkValue)(KRK_VAL_MASK_LOW | KRK_VAL_MASK_NOTIMPL))
218 #define BOOLEAN_VAL(value) ((KrkValue)(((uint64_t)(value) & KRK_VAL_MASK_LOW) | KRK_VAL_MASK_BOOLEAN))
219 #define INTEGER_VAL(value) ((KrkValue)(((uint64_t)(value) & KRK_VAL_MASK_LOW) | KRK_VAL_MASK_INTEGER))
220 #define KWARGS_VAL(value) ((KrkValue)((uint32_t)(value) | KRK_VAL_MASK_KWARGS))
221 #define OBJECT_VAL(value) ((KrkValue)((_krk_sanitize((uintptr_t)(value)) & KRK_VAL_MASK_LOW) | KRK_VAL_MASK_OBJECT))
222 #define HANDLER_VAL(ty,ta) ((KrkValue)((uint64_t)((((uint64_t)ty) << 32) | ((uint32_t)ta)) | KRK_VAL_MASK_HANDLER))
223 #define FLOATING_VAL(value) (((KrkValueDbl){.dbl = (value)}).val)
225 #define KRK_VAL_TYPE(value) ((value) >> 48)
227 #define KRK_IX(value) ((uint64_t)((value) & KRK_VAL_MASK_LOW))
228 #define KRK_SX(value) ((uint64_t)((value) & 0x800000000000))
229 #define AS_INTEGER(value) ((krk_integer_type)(KRK_SX(value) ? (KRK_IX(value) | KRK_VAL_MASK_NONE) : (KRK_IX(value))))
230 #define AS_BOOLEAN(value) AS_INTEGER(value)
232 #define AS_NOTIMPL(value) ((krk_integer_type)((value) & KRK_VAL_MASK_LOW))
233 #define AS_HANDLER(value) ((uint64_t)((value) & KRK_VAL_MASK_LOW))
234 #define AS_OBJECT(value) ((KrkObj*)(uintptr_t)(((value) & KRK_VAL_MASK_LOW) | KRK_HEAP_TAG))
235 #define AS_FLOATING(value) (((KrkValueDbl){.val = (value)}).dbl)
242 #define IS_INTEGER(value) ((((value) >> 48L) & (KRK_VAL_MASK_HANDLER >> 48L)) == (KRK_VAL_MASK_BOOLEAN >> 48L))
243 #define IS_BOOLEAN(value) (((value) >> 48L) == (KRK_VAL_MASK_BOOLEAN >> 48L))
244 #define IS_NONE(value) (((value) >> 48L) == (KRK_VAL_MASK_NONE >> 48L))
245 #define IS_HANDLER(value) (((value) >> 48L) == (KRK_VAL_MASK_HANDLER >> 48L))
246 #define IS_OBJECT(value) (((value) >> 48L) == (KRK_VAL_MASK_OBJECT >> 48L))
247 #define IS_KWARGS(value) (((value) >> 48L) == (KRK_VAL_MASK_KWARGS >> 48L))
248 #define IS_NOTIMPL(value) (((value) >> 48L) == (KRK_VAL_MASK_NOTIMPL >> 48L))
250 #define IS_FLOATING(value) (((value) & KRK_VAL_MASK_NAN) != KRK_VAL_MASK_NAN)
252 #define AS_HANDLER_TYPE(value) (AS_HANDLER(value) >> 32)
253 #define AS_HANDLER_TARGET(value) (AS_HANDLER(value) & 0xFFFFFFFF)
254 #define IS_HANDLER_TYPE(value,type) (IS_HANDLER(value) && AS_HANDLER_TYPE(value) == type)
256 #define KWARGS_SINGLE (INT32_MAX)
257 #define KWARGS_LIST (INT32_MAX-1)
258 #define KWARGS_DICT (INT32_MAX-2)
259 #define KWARGS_NIL (INT32_MAX-3)
260 #define KWARGS_UNSET (0)
262 #define PRIkrk_int "%" PRId64
263 #define PRIkrk_hex "%" PRIx64
Top-level header with configuration macros.
Flexible vector of stack references.
void krk_initValueArray(KrkValueArray *array)
Initialize a value array.
void krk_freeValueArray(KrkValueArray *array)
Release relesources used by a value array.
void krk_writeValueArray(KrkValueArray *array, KrkValue value)
Add a value to a value array.
Stack reference or primative value.
int krk_valuesEqual(KrkValue a, KrkValue b)
Compare two values for equality.
void krk_printValue(FILE *f, KrkValue value)
Print a string representation of a value.
int krk_valuesSame(KrkValue a, KrkValue b)
Compare two values by identity.
int krk_valuesSameOrEqual(KrkValue a, KrkValue b)
Compare two values by identity, then by equality.
void krk_printValueSafe(FILE *f, KrkValue value)
Print a value without calling the VM.
KrkValueType
Tag enum for basic value types.