@nudojs/core 1.11.2 → 1.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -47,7 +47,7 @@ import {
47
47
  withEvalBudgetOverride,
48
48
  withExecPhi,
49
49
  withFnBudgetOverride
50
- } from "./chunk-NEKTOZLJ.js";
50
+ } from "./chunk-GL6VOF75.js";
51
51
 
52
52
  // src/algebra/directive-scan.ts
53
53
  function cleanDirectiveLine(raw, kind) {
@@ -3301,7 +3301,7 @@ function coerceToStringParts(a) {
3301
3301
  }
3302
3302
  if (a.shape.k === "obj" && !a.shape.open && !a.shape.index && !isNullProtoObj(a)) {
3303
3303
  const slots = a.shape.slots;
3304
- if (!Object.hasOwn(slots, "toString") && !Object.hasOwn(slots, "valueOf")) {
3304
+ if (!Object.hasOwn(slots, "toString") && !Object.hasOwn(slots, "valueOf") && !Object.hasOwn(slots, "@@toPrimitive")) {
3305
3305
  return [
3306
3306
  abs({ k: "prim", type: "string" }, lit("[object Object]"), void 0, "exact")
3307
3307
  ];
@@ -4186,7 +4186,9 @@ function getPropFlags(o) {
4186
4186
  }
4187
4187
  function enumOwnKeys(o, slots) {
4188
4188
  const flags = getPropFlags(o);
4189
- return Object.keys(slots).filter((k) => flags?.get(k)?.enumerable !== false);
4189
+ return Object.keys(slots).filter(
4190
+ (k) => flags?.get(k)?.enumerable !== false && slots[k]?.internal !== true
4191
+ );
4190
4192
  }
4191
4193
  function isEnumerableView(o, key) {
4192
4194
  return getPropFlags(o)?.get(key)?.enumerable !== false;
@@ -5011,6 +5013,71 @@ function classNameOfValue(v2) {
5011
5013
  return classValues.get(v2);
5012
5014
  }
5013
5015
 
5016
+ // src/algebra/exec/class-registry.ts
5017
+ var classRegistry = /* @__PURE__ */ new Map();
5018
+ var classEpoch = 0;
5019
+ var classEpochs = /* @__PURE__ */ new Map();
5020
+ var classCollisions = [];
5021
+ function beginClassEpoch() {
5022
+ classEpoch++;
5023
+ }
5024
+ function drainClassCollisions() {
5025
+ return classCollisions.splice(0, classCollisions.length);
5026
+ }
5027
+ function specShape(spec) {
5028
+ const ctorName = spec.ctor?.name ?? "anon";
5029
+ const methods = Object.keys(spec.methods ?? {}).sort().join(",");
5030
+ const statics = Object.keys(spec.staticMethods ?? {}).sort().join(",");
5031
+ const accessors = Object.keys(spec.accessors ?? {}).sort().join(",");
5032
+ const fields = Object.keys(spec.statics ?? {}).sort().join(",");
5033
+ const instFields = (spec.instanceFields ?? []).map((f) => f.name ?? "<computed>").sort().join(",");
5034
+ return `${ctorName}[${methods}](${statics}){${accessors}}{${fields}}{${instFields}}`;
5035
+ }
5036
+ function registerEvalClass(spec) {
5037
+ const prev = classRegistry.get(spec.name);
5038
+ const prevEpoch = classEpochs.get(spec.name);
5039
+ if (prev && prev !== spec && // 同 epoch(同一次 run 内)注册两次才可能是真碰撞:
5040
+ // 块级作用域同名类。跨 epoch = 顺序重注册(常态)。
5041
+ prevEpoch === classEpoch && specShape(prev) !== specShape(spec)) {
5042
+ classCollisions.push({
5043
+ name: spec.name,
5044
+ previous: specShape(prev),
5045
+ next: specShape(spec)
5046
+ });
5047
+ }
5048
+ classRegistry.set(spec.name, spec);
5049
+ classEpochs.set(spec.name, classEpoch);
5050
+ }
5051
+ function getEvalClass(name) {
5052
+ return classRegistry.get(name);
5053
+ }
5054
+ function classInstanceInnerOf(a) {
5055
+ const s = a.shape;
5056
+ if (s.k !== "brand") return void 0;
5057
+ if (classNameOfValue(a) === s.name) return void 0;
5058
+ if (!classRegistry.has(s.name)) return void 0;
5059
+ const inner = s.shape;
5060
+ const is = inner.shape;
5061
+ if (is.k !== "obj" || is.open || is.index) return void 0;
5062
+ return inner;
5063
+ }
5064
+ function classChainHasJsonUserFace(name) {
5065
+ let cur = name;
5066
+ const seen = /* @__PURE__ */ new Set();
5067
+ while (cur && !seen.has(cur)) {
5068
+ seen.add(cur);
5069
+ const spec = classRegistry.get(cur);
5070
+ if (spec?.methods?.["toJSON"]) return true;
5071
+ cur = spec?.superName;
5072
+ }
5073
+ return false;
5074
+ }
5075
+ function clearBClasses() {
5076
+ classRegistry.clear();
5077
+ classEpochs.clear();
5078
+ classCollisions.length = 0;
5079
+ }
5080
+
5014
5081
  // src/algebra/builtins/json.ts
5015
5082
  var NOT_LITERAL = /* @__PURE__ */ Symbol("nudo:not-literal");
5016
5083
  var OMIT = /* @__PURE__ */ Symbol("nudo:json-omit");
@@ -5083,6 +5150,7 @@ function jsonStringifyTotal(a, seen = /* @__PURE__ */ new Set()) {
5083
5150
  const flags = getPropFlags(a);
5084
5151
  for (const [k, sv] of Object.entries(os.slots)) {
5085
5152
  if (flags?.get(k)?.enumerable === false) continue;
5153
+ if (sv.internal === true) continue;
5086
5154
  if (k === "toJSON" && sv.value.term?.op !== "lit") return false;
5087
5155
  if (!jsonStringifyTotal(sv.value, seen)) return false;
5088
5156
  }
@@ -5126,6 +5194,7 @@ function absToJsonNative(a, seen, valueMode) {
5126
5194
  const flags = getPropFlags(a);
5127
5195
  for (const [k, sv] of Object.entries(s.slots)) {
5128
5196
  if (flags?.get(k)?.enumerable === false) continue;
5197
+ if (sv.internal === true) continue;
5129
5198
  if (k === "toJSON") {
5130
5199
  const ts = sv.value;
5131
5200
  if (ts.term?.op !== "lit") return NOT_LITERAL;
@@ -5186,7 +5255,15 @@ function evalJsonMethod(name, args) {
5186
5255
  if (name === "stringify") {
5187
5256
  const a0Abs = args[0];
5188
5257
  if (!a0Abs) return undefAbs();
5189
- const v2 = absToJsonNative(a0Abs, /* @__PURE__ */ new Set(), true);
5258
+ let jsonArg = a0Abs;
5259
+ {
5260
+ const inner = classInstanceInnerOf(a0Abs);
5261
+ const brandName = a0Abs.shape.k === "brand" ? a0Abs.shape.name : void 0;
5262
+ if (inner && brandName !== void 0 && !classChainHasJsonUserFace(brandName)) {
5263
+ jsonArg = inner;
5264
+ }
5265
+ }
5266
+ const v2 = absToJsonNative(jsonArg, /* @__PURE__ */ new Set(), true);
5190
5267
  if (v2 === NOT_LITERAL || v2 === OMIT) {
5191
5268
  if (isNonJsonTopLevel(a0Abs)) return undefAbs();
5192
5269
  if (v2 === NOT_LITERAL) {
@@ -6952,6 +7029,7 @@ function hasOwnDecision(recv, key) {
6952
7029
  }
6953
7030
  if (inner.shape.k === "obj") {
6954
7031
  const slot = getSlot(inner.shape.slots, key);
7032
+ if (slot?.internal) return boolLit(false);
6955
7033
  if (slot && !slot.optional) return boolLit(true);
6956
7034
  if (slot?.optional) return boolPrimB();
6957
7035
  if (!inner.shape.open) return boolLit(false);
@@ -6961,6 +7039,7 @@ function hasOwnDecision(recv, key) {
6961
7039
  }
6962
7040
  if (s.k === "obj") {
6963
7041
  const slot = getSlot(s.slots, key);
7042
+ if (slot?.internal) return boolLit(false);
6964
7043
  if (slot && !slot.optional) return boolLit(true);
6965
7044
  if (slot?.optional) return boolPrimB();
6966
7045
  if (!s.open && recv.conf === "exact") return boolLit(false);
@@ -8561,6 +8640,10 @@ function collectArrMutatorReceivers(node, acc = /* @__PURE__ */ new Set()) {
8561
8640
  function isExpression(n) {
8562
8641
  return n.type !== "PrivateName" && !n.type.endsWith("Statement") && !n.type.endsWith("Declaration");
8563
8642
  }
8643
+ function privateNameKeySrc(prop) {
8644
+ const priv = prop.id?.name ?? prop.name;
8645
+ return priv ? JSON.stringify(`#${priv}`) : null;
8646
+ }
8564
8647
 
8565
8648
  // src/algebra/exec/transpile/transpile-dispatch.ts
8566
8649
  var dispatch = {};
@@ -10607,7 +10690,7 @@ function classSpecOf(stmt, depth, opts) {
10607
10690
  if (!k?.type) return null;
10608
10691
  if (!computed && k.type === "PrivateName") {
10609
10692
  const n = k.id?.name ?? k.name;
10610
- return n ? { name: `#${n}` } : null;
10693
+ return n ? { name: `#${n}`, private: true } : null;
10611
10694
  }
10612
10695
  if (!computed && k.type === "Identifier" && k.name) return { name: k.name };
10613
10696
  if (k.type === "StringLiteral" || k.type === "NumericLiteral") {
@@ -10661,7 +10744,7 @@ function classSpecOf(stmt, depth, opts) {
10661
10744
  const initSrc = thunkOf(vsrc, depth + 2);
10662
10745
  if (keyR2 && "name" in keyR2) {
10663
10746
  instanceFieldParts.push(
10664
- `${indent(depth + 2)}{ name: ${JSON.stringify(keyR2.name)}, init: ${initSrc} },`
10747
+ `${indent(depth + 2)}{ name: ${JSON.stringify(keyR2.name)}, init: ${initSrc}${keyR2.private === true ? ", private: true" : ""} },`
10665
10748
  );
10666
10749
  } else if (keyR2 && "computed" in keyR2) {
10667
10750
  instanceFieldParts.push(
@@ -11322,6 +11405,18 @@ ${inner}
11322
11405
  const r2 = isExpression(expr.right) ? transpileExpression(expr.right, opts) : "$lit(void 0)";
11323
11406
  return `$instanceofNonIdent(${l2}, ${r2})`;
11324
11407
  }
11408
+ if (expr.operator === "in" && expr.left.type === "PrivateName") {
11409
+ const key = privateNameKeySrc(
11410
+ expr.left
11411
+ );
11412
+ if (!key) {
11413
+ throw new NudoUnsupportedError(
11414
+ `binary:in-private`,
11415
+ expr.loc ? { line: expr.loc.start.line, column: expr.loc.start.column } : void 0
11416
+ );
11417
+ }
11418
+ return `$in($lit(${key}), ${transpileExpression(expr.right, opts)})`;
11419
+ }
11325
11420
  const fn2 = BIN_OPS[expr.operator];
11326
11421
  if (!fn2) {
11327
11422
  throw new NudoUnsupportedError(
@@ -11649,14 +11744,15 @@ ${mBodyInner}
11649
11744
  }
11650
11745
  if (expr.property.type === "PrivateName") {
11651
11746
  const recv2 = transpileExpression(expr.object, opts);
11652
- const priv = expr.property.id?.name ?? expr.property.name;
11653
- if (!priv) {
11747
+ const key2 = privateNameKeySrc(
11748
+ expr.property
11749
+ );
11750
+ if (!key2) {
11654
11751
  throw new NudoUnsupportedError(
11655
11752
  `member:PrivateName`,
11656
11753
  expr.loc ? { line: expr.loc.start.line, column: expr.loc.start.column } : void 0
11657
11754
  );
11658
11755
  }
11659
- const key2 = JSON.stringify(`#${priv}`);
11660
11756
  return optional ? `$optionalGet(${recv2}, ${key2})` : `$get(${recv2}, ${key2})`;
11661
11757
  }
11662
11758
  if (expr.property.type !== "Identifier") {
@@ -11778,14 +11874,18 @@ ${mBodyInner}
11778
11874
  }
11779
11875
  if (!m.computed && m.property.type === "PrivateName") {
11780
11876
  const obj2 = transpileExpression(m.object, opts);
11781
- const priv = m.property.id?.name ?? m.property.name;
11782
- if (!priv) {
11877
+ const key = privateNameKeySrc(
11878
+ m.property
11879
+ );
11880
+ if (!key) {
11783
11881
  throw new NudoUnsupportedError(
11784
11882
  `assign-target`,
11785
11883
  expr.loc ? { line: expr.loc.start.line, column: expr.loc.start.column } : void 0
11786
11884
  );
11787
11885
  }
11788
- return `((__v) => (($set(${obj2}, ${JSON.stringify(`#${priv}`)}, __v)), __v))(${right})`;
11886
+ const cur = `$get(${obj2}, ${key})`;
11887
+ const valSrc = compoundFn ? `${compoundFn}(${cur}, ${right})` : right;
11888
+ return `((__v) => (($set(${obj2}, ${key}, __v)), __v))(${valSrc})`;
11789
11889
  }
11790
11890
  if (!m.computed && m.property.type === "Identifier") {
11791
11891
  const obj2 = transpileExpression(m.object, opts);
@@ -12644,50 +12744,6 @@ function noteObjSlotMissing(recv, name, loc) {
12644
12744
  return true;
12645
12745
  }
12646
12746
 
12647
- // src/algebra/exec/class-registry.ts
12648
- var classRegistry = /* @__PURE__ */ new Map();
12649
- var classEpoch = 0;
12650
- var classEpochs = /* @__PURE__ */ new Map();
12651
- var classCollisions = [];
12652
- function beginClassEpoch() {
12653
- classEpoch++;
12654
- }
12655
- function drainClassCollisions() {
12656
- return classCollisions.splice(0, classCollisions.length);
12657
- }
12658
- function specShape(spec) {
12659
- const ctorName = spec.ctor?.name ?? "anon";
12660
- const methods = Object.keys(spec.methods ?? {}).sort().join(",");
12661
- const statics = Object.keys(spec.staticMethods ?? {}).sort().join(",");
12662
- const accessors = Object.keys(spec.accessors ?? {}).sort().join(",");
12663
- const fields = Object.keys(spec.statics ?? {}).sort().join(",");
12664
- const instFields = (spec.instanceFields ?? []).map((f) => f.name ?? "<computed>").sort().join(",");
12665
- return `${ctorName}[${methods}](${statics}){${accessors}}{${fields}}{${instFields}}`;
12666
- }
12667
- function registerEvalClass(spec) {
12668
- const prev = classRegistry.get(spec.name);
12669
- const prevEpoch = classEpochs.get(spec.name);
12670
- if (prev && prev !== spec && // 同 epoch(同一次 run 内)注册两次才可能是真碰撞:
12671
- // 块级作用域同名类。跨 epoch = 顺序重注册(常态)。
12672
- prevEpoch === classEpoch && specShape(prev) !== specShape(spec)) {
12673
- classCollisions.push({
12674
- name: spec.name,
12675
- previous: specShape(prev),
12676
- next: specShape(spec)
12677
- });
12678
- }
12679
- classRegistry.set(spec.name, spec);
12680
- classEpochs.set(spec.name, classEpoch);
12681
- }
12682
- function getEvalClass(name) {
12683
- return classRegistry.get(name);
12684
- }
12685
- function clearBClasses() {
12686
- classRegistry.clear();
12687
- classEpochs.clear();
12688
- classCollisions.length = 0;
12689
- }
12690
-
12691
12747
  // src/algebra/exec/runtime/members.ts
12692
12748
  function $objAccessorKey(o, key, get, set) {
12693
12749
  const pk = propertyKeyOf(key);
@@ -14805,7 +14861,18 @@ function $spread(a, b) {
14805
14861
  }
14806
14862
  }
14807
14863
  const aa = asAbsVal(a);
14808
- const b0 = bb;
14864
+ let b0 = bb;
14865
+ {
14866
+ const ciInner = classInstanceInnerOf(b0);
14867
+ if (ciInner) {
14868
+ const ciSlots = ciInner.shape.slots;
14869
+ const pub = {};
14870
+ for (const k of enumOwnKeys(ciInner, ciSlots)) {
14871
+ setSlot(pub, k, getSlot(ciSlots, k));
14872
+ }
14873
+ b0 = abs({ k: "obj", slots: pub }, void 0, void 0, b0.conf);
14874
+ }
14875
+ }
14809
14876
  if (aa?.shape?.k === "any" || b0?.shape?.k === "any") {
14810
14877
  const base = spread(
14811
14878
  aa?.shape?.k === "any" ? abs({ k: "obj", slots: {}, open: true }, void 0, void 0, "partial") : aa,
@@ -15607,7 +15674,7 @@ function $collectionForEach(recv, cb) {
15607
15674
  }
15608
15675
  return void 0;
15609
15676
  }
15610
- function $set(o, key, value) {
15677
+ function $set(o, key, value, opts) {
15611
15678
  privateNameGuard(o, key);
15612
15679
  if (!o || typeof o !== "object" || !("shape" in o)) {
15613
15680
  return o;
@@ -15632,12 +15699,16 @@ function $set(o, key, value) {
15632
15699
  throwStrictWrite();
15633
15700
  }
15634
15701
  if (getPropFlags(o)?.get(key)?.writable === false) throwStrictWrite();
15635
- setSlot(inner2.shape.slots, key, { value: asAbsVal(value) });
15702
+ const prevSlot2 = getSlot(inner2.shape.slots, key);
15703
+ setSlot(inner2.shape.slots, key, {
15704
+ value: asAbsVal(value),
15705
+ ...prevSlot2?.internal || opts?.internal ? { internal: true } : {}
15706
+ });
15636
15707
  clearStaleTermPred(o);
15637
15708
  return o;
15638
15709
  }
15639
15710
  }
15640
- const inner = $set(o.shape.shape, key, value);
15711
+ const inner = $set(o.shape.shape, key, value, opts);
15641
15712
  const next = abs(
15642
15713
  { k: "brand", name: o.shape.name, shape: inner },
15643
15714
  o.term,
@@ -15732,7 +15803,11 @@ function $set(o, key, value) {
15732
15803
  if (key === "__proto__" && !isNullProtoObj(o)) {
15733
15804
  return $setProto(o, value);
15734
15805
  }
15735
- setSlot(shape2.slots, key, { value: asAbsVal(value) });
15806
+ const prevSlot = getSlot(shape2.slots, key);
15807
+ setSlot(shape2.slots, key, {
15808
+ value: asAbsVal(value),
15809
+ ...prevSlot?.internal || opts?.internal ? { internal: true } : {}
15810
+ });
15736
15811
  o.conf = confJoin(o.conf, value.conf);
15737
15812
  clearStaleTermPred(o);
15738
15813
  return o;
@@ -18898,7 +18973,7 @@ function applyInstanceFields(spec, thisVal) {
18898
18973
  }
18899
18974
  }
18900
18975
  if (!key) continue;
18901
- cur = $set(cur, key, asAbsVal(f.init(cur)));
18976
+ cur = $set(cur, key, asAbsVal(f.init(cur)), { internal: f.private === true });
18902
18977
  }
18903
18978
  return cur;
18904
18979
  }
@@ -20214,13 +20289,68 @@ function invokeArrMethod(arr, method, args) {
20214
20289
  );
20215
20290
  }
20216
20291
  if (method === "concat") {
20292
+ const argObjShapeOf = (v2) => {
20293
+ const s = v2.shape;
20294
+ if (s.k === "obj") return s;
20295
+ if (s.k === "brand" && s.shape.shape.k === "obj") return s.shape.shape;
20296
+ return void 0;
20297
+ };
20298
+ const spreadableOf = (v2) => {
20299
+ const o = argObjShapeOf(v2);
20300
+ const slot = o ? getSlot(o.slots, "@@isConcatSpreadable") : void 0;
20301
+ if (!slot) return "absent";
20302
+ const lv = litValue(slot.value);
20303
+ if (!lv.ok) return "abstract";
20304
+ const w = lv.value;
20305
+ if (w === void 0 || w === null || w === false || w === "" || w === 0n || typeof w === "number" && (w === 0 || Number.isNaN(w))) {
20306
+ return "false";
20307
+ }
20308
+ return "true";
20309
+ };
20310
+ const spreadElsOf = (v2) => {
20311
+ const o = argObjShapeOf(v2);
20312
+ if (!o) return null;
20313
+ const lenAbs = getSlot(o.slots, "length")?.value;
20314
+ if (!lenAbs || isNullishLitAbs(lenAbs)) return [];
20315
+ const lv = litValue(lenAbs);
20316
+ if (!lv.ok || typeof lv.value !== "number") return null;
20317
+ const t = Math.trunc(lv.value);
20318
+ if (t > TUPLE_MATERIALIZE_CAP) return null;
20319
+ const n = t < 0 ? 0 : t;
20320
+ const els = [];
20321
+ for (let i = 0; i < n; i++) els.push(getSlot(o.slots, String(i))?.value ?? undefAbs());
20322
+ return els;
20323
+ };
20324
+ const spreadPossiblesOf = (v2) => {
20325
+ const o = argObjShapeOf(v2);
20326
+ const parts2 = [v2, undefAbs()];
20327
+ if (o) {
20328
+ for (const [k, s] of Object.entries(o.slots)) {
20329
+ if (canonicalArrayIndex(k) !== void 0) parts2.push(s.value);
20330
+ }
20331
+ if (o.index) parts2.push(o.index.value);
20332
+ }
20333
+ return parts2.reduce((x, y) => joinAbs(x, y));
20334
+ };
20217
20335
  if (shape2.k === "tuple") {
20218
20336
  const out = [...shape2.elements];
20219
20337
  const holesC = new Set(holes);
20220
20338
  let degraded = false;
20221
20339
  for (const a of args) {
20222
20340
  const aa = asAbs(a) ?? unknown;
20223
- if (aa.shape.k === "tuple") {
20341
+ const spread2 = spreadableOf(aa);
20342
+ if (spread2 === "true") {
20343
+ const els = spreadElsOf(aa);
20344
+ if (els === null) {
20345
+ out.push(spreadPossiblesOf(aa));
20346
+ degraded = true;
20347
+ } else out.push(...els);
20348
+ } else if (spread2 === "false") {
20349
+ out.push(aa);
20350
+ } else if (spread2 === "abstract") {
20351
+ out.push(spreadPossiblesOf(aa));
20352
+ degraded = true;
20353
+ } else if (aa.shape.k === "tuple") {
20224
20354
  const argHoles = aa.shape.holes ?? [];
20225
20355
  const base = out.length;
20226
20356
  for (let i = 0; i < aa.shape.elements.length; i++) {
@@ -20248,10 +20378,26 @@ function invokeArrMethod(arr, method, args) {
20248
20378
  confJoin(arr.conf, "path")
20249
20379
  );
20250
20380
  }
20251
- const parts = [shape2.element, ...args.map((a) => {
20381
+ const parts = [shape2.element];
20382
+ for (const a of args) {
20252
20383
  const aa = asAbs(a) ?? unknown;
20253
- return aa.shape.k === "arr" || aa.shape.k === "tuple" ? aa.shape.k === "arr" ? aa.shape.element : aa.shape.elements.length ? aa.shape.elements.reduce((x, y) => joinAbs(x, y)) : unknown : aa;
20254
- })];
20384
+ const spread2 = spreadableOf(aa);
20385
+ if (spread2 === "true") {
20386
+ const els = spreadElsOf(aa);
20387
+ if (els === null) parts.push(spreadPossiblesOf(aa));
20388
+ else parts.push(...els);
20389
+ } else if (spread2 === "false") {
20390
+ parts.push(aa);
20391
+ } else if (spread2 === "abstract") {
20392
+ parts.push(spreadPossiblesOf(aa));
20393
+ } else if (aa.shape.k === "arr") {
20394
+ parts.push(aa.shape.element);
20395
+ } else if (aa.shape.k === "tuple") {
20396
+ parts.push(
20397
+ aa.shape.elements.length ? aa.shape.elements.reduce((x, y) => joinAbs(x, y)) : unknown
20398
+ );
20399
+ } else parts.push(aa);
20400
+ }
20255
20401
  return abs(
20256
20402
  { k: "arr", element: parts.reduce((x, y) => joinAbs(x, y)) },
20257
20403
  void 0,
@@ -22167,6 +22313,16 @@ function assignSourceSlots(src) {
22167
22313
  }
22168
22314
  return void 0;
22169
22315
  }
22316
+ {
22317
+ const inner = classInstanceInnerOf(src);
22318
+ if (inner) {
22319
+ const slots = {};
22320
+ for (const k of enumOwnKeys(inner, inner.shape.slots)) {
22321
+ setSlot(slots, k, getSlot(inner.shape.slots, k));
22322
+ }
22323
+ return slots;
22324
+ }
22325
+ }
22170
22326
  if (s.k === "prim") return s.type === "string" ? void 0 : {};
22171
22327
  if (s.k === "eff" || s.k === "never") return {};
22172
22328
  return void 0;
@@ -22481,9 +22637,15 @@ function evalObjectMethod(name, args) {
22481
22637
  const enumKeys = (slots, target) => {
22482
22638
  const flags = getPropFlags(target);
22483
22639
  return Object.keys(slots).filter(
22484
- (k) => flags?.get(k)?.enumerable !== false
22640
+ (k) => flags?.get(k)?.enumerable !== false && slots[k]?.internal !== true
22485
22641
  );
22486
22642
  };
22643
+ const classInstanceEnumEntries = (a02) => {
22644
+ const inner = a02 ? classInstanceInnerOf(a02) : void 0;
22645
+ if (!inner) return void 0;
22646
+ const slots = inner.shape.slots;
22647
+ return enumOwnKeys(inner, slots).map((k) => [k, getSlot(slots, k).value]);
22648
+ };
22487
22649
  switch (name) {
22488
22650
  case "create": {
22489
22651
  if (a0 === void 0 || a0.term?.op === "lit" && a0.term.value === void 0) {
@@ -22584,6 +22746,10 @@ function evalObjectMethod(name, args) {
22584
22746
  if (builtinBrandNoEnumKeys(a0)) {
22585
22747
  return abs({ k: "tuple", elements: [] }, void 0, void 0, "exact");
22586
22748
  }
22749
+ const ciKeys = classInstanceEnumEntries(a0);
22750
+ if (ciKeys) {
22751
+ return abs({ k: "tuple", elements: ciKeys.map(([k]) => strLit(k)) }, void 0, void 0, "exact");
22752
+ }
22587
22753
  }
22588
22754
  noteRecvMayNullish(a0, "Object.keys receiver ToObject");
22589
22755
  return abs({ k: "arr", element: str2("path") }, void 0, void 0, "partial");
@@ -22638,6 +22804,10 @@ function evalObjectMethod(name, args) {
22638
22804
  if (builtinBrandNoEnumKeys(a0)) {
22639
22805
  return abs({ k: "tuple", elements: [] }, void 0, void 0, "exact");
22640
22806
  }
22807
+ const ciVals = classInstanceEnumEntries(a0);
22808
+ if (ciVals) {
22809
+ return abs({ k: "tuple", elements: ciVals.map(([, v2]) => v2) }, void 0, void 0, "exact");
22810
+ }
22641
22811
  }
22642
22812
  noteRecvMayNullish(a0, "Object.values receiver ToObject");
22643
22813
  return abs({ k: "arr", element: unknown }, void 0, void 0, "partial");
@@ -22715,6 +22885,20 @@ function evalObjectMethod(name, args) {
22715
22885
  if (builtinBrandNoEnumKeys(a0)) {
22716
22886
  return abs({ k: "tuple", elements: [] }, void 0, void 0, "exact");
22717
22887
  }
22888
+ const ciEntries = classInstanceEnumEntries(a0);
22889
+ if (ciEntries) {
22890
+ return abs(
22891
+ {
22892
+ k: "tuple",
22893
+ elements: ciEntries.map(
22894
+ ([k, v2]) => abs({ k: "tuple", elements: [strLit(k), v2] }, void 0, void 0, "exact")
22895
+ )
22896
+ },
22897
+ void 0,
22898
+ void 0,
22899
+ "exact"
22900
+ );
22901
+ }
22718
22902
  }
22719
22903
  noteRecvMayNullish(a0, "Object.entries receiver ToObject");
22720
22904
  return abs({ k: "arr", element: unknown }, void 0, void 0, "partial");
@@ -22730,10 +22914,24 @@ function evalObjectMethod(name, args) {
22730
22914
  if (typeof key !== "string") return boolPrim();
22731
22915
  if (a0.shape.k === "obj") {
22732
22916
  const shape2 = a0.shape;
22917
+ if (shape2.slots[key]?.internal === true) {
22918
+ return boolLit(false);
22919
+ }
22733
22920
  if (Object.prototype.hasOwnProperty.call(shape2.slots, key)) return boolLit(true);
22734
22921
  if (!shape2.open && a0.conf === "exact") return boolLit(false);
22735
22922
  return boolPrim();
22736
22923
  }
22924
+ {
22925
+ const inner = classInstanceInnerOf(a0);
22926
+ if (inner) {
22927
+ const slots = inner.shape.slots;
22928
+ const slot = getSlot(slots, key);
22929
+ if (slot?.internal) return boolLit(false);
22930
+ if (slot && !slot.optional) return boolLit(true);
22931
+ if (slot?.optional) return boolPrim();
22932
+ return boolLit(false);
22933
+ }
22934
+ }
22737
22935
  return boolPrim();
22738
22936
  }
22739
22937
  case "getPrototypeOf": {
@@ -22966,6 +23164,7 @@ function evalObjectMethod(name, args) {
22966
23164
  if (os.open || os.index) {
22967
23165
  const slots = {};
22968
23166
  for (const key of Object.keys(os.slots)) {
23167
+ if (os.slots[key]?.internal === true) continue;
22969
23168
  const value = os.slots[key].value;
22970
23169
  const flags = getPropFlags(a0)?.get(key);
22971
23170
  slots[key] = {
@@ -22979,9 +23178,7 @@ function evalObjectMethod(name, args) {
22979
23178
  }
22980
23179
  return abs({ k: "obj", slots, open: true }, void 0, void 0, "partial");
22981
23180
  }
22982
- const entries = Object.keys(os.slots).map(
22983
- (key) => [key, os.slots[key].value]
22984
- );
23181
+ const entries = Object.keys(os.slots).filter((key) => os.slots[key]?.internal !== true).map((key) => [key, os.slots[key].value]);
22985
23182
  const flagsMap = getPropFlags(a0);
22986
23183
  return descSlotsOf(entries, (key) => {
22987
23184
  const f = flagsMap?.get(key);
@@ -23057,12 +23254,28 @@ function evalObjectMethod(name, args) {
23057
23254
  if (builtinBrandNoEnumKeys(a0)) {
23058
23255
  return abs({ k: "tuple", elements: [] }, void 0, void 0, "exact");
23059
23256
  }
23257
+ {
23258
+ const inner2 = classInstanceInnerOf(a0);
23259
+ if (inner2) {
23260
+ const os = inner2.shape;
23261
+ const names = Object.keys(os.slots).filter((k) => os.slots[k].internal !== true);
23262
+ return abs(
23263
+ { k: "tuple", elements: names.map((n) => strLit(n)) },
23264
+ void 0,
23265
+ void 0,
23266
+ "exact"
23267
+ );
23268
+ }
23269
+ }
23060
23270
  }
23061
23271
  if (a0.shape.k === "obj") {
23062
23272
  const os = a0.shape;
23063
23273
  if (!os.open && !os.index) {
23064
23274
  return abs(
23065
- { k: "tuple", elements: Object.keys(os.slots).map((n) => strLit(n)) },
23275
+ {
23276
+ k: "tuple",
23277
+ elements: Object.keys(os.slots).filter((n) => os.slots[n]?.internal !== true).map((n) => strLit(n))
23278
+ },
23066
23279
  void 0,
23067
23280
  void 0,
23068
23281
  "exact"
@@ -23099,39 +23312,45 @@ function evalObjectMethod(name, args) {
23099
23312
  const key = typeof kv === "string" || typeof kv === "number" ? String(kv) : void 0;
23100
23313
  const mkDesc = mkPropDescAbs;
23101
23314
  const maybeDesc = maybePropDescAbs;
23315
+ const accessorDescOf = (target, key2) => {
23316
+ const acc = lookupObjAccessor(target, key2);
23317
+ if (!acc) return void 0;
23318
+ const flags = getPropFlags(target)?.get(key2);
23319
+ const wrapGet = (thunk) => absFunction(["_this"], {
23320
+ body: noBody,
23321
+ apply: (_args, thisVal) => thunk(thisVal ?? target)
23322
+ });
23323
+ const wrapSet = (thunk) => absFunction(["_this", "value"], {
23324
+ body: noBody,
23325
+ apply: (args2, thisVal) => {
23326
+ thunk(thisVal ?? target, args2[0] ?? undefAbs());
23327
+ return undefAbs();
23328
+ }
23329
+ });
23330
+ return abs(
23331
+ {
23332
+ k: "obj",
23333
+ slots: {
23334
+ get: { value: acc.get ? wrapGet(acc.get) : undefAbs() },
23335
+ set: { value: acc.set ? wrapSet(acc.set) : undefAbs() },
23336
+ enumerable: { value: boolLit(flags?.enumerable !== false) },
23337
+ configurable: { value: boolLit(flags?.configurable !== false) }
23338
+ }
23339
+ },
23340
+ void 0,
23341
+ void 0,
23342
+ "exact"
23343
+ );
23344
+ };
23102
23345
  if (a0.shape.k === "obj") {
23103
23346
  const os = a0.shape;
23104
23347
  if (os.open || os.index || key === void 0) return maybeDesc();
23348
+ if (os.slots[key]?.internal === true) {
23349
+ return undefAbs();
23350
+ }
23105
23351
  if (Object.prototype.hasOwnProperty.call(os.slots, key)) {
23106
- const acc = lookupObjAccessor(a0, key);
23107
- if (acc) {
23108
- const flags2 = getPropFlags(a0)?.get(key);
23109
- const wrapGet = (thunk) => absFunction(["_this"], {
23110
- body: noBody,
23111
- apply: (_args, thisVal) => thunk(thisVal ?? a0)
23112
- });
23113
- const wrapSet = (thunk) => absFunction(["_this", "value"], {
23114
- body: noBody,
23115
- apply: (args2, thisVal) => {
23116
- thunk(thisVal ?? a0, args2[0] ?? undefAbs());
23117
- return undefAbs();
23118
- }
23119
- });
23120
- return abs(
23121
- {
23122
- k: "obj",
23123
- slots: {
23124
- get: { value: acc.get ? wrapGet(acc.get) : undefAbs() },
23125
- set: { value: acc.set ? wrapSet(acc.set) : undefAbs() },
23126
- enumerable: { value: boolLit(flags2?.enumerable !== false) },
23127
- configurable: { value: boolLit(flags2?.configurable !== false) }
23128
- }
23129
- },
23130
- void 0,
23131
- void 0,
23132
- "exact"
23133
- );
23134
- }
23352
+ const accDesc = accessorDescOf(a0, key);
23353
+ if (accDesc) return accDesc;
23135
23354
  const flags = getPropFlags(a0)?.get(key);
23136
23355
  return mkDesc(
23137
23356
  readProperty(a0, key),
@@ -23143,6 +23362,27 @@ function evalObjectMethod(name, args) {
23143
23362
  if (a0.conf === "exact") return undefAbs();
23144
23363
  return maybeDesc();
23145
23364
  }
23365
+ {
23366
+ const inner = classInstanceInnerOf(a0);
23367
+ if (inner && key !== void 0) {
23368
+ const slots = inner.shape.slots;
23369
+ if (slots[key]?.internal === true) {
23370
+ return undefAbs();
23371
+ }
23372
+ if (Object.prototype.hasOwnProperty.call(slots, key)) {
23373
+ const accDesc = accessorDescOf(inner, key);
23374
+ if (accDesc) return accDesc;
23375
+ const flags = getPropFlags(a0)?.get(key);
23376
+ return mkDesc(
23377
+ slots[key].value,
23378
+ flags?.writable !== false,
23379
+ flags?.enumerable !== false,
23380
+ flags?.configurable !== false
23381
+ );
23382
+ }
23383
+ return undefAbs();
23384
+ }
23385
+ }
23146
23386
  if (a0.shape.k === "tuple" && key !== void 0) {
23147
23387
  const holes = a0.shape.holes ?? [];
23148
23388
  if (key === "length") {
@@ -23782,11 +24022,15 @@ function errorBrandAbs(name, args) {
23782
24022
  const cause = Object.prototype.hasOwnProperty.call(optionsArg.shape.slots, "cause") ? optionsArg.shape.slots["cause"].value : undefAbs();
23783
24023
  slots["cause"] = { value: cause };
23784
24024
  }
24025
+ const errInner = objOf(slots);
24026
+ for (const k of Object.keys(slots)) {
24027
+ setPropFlags(errInner, k, { enumerable: false });
24028
+ }
23785
24029
  return abs(
23786
24030
  {
23787
24031
  k: "brand",
23788
24032
  name,
23789
- shape: objOf(slots)
24033
+ shape: errInner
23790
24034
  },
23791
24035
  void 0,
23792
24036
  void 0,
@@ -26276,6 +26520,9 @@ export {
26276
26520
  resetEvalForkBudget,
26277
26521
  bumpEvalForkBudget,
26278
26522
  evalMathMethod,
26523
+ registerEvalClass,
26524
+ getEvalClass,
26525
+ clearBClasses,
26279
26526
  evalJsonMethod,
26280
26527
  evalNumberStatic,
26281
26528
  makeArrayCtorAbs,
@@ -26391,9 +26638,6 @@ export {
26391
26638
  isEvalMissingSlotEnabled,
26392
26639
  runWithEvalMissingSlot,
26393
26640
  noteObjSlotMissing,
26394
- registerEvalClass,
26395
- getEvalClass,
26396
- clearBClasses,
26397
26641
  $objAccessorKey,
26398
26642
  $in,
26399
26643
  $instanceof,
package/dist/exec.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as Abs, M as MayThrowEffect, b as Phi } from './run-dg1bW60I.js';
2
- export { W as $assignRecord, X as $call, Y as $callNamed, bI as $nodoPos, Z as $recordBinding, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, g as EvalFallbackStats, a8 as EvalPosRecord, ab as MAX_EVAL_CALL_DEPTH, ac as MAX_EVAL_TOTAL_CALLS, ad as RUNTIME_IMPORT_RE, V as RunTranspiledOptions, af as TranspiledCallResult, at as bindingsOf, aw as callTranspiledExport, ax as callTranspiledExportApply, ay as callTranspiledExportFull, l as clearPureCallMemo, m as clearPureMemo, n as enterEvalCallBudgetSession, aD as evalExprAbs, p as exitEvalCallBudgetSession, v as getEvalCallBudgetState, aG as getEvalCallCollector, w as getEvalFallbackStats, bJ as getPosCollector, aO as isAbsVal, aQ as isCjsMainRun, b5 as noteEvalCallRecord, b6 as noteEvalFallback, bn as resetEvalCallBudget, H as resetEvalFallbackStats, bK as routeApplyThrows, bo as runTranspiled, bp as runTranspiledOptionsMemoKey, bq as setEvalAssignCollector, br as setEvalBindingSink, bs as setEvalCallCollector, bt as setEvalFallbackCollector, bv as setPosCollector, bF as tryRunTranspiled, O as withEvalBudgetOverride } from './run-dg1bW60I.js';
1
+ import { A as Abs, M as MayThrowEffect, b as Phi } from './run-DaqGgSre.js';
2
+ export { W as $assignRecord, X as $call, Y as $callNamed, bI as $nodoPos, Z as $recordBinding, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, g as EvalFallbackStats, a8 as EvalPosRecord, ab as MAX_EVAL_CALL_DEPTH, ac as MAX_EVAL_TOTAL_CALLS, ad as RUNTIME_IMPORT_RE, V as RunTranspiledOptions, af as TranspiledCallResult, at as bindingsOf, aw as callTranspiledExport, ax as callTranspiledExportApply, ay as callTranspiledExportFull, l as clearPureCallMemo, m as clearPureMemo, n as enterEvalCallBudgetSession, aD as evalExprAbs, p as exitEvalCallBudgetSession, v as getEvalCallBudgetState, aG as getEvalCallCollector, w as getEvalFallbackStats, bJ as getPosCollector, aO as isAbsVal, aQ as isCjsMainRun, b5 as noteEvalCallRecord, b6 as noteEvalFallback, bn as resetEvalCallBudget, H as resetEvalFallbackStats, bK as routeApplyThrows, bo as runTranspiled, bp as runTranspiledOptionsMemoKey, bq as setEvalAssignCollector, br as setEvalBindingSink, bs as setEvalCallCollector, bt as setEvalFallbackCollector, bv as setPosCollector, bF as tryRunTranspiled, O as withEvalBudgetOverride } from './run-DaqGgSre.js';
3
3
  import { Node, Expression, File } from '@babel/types';
4
4
 
5
5
  /**
@@ -426,8 +426,12 @@ declare function $get(o: Abs, key: string, opts?: {
426
426
  * 回调返回值丢弃;forEach 表达式值恒 undefined。
427
427
  */
428
428
  declare function $collectionForEach(recv: Abs, cb: unknown): Abs | undefined;
429
- /** 成员写:返回新 obj/brand(不可变更新);frozen/sealed/只读目标按 sloppy 静默失败 */
430
- declare function $set(o: Abs, key: string, value: Abs): Abs;
429
+ /** 成员写:返回新 obj/brand(不可变更新);frozen/sealed/只读目标按 sloppy 静默失败。
430
+ * opts.internal(Bug 84):私有字段落地——槽打 Slot.internal 标记;后续覆写
431
+ * 保留既有标记(this.#x = v 不丢失 internal)。 */
432
+ declare function $set(o: Abs, key: string, value: Abs, opts?: {
433
+ internal?: boolean;
434
+ }): Abs;
431
435
 
432
436
  /**
433
437
  * async / await / generator / ??($nullishTest / $removeNullish)。
@@ -727,6 +731,12 @@ type EvalClassSpec = {
727
731
  name?: string;
728
732
  key?: (thisVal: Abs) => Abs;
729
733
  init: (thisVal: Abs) => Abs;
734
+ /**
735
+ * Bug 84:PrivateName 声明的私有字段(transpile 期标记)——落地槽打
736
+ * Slot.internal,对所有属性 introspection 不可见(内部槽语义);
737
+ * 计算键公共字段(如 ["#x"])不带此标记(同键空间共存)。
738
+ */
739
+ private?: boolean;
730
740
  }>;
731
741
  /**
732
742
  * Bug 60:计算键成员——synth 名 → 键 Abs(定义期求值,求值本身即
package/dist/exec.js CHANGED
@@ -202,7 +202,7 @@ import {
202
202
  withAssumePremises,
203
203
  withEvalBudgetOverride,
204
204
  withExecPhi
205
- } from "./chunk-NEKTOZLJ.js";
205
+ } from "./chunk-GL6VOF75.js";
206
206
  export {
207
207
  $absVal,
208
208
  $add,
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { d as AstEnv, A as Abs, b as Phi, T as Term, Q as HofCollectCtx, C as Confidence, S as Shape, a as Pred, R as RelSource, U as HofSite, c as AbsModuleExports, V as RunTranspiledOptions } from './run-dg1bW60I.js';
2
- export { W as $assignRecord, X as $call, Y as $callNamed, Z as $recordBinding, _ as AbsApplyNoThrow, a0 as AbsApplyNoThrowFn, a1 as AbsApplyResult, a2 as AbsApplyReturn, a3 as AbsFnImpl, a4 as AbsSigImpl, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, a8 as EvalPosRecord, a9 as ImplicationOracle, aa as LitValueResult, L as LiteralValue, ab as MAX_EVAL_CALL_DEPTH, ac as MAX_EVAL_TOTAL_CALLS, P as PrimName, ad as RUNTIME_IMPORT_RE, ae as TYPEOF_NAMES, af as TranspiledCallResult, ag as TypeofName, ah as abs, ai as absFunction, aj as absOnly, ak as absToString, al as and, am as anyAbs, an as anyVar, ao as app, ap as assumeFinite, aq as attachFnImpl, ar as bigintLit, as as bindImports, at as bindingsOf, au as bool, av as boolLit, aw as callTranspiledExport, ax as callTranspiledExportApply, ay as callTranspiledExportFull, az as collectAbsExports, aA as confJoin, aB as emptyPhi, aC as eq, aD as evalExprAbs, aE as ge, aF as geNum, aG as getEvalCallCollector, aH as getFnImpl, aI as getImplicationOracle, aJ as gt, aK as gtNum, aL as hostFnCtorFacet, aM as implies, aN as isAbsApplyResult, aO as isAbsVal, aP as isBigPrim, aQ as isCjsMainRun, aR as isExactLit, aS as isNumPrim, aT as isStrPrim, aU as le, aV as leNum, aW as lit, aX as litValue, aY as lt, aZ as ltNum, a_ as makeAbsApplyResult, a$ as markPureFn, b0 as namespaceAbsOf, b1 as ne, b2 as negatePred, b3 as never, b4 as not, b5 as noteEvalCallRecord, b6 as noteEvalFallback, b7 as num, b8 as numLit, b9 as numVar, ba as obj, bb as or, bc as pFalse, bd as pTrue, be as phiAnd, bf as predEquals, bg as predToString, bh as predVars, bi as primToTypeof, bj as ptypeof, bk as pureFnNameOf, bl as relationFingerprint, bm as relationFn, bn as resetEvalCallBudget, bo as runTranspiled, bp as runTranspiledOptionsMemoKey, bq as setEvalAssignCollector, br as setEvalBindingSink, bs as setEvalCallCollector, bt as setEvalFallbackCollector, bu as setImplicationOracle, bv as setPosCollector, bw as shapeOfTerm, bx as shapeOnlyFn, by as shapeToString, bz as simplifyTerm, bA as str, bB as strLit, bC as substPred, bD as termEquals, bE as termToString, bF as tryRunTranspiled, bG as unknown, bH as v } from './run-dg1bW60I.js';
1
+ import { d as AstEnv, A as Abs, b as Phi, T as Term, Q as HofCollectCtx, C as Confidence, S as Shape, a as Pred, R as RelSource, U as HofSite, c as AbsModuleExports, V as RunTranspiledOptions } from './run-DaqGgSre.js';
2
+ export { W as $assignRecord, X as $call, Y as $callNamed, Z as $recordBinding, _ as AbsApplyNoThrow, a0 as AbsApplyNoThrowFn, a1 as AbsApplyResult, a2 as AbsApplyReturn, a3 as AbsFnImpl, a4 as AbsSigImpl, a5 as EvalAbsAssignRecord, a6 as EvalCallRecord, a7 as EvalFallback, a8 as EvalPosRecord, a9 as ImplicationOracle, aa as LitValueResult, L as LiteralValue, ab as MAX_EVAL_CALL_DEPTH, ac as MAX_EVAL_TOTAL_CALLS, P as PrimName, ad as RUNTIME_IMPORT_RE, ae as TYPEOF_NAMES, af as TranspiledCallResult, ag as TypeofName, ah as abs, ai as absFunction, aj as absOnly, ak as absToString, al as and, am as anyAbs, an as anyVar, ao as app, ap as assumeFinite, aq as attachFnImpl, ar as bigintLit, as as bindImports, at as bindingsOf, au as bool, av as boolLit, aw as callTranspiledExport, ax as callTranspiledExportApply, ay as callTranspiledExportFull, az as collectAbsExports, aA as confJoin, aB as emptyPhi, aC as eq, aD as evalExprAbs, aE as ge, aF as geNum, aG as getEvalCallCollector, aH as getFnImpl, aI as getImplicationOracle, aJ as gt, aK as gtNum, aL as hostFnCtorFacet, aM as implies, aN as isAbsApplyResult, aO as isAbsVal, aP as isBigPrim, aQ as isCjsMainRun, aR as isExactLit, aS as isNumPrim, aT as isStrPrim, aU as le, aV as leNum, aW as lit, aX as litValue, aY as lt, aZ as ltNum, a_ as makeAbsApplyResult, a$ as markPureFn, b0 as namespaceAbsOf, b1 as ne, b2 as negatePred, b3 as never, b4 as not, b5 as noteEvalCallRecord, b6 as noteEvalFallback, b7 as num, b8 as numLit, b9 as numVar, ba as obj, bb as or, bc as pFalse, bd as pTrue, be as phiAnd, bf as predEquals, bg as predToString, bh as predVars, bi as primToTypeof, bj as ptypeof, bk as pureFnNameOf, bl as relationFingerprint, bm as relationFn, bn as resetEvalCallBudget, bo as runTranspiled, bp as runTranspiledOptionsMemoKey, bq as setEvalAssignCollector, br as setEvalBindingSink, bs as setEvalCallCollector, bt as setEvalFallbackCollector, bu as setImplicationOracle, bv as setPosCollector, bw as shapeOfTerm, bx as shapeOnlyFn, by as shapeToString, bz as simplifyTerm, bA as str, bB as strLit, bC as substPred, bD as termEquals, bE as termToString, bF as tryRunTranspiled, bG as unknown, bH as v } from './run-DaqGgSre.js';
3
3
  import { Node, File } from '@babel/types';
4
- import { p as parseSource, L as LeakBudget, E as EffectiveInterfaceOpts, b as LoadDepsFingerprint, v as CheckReport, N as NudoConstraint, c as ProjectionBudget } from './projection-budget-PN_0_9D3.js';
5
- export { w as CONSTRAINT_BUILDERS, x as CONSTRAINT_BUILDER_NAMES, y as CONSTRAINT_EXPR_RE, z as CheckAction, C as CheckIssue, A as CheckJson, B as CheckJsonMulti, D as ConstraintBuilder, F as Diagnostic, G as EffectiveInterface, H as GitlabCodeQualityIssue, J as INTERFACE_SOURCE_ABBR, K as InterfaceDiag, I as InterfaceSource, O as InterfaceTierInfo, a as InterfaceTierOpts, Q as NamedImport, R as NudoField, S as NudoFnConstraint, T as NudoSidecarError, U as NudoSig, V as RefineDiag, W as RefineEntry, X as RefineResolveOpts, Y as SELF, Z as actionsForIssue, _ as andC, $ as any, a0 as array, a1 as boolean, a2 as checkArg, a3 as checkCall, a4 as constraintAdmitsNullish, a5 as constraintToEntryAbs, a6 as derefConstraint, a7 as drainPromiseMicros, a8 as effectiveInterface, a9 as enterPromiseExecutorScope, aa as evalPromiseCtor, ab as evalPromiseMethod, ac as evalPromiseStatic, ad as execNudoModule, ae as extractDeclaredThrows, af as extractFnBudget, ag as extractNudoImports, ah as extractRefineReturnFromSource, ai as extractRefinesFromSource, aj as fn, ak as fnConstraintToEntryReqs, al as formatCheckReport, am as formatConstraint, an as formatDiagnostics, ao as formatEffectiveInterfaceDisplay, ap as formatGithubAnnotations, aq as formatGitlabCodeQuality, ar as formatInterfaceTierLine, as as generatedExportNames, at as getParseSourceCacheSize, au as getTerm, av as instantiateConstraint, aw as interfaceDiagCount, ax as interfaceSourceOf, ay as interfaceTierOf, az as isIntFlag, aA as isNodeModulesPath, aB as isNudoConstraint, aC as lazy, aD as leavePromiseExecutorScope, aE as lenTerm, aF as litC, aG as localNamedExports, aH as notePromiseExecutorFork, aI as nullable, aJ as number, aK as omit, aL as partial, aM as pick, aN as queuePromiseMicro, aO as refineDiagCount, aP as refineToIndexedFull, aQ as resetNudoModuleExecCache, aR as resetParseSourceCache, aS as resetSidecarLoadFailureCache, aT as serializeCheckJson, aU as serializeCheckJsonMulti, aV as setInterfaceDiagCollector, aW as setRefineDiagCollector, aX as shape, aY as sidecarClosureFingerprint, aZ as sidecarPathOf, a_ as string, a$ as takeInterfaceDiags, b0 as takeInterfaceDiagsSince, b1 as takeRefineDiags, b2 as takeRefineDiagsSince, b3 as throwConstraintToKinds, b4 as union } from './projection-budget-PN_0_9D3.js';
4
+ import { p as parseSource, L as LeakBudget, E as EffectiveInterfaceOpts, b as LoadDepsFingerprint, v as CheckReport, N as NudoConstraint, c as ProjectionBudget } from './projection-budget-CeoxA06q.js';
5
+ export { w as CONSTRAINT_BUILDERS, x as CONSTRAINT_BUILDER_NAMES, y as CONSTRAINT_EXPR_RE, z as CheckAction, C as CheckIssue, A as CheckJson, B as CheckJsonMulti, D as ConstraintBuilder, F as Diagnostic, G as EffectiveInterface, H as GitlabCodeQualityIssue, J as INTERFACE_SOURCE_ABBR, K as InterfaceDiag, I as InterfaceSource, O as InterfaceTierInfo, a as InterfaceTierOpts, Q as NamedImport, R as NudoField, S as NudoFnConstraint, T as NudoSidecarError, U as NudoSig, V as RefineDiag, W as RefineEntry, X as RefineResolveOpts, Y as SELF, Z as actionsForIssue, _ as andC, $ as any, a0 as array, a1 as boolean, a2 as checkArg, a3 as checkCall, a4 as constraintAdmitsNullish, a5 as constraintToEntryAbs, a6 as derefConstraint, a7 as drainPromiseMicros, a8 as effectiveInterface, a9 as enterPromiseExecutorScope, aa as evalPromiseCtor, ab as evalPromiseMethod, ac as evalPromiseStatic, ad as execNudoModule, ae as extractDeclaredThrows, af as extractFnBudget, ag as extractNudoImports, ah as extractRefineReturnFromSource, ai as extractRefinesFromSource, aj as fn, ak as fnConstraintToEntryReqs, al as formatCheckReport, am as formatConstraint, an as formatDiagnostics, ao as formatEffectiveInterfaceDisplay, ap as formatGithubAnnotations, aq as formatGitlabCodeQuality, ar as formatInterfaceTierLine, as as generatedExportNames, at as getParseSourceCacheSize, au as getTerm, av as instantiateConstraint, aw as interfaceDiagCount, ax as interfaceSourceOf, ay as interfaceTierOf, az as isIntFlag, aA as isNodeModulesPath, aB as isNudoConstraint, aC as lazy, aD as leavePromiseExecutorScope, aE as lenTerm, aF as litC, aG as localNamedExports, aH as notePromiseExecutorFork, aI as nullable, aJ as number, aK as omit, aL as partial, aM as pick, aN as queuePromiseMicro, aO as refineDiagCount, aP as refineToIndexedFull, aQ as resetNudoModuleExecCache, aR as resetParseSourceCache, aS as resetSidecarLoadFailureCache, aT as serializeCheckJson, aU as serializeCheckJsonMulti, aV as setInterfaceDiagCollector, aW as setRefineDiagCollector, aX as shape, aY as sidecarClosureFingerprint, aZ as sidecarPathOf, a_ as string, a$ as takeInterfaceDiags, b0 as takeInterfaceDiagsSince, b1 as takeRefineDiags, b2 as takeRefineDiagsSince, b3 as throwConstraintToKinds, b4 as union } from './projection-budget-CeoxA06q.js';
6
6
  export { $add, $arguments, $arr, $arrMutContainer, $arrRest, $arrWithHoles, $async, $asyncReturn, $await, $bitand, $bitnot, $bitor, $bitxor, $catchVal, $class, $classExpr, $collectionForEach, $concat, $copy, $del, $delRes, $div, $dynamicImport, $elems, $eq, $eqLoose, $fnVal, $for, $forInKeys, $forIter, $forOf, $fork, $ge, $gen, $get, $gt, $idx, $idxSet, $importMeta, $in, $instanceof, $instanceofNonIdent, $invoke, $invokeSuper, $isBreakTo, $isForkExit, $join, $le, $len, $lit, $loopBreak, $loopContinue, $loopReturn, $lt, $mod, $mul, $ne, $neLoose, $neg, $new, $not, $nullishTest, $obj, $objAccessor, $objRest, $optionalGet, $optionalInvoke, $orDefault, $pow, $pushLoopExit, $rawThis, $reStateCall, $regex, $rethrowIfNudoReturn, $set, $setKey, $shl, $shr, $spread, $staticInvoke, $sub, $super, $switch, $thisGet, $thisSet, $throw, $toNumber, $toNumeric, $tryCurrentMark, $tryDetachSoftCatch, $tryDigestSoftCatch, $tryDiscardSoft, $tryMark, $tryOrphanSoft, $tryPopMark, $tryReleaseSoftCatch, $tryReleaseSoftOut, $tryTakeSince, $typeof, $unknown, $updateAdd, $updateSub, $ushr, $while, $whileSeq, $yield, DEFAULT_MAX_LOOP_ITERS, EvalClassSpec, NudoLoopSignal, NudoReturn, NudoThrow, NudoUnsupportedError, TranspileOptions, asAbsVal, callAtFunctionBoundary, clearBClasses, clearStaleTermPred, currentExecPhi, fillTuple, foldRequireSpecArg, foldStaticStringExpr, getEvalClass, isArrMutator, isDefinitelyFalse, isDefinitelyTrue, isNudoBreak, isNudoContinue, isNudoReturn, isNudoThrow, litTruth, lookupObjAccessor, namespaceNameOf, pushLoopExit, pushThrowExit, registerEvalClass, runWithLoopExits, runtimeImportOf, takeLoopExits, takeThrowExits, transpile, transpileBodyNode, transpileExpression, transpileFile, transpileSource, withExecPhi } from './exec.js';
7
7
 
8
8
  /**
@@ -567,10 +567,18 @@ declare function getAbsProperty(recv: Abs, name: string): Abs | undefined;
567
567
  * 纪律:积之和默认;optional 塌缩是显式损失;函数并保输入→输出相关性。
568
568
  */
569
569
 
570
+ /**
571
+ * Bug 84:internal 标记私有槽(私有字段 "#x" 混淆键落实例内层 obj)。
572
+ * 原生私有字段是内部槽,对所有属性 introspection(for-in / hasOwnProperty
573
+ * / keys / gOPN / spread / assign / stringify)不可见;$get/$set 直连键
574
+ * 访问与 $in 槽存在性查询不受影响(Bug 78 语义)。必须用槽标志而非
575
+ * 名字前缀过滤——合法公共字符串键 {"#x":1} 与私有槽同键空间共存。
576
+ */
570
577
  type Slot = {
571
578
  value: Abs;
572
579
  optional?: boolean;
573
580
  readonly?: boolean;
581
+ internal?: boolean;
574
582
  };
575
583
  /** ES 规范数组下标(无前导零、< 2^32-1);非规范键返回 undefined */
576
584
  declare function canonicalArrayIndex(v: unknown): number | undefined;
package/dist/index.js CHANGED
@@ -65,7 +65,7 @@ import {
65
65
  takeInterfaceDiagsSince,
66
66
  takeRefineDiags,
67
67
  takeRefineDiagsSince
68
- } from "./chunk-SWG6PLYE.js";
68
+ } from "./chunk-2PFT7GU2.js";
69
69
  import {
70
70
  $add,
71
71
  $arguments,
@@ -525,7 +525,7 @@ import {
525
525
  withAssumePremises,
526
526
  withExecPhi,
527
527
  withVar
528
- } from "./chunk-NEKTOZLJ.js";
528
+ } from "./chunk-GL6VOF75.js";
529
529
 
530
530
  // src/environment.ts
531
531
  function createEnvironment(parent, bindings = /* @__PURE__ */ new Map()) {
@@ -1,7 +1,7 @@
1
- import { I as InterfaceSource, a as InterfaceTierOpts, p as parseSource, C as CheckIssue } from './projection-budget-PN_0_9D3.js';
2
- export { L as LeakBudget, b as LoadDepsFingerprint, M as MAX_PROMISE_MICROS, P as PROJECTION_MAX_DEPTH, c as ProjectionBudget, d as ProjectionStopReason, e as defaultLeakBudget, f as exceedsBudget, g as exportedNameOfLocal, h as extractAllLoadSpecs, i as getPromiseMicrosLength, l as leakIfNeeded, j as loadModuleDepsFingerprint, m as maybeLeak, n as normPath, r as resetLeakCounter, k as resolveDepPath, s as sidecarSpecsOf, o as stablePathKey, q as stablePathKeyGraph, t as termDepth, u as termNodes } from './projection-budget-PN_0_9D3.js';
3
- import { A as Abs, T as Term, c as AbsModuleExports, d as AstEnv } from './run-dg1bW60I.js';
4
- export { $ as $tryDigestSoft, e as $tryMarkSoft, f as $tryReleaseSoft, E as ERROR_FAMILY, g as EvalFallbackStats, M as MayThrowEffect, h as absLit, i as absNumLit, j as absStrLit, k as allAbsStr, l as clearPureCallMemo, m as clearPureMemo, n as enterEvalCallBudgetSession, o as errorTypeAbs, p as exitEvalCallBudgetSession, q as filterDeclaredThrows, r as filterGateThrows, s as filterIgnoredThrows, t as flushMayThrowEffects, u as formatThrowsAbs, v as getEvalCallBudgetState, w as getEvalFallbackStats, x as getMayThrowCollector, y as isThrowsIgnored, z as mayThrowEffectsToAbs, B as orphanMayThrowEffects, D as popMayThrowFrame, F as pushMayThrowFrame, G as recordMayThrow, H as resetEvalFallbackStats, I as runWithMayThrowSession, J as setMayThrowCollector, K as throwAbsToKinds, N as throwsKindCovered, O as withEvalBudgetOverride } from './run-dg1bW60I.js';
1
+ import { I as InterfaceSource, a as InterfaceTierOpts, p as parseSource, C as CheckIssue } from './projection-budget-CeoxA06q.js';
2
+ export { L as LeakBudget, b as LoadDepsFingerprint, M as MAX_PROMISE_MICROS, P as PROJECTION_MAX_DEPTH, c as ProjectionBudget, d as ProjectionStopReason, e as defaultLeakBudget, f as exceedsBudget, g as exportedNameOfLocal, h as extractAllLoadSpecs, i as getPromiseMicrosLength, l as leakIfNeeded, j as loadModuleDepsFingerprint, m as maybeLeak, n as normPath, r as resetLeakCounter, k as resolveDepPath, s as sidecarSpecsOf, o as stablePathKey, q as stablePathKeyGraph, t as termDepth, u as termNodes } from './projection-budget-CeoxA06q.js';
3
+ import { A as Abs, T as Term, c as AbsModuleExports, d as AstEnv } from './run-DaqGgSre.js';
4
+ export { $ as $tryDigestSoft, e as $tryMarkSoft, f as $tryReleaseSoft, E as ERROR_FAMILY, g as EvalFallbackStats, M as MayThrowEffect, h as absLit, i as absNumLit, j as absStrLit, k as allAbsStr, l as clearPureCallMemo, m as clearPureMemo, n as enterEvalCallBudgetSession, o as errorTypeAbs, p as exitEvalCallBudgetSession, q as filterDeclaredThrows, r as filterGateThrows, s as filterIgnoredThrows, t as flushMayThrowEffects, u as formatThrowsAbs, v as getEvalCallBudgetState, w as getEvalFallbackStats, x as getMayThrowCollector, y as isThrowsIgnored, z as mayThrowEffectsToAbs, B as orphanMayThrowEffects, D as popMayThrowFrame, F as pushMayThrowFrame, G as recordMayThrow, H as resetEvalFallbackStats, I as runWithMayThrowSession, J as setMayThrowCollector, K as throwAbsToKinds, N as throwsKindCovered, O as withEvalBudgetOverride } from './run-DaqGgSre.js';
5
5
  import { File, Node } from '@babel/types';
6
6
 
7
7
  /**
package/dist/internal.js CHANGED
@@ -21,7 +21,7 @@ import {
21
21
  stableAnalyzeKeySource,
22
22
  stablePathKey,
23
23
  stablePathKeyGraph
24
- } from "./chunk-SWG6PLYE.js";
24
+ } from "./chunk-2PFT7GU2.js";
25
25
  import {
26
26
  $tryDigestSoft,
27
27
  $tryMarkSoft,
@@ -169,7 +169,7 @@ import {
169
169
  withEvalBudgetOverride,
170
170
  withFnBudgetOverride,
171
171
  wrapPromise
172
- } from "./chunk-NEKTOZLJ.js";
172
+ } from "./chunk-GL6VOF75.js";
173
173
 
174
174
  // src/algebra/inlay.ts
175
175
  function listFunctions(source) {
@@ -1,5 +1,5 @@
1
1
  import { File } from '@babel/types';
2
- import { A as Abs, T as Term, P as PrimName, a as Pred, L as LiteralValue, b as Phi, C as Confidence } from './run-dg1bW60I.js';
2
+ import { A as Abs, T as Term, P as PrimName, a as Pred, L as LiteralValue, b as Phi, C as Confidence } from './run-DaqGgSre.js';
3
3
 
4
4
  declare function resetParseSourceCache(): void;
5
5
  declare function getParseSourceCacheSize(): number;
@@ -155,10 +155,12 @@ type Shape = {
155
155
  type: PrimName;
156
156
  } | {
157
157
  k: "obj";
158
+ /** 槽形与 objects.ts Slot 同构(含 Bug 84 internal 私有槽标记) */
158
159
  slots: Record<string, {
159
160
  value: Abs;
160
161
  optional?: boolean;
161
162
  readonly?: boolean;
163
+ internal?: boolean;
162
164
  }>;
163
165
  index?: {
164
166
  key: Abs;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nudojs/core",
3
- "version": "1.11.2",
3
+ "version": "1.11.3",
4
4
  "engines": {
5
5
  "node": ">=20"
6
6
  },