mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-22 05:59:31 +08:00
@scriptc/experimental exports InternTable<K, V>: a named table that every thread of a scriptc program shares and that each thread has its own copy of under Node.js. Keys are strings or numbers with Map equality; values are published (@scriptc/threads) when stored, and the first stored value of a key is kept. Members are get, has, size, getOrInsert and getOrInsertComputed. The runtime table (scr_itable.c) splits each table into 64 segments. Lookups take no lock and do not write; inserts take a segment's spin lock for a probe and a few stores, and callbacks run without a lock. Number tables keep keys and values in the index; string tables keep entries in segment-owned chunks behind tagged slots. Replaced indexes are kept. The compiler lowers the class to a synthetic class with one f64 handle field and five intrinsics, with interned helpers per member and type and an in-place lowering of getOrInsertComputed that creates a function expression callback only on a miss. Stored values go through the publish intrinsic, so their types get the write guard. scriptc refuses names that are not string literals, one name opened with different type arguments, and key or value types a table cannot store. scr_publish walks small graphs in inline buffers and reads SCRIPTC_PUBLISH_TRACE once, instead of allocating and calling getenv on every call.