mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-02 08:35:07 +08:00
- Share symbol-keyed global caches across statically compiled modules. - Preserve assignment results and evaluation order for native fields, accessors, and nullish defaults. - Read omitted options correctly in specialized JavaScript package calls.
40 lines
1.7 KiB
TypeScript
40 lines
1.7 KiB
TypeScript
let calls = 0;
|
|
function supply(): number { calls++; return 7; }
|
|
let empty: number | undefined;
|
|
let zero: number | undefined = 0;
|
|
console.log(empty ??= supply(), zero ??= supply(), calls);
|
|
const values: (number | undefined)[] = [undefined, 0];
|
|
let indexes = 0;
|
|
function index(): number { indexes++; return 0; }
|
|
console.log(values[index()] ??= supply(), values[index()] ??= supply(), indexes, calls);
|
|
console.log(values[4] ??= supply(), values.length, calls);
|
|
let trace = "";
|
|
class Slot {
|
|
stored: number | null = null;
|
|
get value(): number | null { trace += "get;"; return this.stored; }
|
|
set value(value: number | null) { trace += "set;"; this.stored = value; }
|
|
}
|
|
let slot = new Slot();
|
|
const original = slot;
|
|
function receiver(): Slot { trace += "receiver;"; return slot; }
|
|
function replace(): number { trace += "rhs;"; slot = new Slot(); return 9; }
|
|
console.log(receiver().value ??= replace(), original.stored, slot.stored, trace);
|
|
trace = "";
|
|
console.log(original.value ??= replace(), trace);
|
|
const record: { value?: number } = {};
|
|
console.log(record.value ??= 4, record.value ??= 5);
|
|
let recordGets = 0;
|
|
let recordSets = 0;
|
|
let saved: string | undefined;
|
|
const accessor = {
|
|
get value(): string | undefined { recordGets++; return saved; },
|
|
set value(value: string | undefined) { recordSets++; saved = value; },
|
|
};
|
|
console.log(accessor.value ??= "kept", accessor.value ??= "unused", recordGets, recordSets);
|
|
let absent: undefined;
|
|
let nil: null = null;
|
|
function supplyUndefined(): undefined { trace += "undefined;"; return undefined; }
|
|
function supplyNull(): null { trace += "null;"; return null; }
|
|
trace = "";
|
|
console.log(absent ??= supplyUndefined(), nil ??= supplyNull(), trace);
|