94 lines
3.0 KiB
Markdown
94 lines
3.0 KiB
Markdown
QuickJS Mist Memory Format Refactoring
|
|
Current Status
|
|
The codebase is partially refactored but doesn't compile due to missing KeyId type definitions.
|
|
|
|
Incremental Refactoring Tasks
|
|
Phase 0: Fix Compilation (Prerequisite)
|
|
Define missing KeyId type as transitional typedef (will be replaced by JSValue later)
|
|
Define K_EMPTY, K_TOMB,
|
|
key_text()
|
|
,
|
|
key_is_text()
|
|
,
|
|
key_payload()
|
|
macros/functions
|
|
Verify build compiles and tests pass
|
|
Phase 1: New JSValue Encoding in quickjs.h
|
|
Add new LSB-based tag constants alongside existing tags
|
|
Add JS_TAG_SHORT_FLOAT for 61-bit truncated double
|
|
Add JS_TAG_STRING_ASCII for immediate 7-byte ASCII strings
|
|
Add new value extraction/creation macros
|
|
Add type check inline functions
|
|
Keep existing NaN-boxing code active (compile-time switch)
|
|
Phase 2: Short Float Implementation
|
|
Implement JS_NewFloat64_ShortFloat() with range checking
|
|
Implement JS_VALUE_GET_FLOAT64_ShortFloat() for decoding
|
|
Out-of-range values return JS_NULL
|
|
Prefer integer encoding when exact
|
|
Phase 3: Immediate ASCII String
|
|
Phase 3: Immediate ASCII String
|
|
Implement JS_TryNewImmediateASCII() for strings up to 7 chars
|
|
Implement JS_IsImmediateASCII() type check
|
|
Implement JS_GetImmediateASCIILen() and JS_GetImmediateASCIIChar()
|
|
Integrate with
|
|
JS_NewStringLen()
|
|
to try immediate first
|
|
Phase 4: Remove JSStringRope
|
|
Delete JSStringRope structure
|
|
Remove JS_TAG_STRING_ROPE handling
|
|
Update string concatenation to create immediate mist_text objects
|
|
Remove rope-related iterator functions
|
|
Phase 5: Refactor JSString to UTF-32 (mist_text)
|
|
Modify struct JSString to store UTF-32 characters only
|
|
Remove is_wide_char flag and 8.16 unions
|
|
Update
|
|
js_alloc_string
|
|
to allocate UTF-32 buffer
|
|
Update string creation functions (
|
|
js_new_string8
|
|
, etc.)
|
|
Update all string accessors to use UTF-32
|
|
Implement immediate-to-UTF32 conversion helper
|
|
Update string operations (
|
|
concat
|
|
,
|
|
compare
|
|
) to work on UTF-32
|
|
Phase 6: Replace KeyId with JSValue in Records
|
|
Change JSRecordEntry.key from KeyId to JSValue
|
|
Update
|
|
rec_hash_key()
|
|
to hash JSValue keys directly
|
|
Update
|
|
rec_find_slot()
|
|
for JSValue key comparison
|
|
Update
|
|
rec_get_own()
|
|
,
|
|
rec_get()
|
|
,
|
|
rec_set_own()
|
|
for JSValue keys
|
|
Remove KeyId typedef and related functions
|
|
Phase 7: Consolidate JSObject → JSRecord
|
|
Remove JSShape and JSShapeProperty structures
|
|
Remove shape hash table from JSRuntime
|
|
Update all property access to use JSRecord
|
|
Migrate JSObject users to JSRecord
|
|
Remove JSObject structure
|
|
Phase 8: Update GC for New Format
|
|
Update mark_children for JSRecord with JSValue keys
|
|
Update free_record for JSValue keys
|
|
Handle immediate values correctly (no marking needed)
|
|
Test for cycles and correct collection
|
|
Phase 9: C Class Storage in Slot 0
|
|
Implement slot 0 reservation for class_id and opaque pointer
|
|
Update JS_SetOpaque() / JS_GetOpaque()
|
|
Migrate existing class storage
|
|
Verification Checklist
|
|
Build compiles without errors
|
|
Existing tests pass
|
|
Property access works correctly
|
|
GC correctly handles cycles
|
|
Short float encoding/decoding verified
|
|
Immediate ASCII strings work |