Skip to main content

Module tags

Module tags 

Source
Expand description

Shared NaN-boxing tag constants and helpers.

This module is the single source of truth for the NaN-boxing bit layout used by ValueWord in the VM stack. The JIT, GC, and any other subsystem that needs to inspect or construct NaN-boxed values should import constants from here.

§NaN-boxing scheme

All tagged values use sign bit = 1 with a quiet NaN exponent, giving us 51 bits for tag + payload. Normal f64 values (including NaN, which is canonicalized to a positive quiet NaN) are stored directly and never collide with our tagged range.

Tagged: 0xFFF[C-F]_XXXX_XXXX_XXXX
  Bit 63    = 1 (sign, marks as tagged)
  Bits 62-52 = 0x7FF (NaN exponent)
  Bit 51    = 1 (quiet NaN bit)
  Bits 50-48 = tag (3 bits)
  Bits 47-0  = payload (48 bits)

Constants§

CANONICAL_NAN
Canonical NaN value used when the original f64 is NaN. Positive quiet NaN: 0x7FF8_0000_0000_0000 (sign=0, exponent all 1s, quiet bit). This has sign=0 so it will NOT be detected as tagged (our tagged values have sign=1).
HEAP_KIND_ARRAY
HEAP_KIND_ATOMIC
HEAP_KIND_BIG_INT
HEAP_KIND_BOOL
HEAP_KIND_BOOL_ARRAY
HEAP_KIND_CHANNEL
HEAP_KIND_CHAR
HEAP_KIND_CLOSURE
HEAP_KIND_COLUMN_REF
HEAP_KIND_CONTENT
HEAP_KIND_DATATABLE
HEAP_KIND_DATA_DATETIME_REF
HEAP_KIND_DATA_REFERENCE
HEAP_KIND_DATETIME_EXPR
HEAP_KIND_DECIMAL
HEAP_KIND_DEQUE
HEAP_KIND_DURATION
HEAP_KIND_ENUM
HEAP_KIND_ERR
HEAP_KIND_EXPR_PROXY
HEAP_KIND_F32_ARRAY
HEAP_KIND_FILTER_EXPR
HEAP_KIND_FLOAT_ARRAY
HEAP_KIND_FLOAT_ARRAY_SLICE
HEAP_KIND_FUNCTION
HEAP_KIND_FUNCTION_REF
HEAP_KIND_FUTURE
HEAP_KIND_GENERATOR
HEAP_KIND_HASHMAP
HEAP_KIND_HOST_CLOSURE
HEAP_KIND_I8_ARRAY
HEAP_KIND_I16_ARRAY
HEAP_KIND_I32_ARRAY
HEAP_KIND_INDEXED_TABLE
HEAP_KIND_INSTANT
HEAP_KIND_INT_ARRAY
HEAP_KIND_IO_HANDLE
HEAP_KIND_ITERATOR
HEAP_KIND_LAZY
HEAP_KIND_MATRIX
HEAP_KIND_MODULE_FUNCTION
HEAP_KIND_MUTEX
HEAP_KIND_NATIVE_SCALAR
HEAP_KIND_NATIVE_VIEW
HEAP_KIND_NONE
HEAP_KIND_NUMBER
HEAP_KIND_OK
HEAP_KIND_PRINT_RESULT
HEAP_KIND_PRIORITY_QUEUE
HEAP_KIND_PROJECTED_REF
HEAP_KIND_RANGE
HEAP_KIND_ROW_VIEW
HEAP_KIND_SET
HEAP_KIND_SHARED_CELL
HEAP_KIND_SIMULATION_CALL
HEAP_KIND_SOME
HEAP_KIND_STRING
HEAP_KIND_TASK_GROUP
HEAP_KIND_TIME
HEAP_KIND_TIMEFRAME
HEAP_KIND_TIMESPAN
HEAP_KIND_TIME_REFERENCE
HEAP_KIND_TRAIT_OBJECT
HEAP_KIND_TYPED_OBJECT
HEAP_KIND_TYPED_TABLE
HEAP_KIND_TYPE_ANNOTATED_VALUE
HEAP_KIND_TYPE_ANNOTATION
HEAP_KIND_U8_ARRAY
HEAP_KIND_U16_ARRAY
HEAP_KIND_U32_ARRAY
HEAP_KIND_U64_ARRAY
HEAP_KIND_UNIT
I48_MAX
Maximum i48 value: 2^47 - 1
I48_MIN
Minimum i48 value: -2^47
PAYLOAD_MASK
Mask for extracting the 48-bit payload (bits 0-47).
TAG_BASE
Tagged value base: sign=1 + exponent all 1s + quiet NaN bit. Binary: 1_11111111111_1000…0 = 0xFFF8_0000_0000_0000 All tagged values have this prefix, with the 3-bit tag in bits 50-48.
TAG_BOOL
Inline bool (payload bit 0: 0=false, 1=true).
TAG_FUNCTION
Function reference (payload = u16 function_id).
TAG_HEAP
Heap pointer to Arc<HeapValue> (48-bit pointer in payload).
TAG_INT
Inline i48 (48-bit signed integer, sign-extended to i64).
TAG_MASK
Mask for extracting the 3-bit tag (bits 48-50).
TAG_MODULE_FN
Module function reference (payload = u32 index).
TAG_NONE
None (Option::None / null).
TAG_REF
Reference to a stack slot (payload = absolute slot index).
TAG_SHIFT
Bit shift for the tag field.
TAG_UNIT
Unit (void return value).

Functions§

get_payload
Extract the 48-bit payload from a NaN-boxed u64.
get_tag
Extract the 3-bit tag from a tagged NaN-boxed u64.
is_number
Check whether a u64 is a plain f64 (not tagged).
is_tagged
Check whether a u64 is a tagged NaN-boxed value (as opposed to a plain f64).
make_tagged
Build a tagged NaN-boxed u64 from a tag and payload.
sign_extend_i48
Sign-extend a 48-bit value to i64.