@nudojs/core 1.15.2 → 1.17.0
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.
- package/dist/{chunk-NXZSRLCT.js → chunk-4MRLOJMI.js} +4141 -1119
- package/dist/{chunk-WKIRPUHZ.js → chunk-ARIQO5XX.js} +33102 -23074
- package/dist/exec.d.ts +666 -129
- package/dist/exec.js +16 -16
- package/dist/index.d.ts +428 -96
- package/dist/index.js +1244 -517
- package/dist/internal.d.ts +82 -43
- package/dist/internal.js +144 -141
- package/dist/{projection-budget-07VnMktV.d.ts → projection-budget-BkFV9pcs.d.ts} +178 -42
- package/dist/{run-DfloWX6i.d.ts → run-tV2J7PNI.d.ts} +114 -41
- package/package.json +1 -1
- /package/dist/{chunk-US532PZA.js → chunk-II73GZOY.js} +0 -0
package/dist/exec.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as Abs, M as MayThrowEffect, b as Phi } from './run-
|
|
2
|
-
export {
|
|
1
|
+
import { A as Abs, M as MayThrowEffect, b as Phi } from './run-tV2J7PNI.js';
|
|
2
|
+
export { V as $assignRecord, W as $call, X as $callNamed, bG as $nodoPos, Y as $recordBinding, a4 as EvalAbsAssignRecord, a5 as EvalCallRecord, a6 as EvalFallback, g as EvalFallbackStats, a7 as EvalPosRecord, aa as MAX_EVAL_CALL_DEPTH, ab as MAX_EVAL_TOTAL_CALLS, R as RunTranspiledOptions, ad as TranspiledCallResult, ar as bindingsOf, au as callTranspiledExport, av as callTranspiledExportApply, aw as callTranspiledExportFull, l as clearPureCallMemo, m as clearPureMemo, n as enterEvalCallBudgetSession, aB as evalExprAbs, p as exitEvalCallBudgetSession, v as getEvalCallBudgetState, aE as getEvalCallCollector, w as getEvalFallbackStats, bH as getPosCollector, aM as isAbsVal, aO as isCjsMainRun, b3 as noteEvalCallRecord, b4 as noteEvalFallback, bl as resetEvalCallBudget, H as resetEvalFallbackStats, bI as routeApplyThrows, bm as runTranspiled, bn as runTranspiledOptionsMemoKey, bo as setEvalAssignCollector, bp as setEvalBindingSink, bq as setEvalCallCollector, br as setEvalFallbackCollector, bt as setPosCollector, bD as tryRunTranspiled, O as withEvalBudgetOverride } from './run-tV2J7PNI.js';
|
|
3
3
|
import { Node, Expression, File } from '@babel/types';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -23,6 +23,19 @@ declare function isNudoThrow(e: unknown): e is NudoThrow;
|
|
|
23
23
|
/**
|
|
24
24
|
* 求值引擎运行时共享状态:phi、就地写、字面量 Abs、真值、循环信号。
|
|
25
25
|
* 叶子模块——不依赖 runtime 其它文件(tuple/obj 字面量就地构造,避免 state↔containers 环)。
|
|
26
|
+
*
|
|
27
|
+
* Invariants:
|
|
28
|
+
* - Bug 213:宿主 / 命名空间对象(Math / JSON / Reflect)的自有属性投影按
|
|
29
|
+
* **getOwnPropertyNames**(全部自有字符串键)而非 Object.entries(只取可
|
|
30
|
+
* 枚举键)——原生这些对象的自有属性几乎全不可枚举,按可枚举投影会把整个
|
|
31
|
+
* 自有面丢掉(gOPN / ownKeys / hasOwn / gOPD 全折 0);逐键记 enumerable /
|
|
32
|
+
* writable / configurable 标志,不可枚举键仍不进枚举面。
|
|
33
|
+
* - Bug 210:enforceProxyGetInvariant 是 Proxy [[Get]] 规范不变量的单一实现
|
|
34
|
+
* (靶上自有属性不可配置且不可写时,get 陷阱须返回其实际值);
|
|
35
|
+
* proxyTargetInnerObj 归一化「靶 → 内层 obj Abs」(不变性侧表与槽表都挂
|
|
36
|
+
* 在内层 obj 上——brand 包装的靶走内层)。
|
|
37
|
+
* [[OwnPropertyKeys]] 不变量(重复名 / 漏键 / 多余键)在
|
|
38
|
+
* builtins/object/descriptor.ts(enforceProxyOwnKeysInvariant)。
|
|
26
39
|
*/
|
|
27
40
|
|
|
28
41
|
/** 调用方已直接改 shape 时的 term/pred 清理 */
|
|
@@ -39,6 +52,8 @@ declare function withAssumePremises<T>(p: Phi, body: () => T): T;
|
|
|
39
52
|
* extractParamNames 回退口径一致);带真实参数名走 $fnVal(transpile 侧)。
|
|
40
53
|
*/
|
|
41
54
|
declare function asAbsVal(v: unknown): Abs;
|
|
55
|
+
/** transpile 生成代码用:给宿主函数打种类戳(Bug 325) */
|
|
56
|
+
declare function $fnKindStamp(fn: unknown, kind: string): void;
|
|
42
57
|
/** transpile 侧收形入口(instanceof RHS 值等):host 裸值 / Abs → Abs。
|
|
43
58
|
* `$` 前缀是运行时绑定表(runtimeArgNames)的注入约定。 */
|
|
44
59
|
declare function $absVal(v: unknown): Abs;
|
|
@@ -70,6 +85,8 @@ declare function $fnVal(params: string[], impl: (...args: Abs[]) => Abs, opts?:
|
|
|
70
85
|
effectFree?: boolean;
|
|
71
86
|
closed?: boolean;
|
|
72
87
|
kind?: string;
|
|
88
|
+
fnKind?: "function" | "async" | "generator" | "async-generator";
|
|
89
|
+
optionalParams?: boolean[];
|
|
73
90
|
}): Abs;
|
|
74
91
|
/**
|
|
75
92
|
* 宿主 this → Abs:函数体 prologue 用它承接 call/apply/bind 传入的 thisArg。
|
|
@@ -78,8 +95,18 @@ declare function $fnVal(params: string[], impl: (...args: Abs[]) => Abs, opts?:
|
|
|
78
95
|
* globalThis——归一到 $lit(undefined)(strict 模块语义下的 this)。
|
|
79
96
|
*/
|
|
80
97
|
declare function $rawThis(v: unknown): Abs;
|
|
98
|
+
/** const 绑定再赋值(Assignment to constant variable)→ hard TypeError */
|
|
99
|
+
declare function $throwConstAssign(): never;
|
|
100
|
+
/**
|
|
101
|
+
* 自由 `arguments` 读(模块顶层 / 无任何外层函数绑定):非宿主全局,
|
|
102
|
+
* 原生 unresolvable reference → hard ReferenceError(ESM 无 arguments
|
|
103
|
+
* 全局;`typeof arguments` 豁免由 transpile 折 "undefined" 不走此处)。
|
|
104
|
+
*/
|
|
105
|
+
declare function $throwFreeArguments(): never;
|
|
81
106
|
/** `new.target` 读:栈顶类值;普通调用面已清空 → undefined 字面量 */
|
|
82
107
|
declare function $newTarget(): Abs;
|
|
108
|
+
/** 生成代码可用的真值判定(undefined = 无法判定);与 litTruth 同口径 */
|
|
109
|
+
declare function $litTruth(a: Abs): boolean | undefined;
|
|
83
110
|
/** 字面量 → Abs(transpile 侧数字/字符串/布尔/null/undefined) */
|
|
84
111
|
declare function $lit(v: unknown): Abs;
|
|
85
112
|
/** JS 真值:字面量按 Boolean(v);对象形恒真;不可判 → undefined */
|
|
@@ -128,6 +155,14 @@ declare class NudoReturn extends Error {
|
|
|
128
155
|
declare function isNudoReturn(e: unknown): e is NudoReturn;
|
|
129
156
|
/** transpile `return x` inside for/while → `$loopReturn(x)` */
|
|
130
157
|
declare function $loopReturn(v: Abs): never;
|
|
158
|
+
/**
|
|
159
|
+
* transpile 函数体边界吸收器:`try { body } catch (e) { return $catchReturn(e); }`
|
|
160
|
+
* —— 函数体内 $loopReturn 早退(循环 / if 臂)在函数自身边界收成返回值,
|
|
161
|
+
* 转译模块对裸宿主调用(e2e 真实 .mjs 导入 / 模块顶层互调)自包含;
|
|
162
|
+
* 其余异常(NudoThrow / 原生错误)原样 rethrow。仅在发射体含 $loopReturn
|
|
163
|
+
* 时由 transpile 侧包裹。
|
|
164
|
+
*/
|
|
165
|
+
declare function $catchReturn(e: unknown): Abs;
|
|
131
166
|
declare class NudoLoopSignal extends Error {
|
|
132
167
|
readonly kind: "break" | "continue";
|
|
133
168
|
readonly label: string | undefined;
|
|
@@ -157,6 +192,23 @@ declare function $sub(a: Abs, b: Abs): Abs;
|
|
|
157
192
|
declare function $mul(a: Abs, b: Abs): Abs;
|
|
158
193
|
declare function $div(a: Abs, b: Abs): Abs;
|
|
159
194
|
declare function $mod(a: Abs, b: Abs): Abs;
|
|
195
|
+
/**
|
|
196
|
+
* issue #165:局部量引理锚定。`@nudo:assume <name> <= <name>` 从仅形参扩展到
|
|
197
|
+
* 形参 ∪ 函数体顶层 const/let/var 局部绑定,SSA 语义:引理作用于绑定值,
|
|
198
|
+
* 从定义点到作用域尾。transpile 在局部量 init 处包裹
|
|
199
|
+
* `$assumeAnchor(init, name)`——把 init 结果的 term α-改名为 var(name),
|
|
200
|
+
* 使后续读点与 assume 前提里的 var(name) 同项,arithmetic 的同名相关性
|
|
201
|
+
* 折叠(le 折除法界等)才能命中。shape/conf 不动,嵌套 shape 内 term
|
|
202
|
+
* 不改(保守:根 term 已建立项身份,深改无消费方)。
|
|
203
|
+
*
|
|
204
|
+
* 为何需要当前帧前提护栏:assume 前提不随调用链继承——callee 帧一律见空
|
|
205
|
+
* (callAtFunctionBoundary 以 withAssumePremises(pTrue, …) 包裹 callee 体)。
|
|
206
|
+
* 锚定落在错帧(前提 pTrue,或 and 原子中没有任何 le 原子在 a/b 侧以
|
|
207
|
+
* var(name) 出现——本帧没有这条引理)时,改名只会凭空捏造约束身份 →
|
|
208
|
+
* 原样 no-op。这也封死 #123 式同名 term 碰撞:callee 恰有同名局部时,
|
|
209
|
+
* caller 帧前提已被清空,caller 引理不会错投到 callee 的同名绑定上。
|
|
210
|
+
*/
|
|
211
|
+
declare function $assumeAnchor(v: unknown, name: string): unknown;
|
|
160
212
|
declare function $bitand(a: Abs, b: Abs): Abs;
|
|
161
213
|
declare function $bitor(a: Abs, b: Abs): Abs;
|
|
162
214
|
declare function $bitxor(a: Abs, b: Abs): Abs;
|
|
@@ -188,6 +240,17 @@ declare function $join(a: Abs, b: Abs): Abs;
|
|
|
188
240
|
|
|
189
241
|
/**
|
|
190
242
|
* 访问器(get/set)侧表、in / instanceof / delete 路由。
|
|
243
|
+
*
|
|
244
|
+
* Bug 149:符号键(Symbol.iterator 等)按**宿主身份**反查 "@@X" 内部槽键
|
|
245
|
+
* 寻址(与读写面同口径),Proxy has 陷阱收到**真 symbol**(规范
|
|
246
|
+
* PropertyKey)——不再在「键不可判」处提前 return(陷阱此前完全不派发)。
|
|
247
|
+
* Bug 230:delete 运算符路径($delRes)的 Proxy [[Delete]] 规范不变量——
|
|
248
|
+
* deleteProperty 陷阱返 true 时,若靶上该键是不可配置自有属性 ⇒ 原生定抛
|
|
249
|
+
* TypeError(此前直接返 true,假绿;Reflect 臂已由 S9 接线)。
|
|
250
|
+
* Bug 194:`delete X.prototype.m` —— 类方法在方法注册表(spec.methods)里,
|
|
251
|
+
* 原型对象上无该方法的槽 ⇒ 只删槽不留痕(读/调用/in 三面继续命中)。
|
|
252
|
+
* $del 在 `.prototype` brand 臂按 owner 名通知注册表侧移除(S8 的
|
|
253
|
+
* deleteProtoMethod 钩子);delete 返回值恒 true(原生同)。
|
|
191
254
|
*/
|
|
192
255
|
|
|
193
256
|
/** 计算键访问器注册(`{ get [expr]() {} }`):键为 Abs,ToPropertyKey 后注册。
|
|
@@ -209,12 +272,19 @@ declare function $in(key: Abs, o: Abs): Abs;
|
|
|
209
272
|
declare function $instanceof(left: Abs, rightName: string, rightVal?: Abs): Abs;
|
|
210
273
|
/** instanceof 右操作数非标识符(表达式/成员路径):RHS 值传入时先做原生
|
|
211
274
|
* 非对象校验(definite / may TypeError);构造器值未知 → 抽象 boolean */
|
|
212
|
-
declare function $instanceofNonIdent(
|
|
213
|
-
/**
|
|
214
|
-
|
|
275
|
+
declare function $instanceofNonIdent(_left: Abs, right?: Abs): Abs;
|
|
276
|
+
/**
|
|
277
|
+
* ClassExpression 值:构造器函数形状,不得折成精确 undefined。
|
|
278
|
+
*
|
|
279
|
+
* Bug 133:name —— **NamedEvaluation 名**(`const K = class {}` → "K")。
|
|
280
|
+
* 空类体走本快路径(fn 形状),类名落在 fn 形状的 name 位($get(fn,"name")
|
|
281
|
+
* 读 shape.name)——无名类不传(原生名为空串)。
|
|
282
|
+
*/
|
|
283
|
+
declare function $classExpr(name?: string): Abs;
|
|
215
284
|
/**
|
|
216
285
|
* `delete obj[key]` 的结果判定(只读,不写回)。
|
|
217
286
|
* frozen/sealed 或 configurable:false 键 → false;preventExtensions 可删;
|
|
287
|
+
* 数组 length 恒不可配置 → strict 定抛 TypeError(Bug 230);
|
|
218
288
|
* closed 目标恒 true(其余 non-configurable 形态不建模);
|
|
219
289
|
* nullish 接收者原生 definite TypeError(ToObject(null) 抛)→ hard NudoThrow;
|
|
220
290
|
* 非 nullish prim 接收者原生不抛(装箱临时对象上 delete 恒 true,strict 亦然)
|
|
@@ -224,7 +294,8 @@ declare function $delRes(o: Abs, _key: Abs): Abs;
|
|
|
224
294
|
/**
|
|
225
295
|
* `delete obj[key]` 的写入(不可变更新):返回删键后的新容器。
|
|
226
296
|
* 闭对象删自有槽;tuple 规范下标置 undefined(对齐原生空洞读值);
|
|
227
|
-
* 抽象 arr 元素并入 undefined
|
|
297
|
+
* 抽象 arr 元素并入 undefined;数组 length 不可配置 → strict 定抛
|
|
298
|
+
* TypeError(Bug 230);无法表达的形态原样返回。
|
|
228
299
|
*/
|
|
229
300
|
declare function $del(o: Abs, key: Abs): Abs;
|
|
230
301
|
|
|
@@ -233,6 +304,14 @@ declare function $del(o: Abs, key: Abs): Abs;
|
|
|
233
304
|
* 下沉原因:objects.ts 的 joinObjects 需感知访问器(join 不迁移侧表会丢
|
|
234
305
|
* getter 读域),而 members.ts 依赖 objects.ts;表放无运行时依赖的叶子上
|
|
235
306
|
* 才能被两层共用而不成环。in / instanceof / delete 路由仍在 members.ts。
|
|
307
|
+
*
|
|
308
|
+
* 不变量:
|
|
309
|
+
* - 访问器**不住在 shape 槽里**:transpile 只落一个 `$lit(void 0)` 占位槽
|
|
310
|
+
* (保键存在性:'x' in o / keys / assign 拷贝目标),真 getter 住本侧表;
|
|
311
|
+
* - 读通道($get/$set)先查侧表再回落槽值 ⇒ `o.ab` 读得对;
|
|
312
|
+
* - **投影通道**(formatShape / denoteGuard / absToConstraint / 契约证明)
|
|
313
|
+
* 必须先经 accessorReadDomain 取读域,否则把占位槽渲染成 exact
|
|
314
|
+
* `undefined`——一个自信的错值(比真值更窄且自相矛盾,Bug 191)。
|
|
236
315
|
*/
|
|
237
316
|
|
|
238
317
|
/** 注册对象字面量访问器(transpile 调用;返回原 obj 以便链式包裹) */
|
|
@@ -248,17 +327,12 @@ declare function lookupObjAccessor(o: Abs, key: string): {
|
|
|
248
327
|
*/
|
|
249
328
|
declare const DEFAULT_MAX_LOOP_ITERS = 8;
|
|
250
329
|
|
|
251
|
-
declare function $fork(test: Abs, consequent: () => Abs, alternate?: () => Abs): Abs;
|
|
252
|
-
|
|
253
330
|
/**
|
|
254
|
-
* for
|
|
255
|
-
* 抽象条件无法诚实终止——消费者必须自带 maxIters。
|
|
331
|
+
* 控制流:loop/try 退出栈、$fork/$for/$whileSeq、$throw。
|
|
256
332
|
*/
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
afterBody: Abs;
|
|
261
|
-
}, void, void>;
|
|
333
|
+
|
|
334
|
+
declare function $fork(test: Abs, consequent: () => Abs, alternate?: () => Abs): Abs;
|
|
335
|
+
|
|
262
336
|
/**
|
|
263
337
|
* 有界 for:unroll ≤ maxIters,每步「可能退出」的态 join;
|
|
264
338
|
* 相邻态 leq 视为不动点提前停。
|
|
@@ -268,12 +342,10 @@ declare function $for(init: Abs, test: (s: Abs) => Abs, step: (s: Abs) => Abs, b
|
|
|
268
342
|
unpack?: (s: Abs) => void;
|
|
269
343
|
/** 标签循环(`outer: for …`):仅吸收同标签 break/continue 信号 */
|
|
270
344
|
label?: string;
|
|
345
|
+
/** 循环变量的最新写(Bug 228):continue 臂取「体退出瞬间的循环变量值」
|
|
346
|
+
* ——转译侧在体的 finally 里写回共享槽;缺省(未插桩)时以 state 近似。 */
|
|
347
|
+
loopVar?: () => Abs;
|
|
271
348
|
}): Abs;
|
|
272
|
-
/**
|
|
273
|
-
* 有界 while:state 线程穿 test/step(与 $for 同折叠语义)。
|
|
274
|
-
* 抽象条件无法诚实终止——必须 maxIters。
|
|
275
|
-
*/
|
|
276
|
-
declare function $while(init: Abs, test: (s: Abs) => Abs, step: (s: Abs) => Abs, maxIters?: number): Abs;
|
|
277
349
|
/**
|
|
278
350
|
* 顺序 while(具体/可变闭包):body 内对 JS 变量赋值。
|
|
279
351
|
* 提供 pack/unpack 时,抽象条件的可能出口会 join 回绑定(P0 健全);
|
|
@@ -287,12 +359,6 @@ declare function $whileSeq(test: () => Abs, body: () => void, maxIters?: number,
|
|
|
287
359
|
/** 标签循环:仅吸收同标签 break/continue 信号 */
|
|
288
360
|
label?: string;
|
|
289
361
|
}): void;
|
|
290
|
-
/**
|
|
291
|
-
* switch:具体 disc 选中匹配 case;抽象 disc 并所有分支。
|
|
292
|
-
* 抽象路径与 $fork 同构:集合 side-table 按臂 overlay,共享 body 只跑一次;
|
|
293
|
-
* 臂内 NudoReturn/NudoThrow 不冒泡污染兄弟臂。
|
|
294
|
-
* **无 default 时必须隐式 fall-through 臂(undef)**,否则无匹配路径被丢掉(P0-2)。
|
|
295
|
-
*/
|
|
296
362
|
declare function $switch(disc: Abs, cases: Array<{
|
|
297
363
|
test: Abs;
|
|
298
364
|
run: () => Abs;
|
|
@@ -305,7 +371,15 @@ declare function $throw(v: Abs): never;
|
|
|
305
371
|
* 不得污染 join 后的 continue 绑定。
|
|
306
372
|
*/
|
|
307
373
|
declare function $isForkExit(e: unknown): boolean;
|
|
308
|
-
/**
|
|
374
|
+
/**
|
|
375
|
+
* catch 参数:从 NudoThrow 取出 Abs;宿主 Error 补 name/message;否则 unknown。
|
|
376
|
+
*
|
|
377
|
+
* Bug 211:**控制流信号(break / continue)不是异常**——原生里 `break` 是
|
|
378
|
+
* 控制流完成值,根本到不了 catch 处理器(catch 体不跑、循环照常退出)。
|
|
379
|
+
* 引擎的循环信号是 Error 子类 ⇒ 会被 catch 接住;此前 catch 体把信号「吃掉」
|
|
380
|
+
* (副作用照跑、循环还不退出)。修法:控制流信号在此**重抛** ⇒ catch 体不执行、
|
|
381
|
+
* 信号透传到循环捕获点(catch 体只吞真异常)。
|
|
382
|
+
*/
|
|
309
383
|
declare function $catchVal(e: unknown): Abs;
|
|
310
384
|
|
|
311
385
|
/**
|
|
@@ -315,16 +389,32 @@ declare function $catchVal(e: unknown): Abs;
|
|
|
315
389
|
* - $copy 是 fork/switch/循环 pack 的状态分离机制:所有可挂侧表的形状
|
|
316
390
|
* (extState/propFlags/accessorTable/nullProto/matchIter)必须随快照
|
|
317
391
|
* 迁移,副本丢失侧表 = 臂内写不再硬抛 / 延迟异常静默丢弃。
|
|
392
|
+
* - fn 形状同样是可扩展对象:expando 槽面(含 optionalParams/ctor/类型
|
|
393
|
+
* 侧信息)逐臂独立复制(共享槽面会让兄弟臂写互相覆盖);impl 身份、
|
|
394
|
+
* 槽面写权限侧表(objects.ts 的 userFnSlotOwners)、null-proto 标记与
|
|
395
|
+
* 新鲜实例 id 随副本迁移(侧表丢失 ⇒ `__proto__` 读翻转 / `===` 退化)。
|
|
318
396
|
* - $spread 原生语义会**调用**源对象 getter 并把结果拷为数据槽——必须
|
|
319
397
|
* 用 getter 求值后的副本(accessorTable 求值,抛/失败折 unknown)。
|
|
398
|
+
* - $objRest 同理:原生 CopyDataProperties 对保留键发 Get ⇒ getter 必须
|
|
399
|
+
* 被调用(副作用发生),rest 槽落 getter 的**返回值**(非占位 undefined)。
|
|
320
400
|
*/
|
|
321
401
|
|
|
322
402
|
/**
|
|
323
403
|
* 深拷贝可变容器(fork/switch 快照与循环 pack 用)。
|
|
324
404
|
* 容器写就地进行后(引用语义),分析分支/迭代的状态分离必须靠拷贝——
|
|
325
405
|
* 浅引用快照会让臂间/迭代间互相污染。
|
|
406
|
+
*
|
|
407
|
+
* `memo` 是**身份图**:同一原始 Abs 在同一次快照里必须映射到同一个副本。
|
|
408
|
+
* - 循环引用(`o.self = o`)靠「先占位、后填空」终止递归;
|
|
409
|
+
* - 共享子图(DAG)不再指数复制;
|
|
410
|
+
* - 同一次快照/调用边界里的多个绑定保持别名关系(memo 必须由调用方共享;
|
|
411
|
+
* `$copy(a)` 单参调用只为兼容旧行为,等价于每次新建 memo)。
|
|
412
|
+
*
|
|
413
|
+
* 注意:这只能保证**被复制集合内部**的身份关系。若 `b` 是 `a` 的别名但
|
|
414
|
+
* 不在同一次快照的绑定集合里,fork/pack 仍会断开 `a`/`b`;调用方必须把
|
|
415
|
+
* 别名伙伴一起纳入复制集合(见 transpile 的 aliasGroups)。
|
|
326
416
|
*/
|
|
327
|
-
declare function $copy(a: Abs): Abs;
|
|
417
|
+
declare function $copy(a: Abs, memo?: WeakMap<object, Abs>): Abs;
|
|
328
418
|
/** 对象字面量 → Abs obj(槽位写走 setSlot,`__proto__` 不踩宿主 setter) */
|
|
329
419
|
declare function $obj(slots: Record<string, Abs>): Abs;
|
|
330
420
|
/**
|
|
@@ -338,9 +428,10 @@ declare function $setProto(o: Abs, proto: Abs): Abs;
|
|
|
338
428
|
declare function $spread(a: Abs, b: Abs): Abs;
|
|
339
429
|
/**
|
|
340
430
|
* 解构 rest:`const { a, ...rest } = o` → rest = o 去掉 named keys。
|
|
431
|
+
* 排除集可含**动态计算键**(Abs)——原生按求值后的键排除(Bug 160)。
|
|
341
432
|
* closed obj:剩余槽 closed;open / optional 键:rest 仍 open(可能有未知键)。
|
|
342
433
|
*/
|
|
343
|
-
declare function $objRest(o: Abs, keys: string
|
|
434
|
+
declare function $objRest(o: Abs, keys: Array<string | Abs>): Abs;
|
|
344
435
|
|
|
345
436
|
/**
|
|
346
437
|
* 元组/数组构造与宽化。
|
|
@@ -392,6 +483,9 @@ declare function $restBind(list: ArrayLike<unknown>, namedCount: number): Abs;
|
|
|
392
483
|
* 抽象 → may(空接收者同样先校验);values 实参不校验(原生存储不转换)。
|
|
393
484
|
* - mutator 降 arr(splice 等)的元素域 = 全部观测元素 join——不并入
|
|
394
485
|
* OOB undefined(issue #156 元素域约定)。
|
|
486
|
+
* - 完整性门(Bug 223):frozen 任何 mutator 抛;sealed 的**结构性扩展**
|
|
487
|
+
* (push/unshift/splice)与**删除既有自有属性**(pop/shift 命中自有元素)
|
|
488
|
+
* 抛 TypeError;空数组 / 空洞位 / preventExtensions(nonext)不抛。
|
|
395
489
|
*/
|
|
396
490
|
|
|
397
491
|
declare function isArrMutator(name: string): boolean;
|
|
@@ -421,6 +515,10 @@ declare function $arrMutContainer(arr: Abs, method: string, args: Abs[]): Abs;
|
|
|
421
515
|
* (issue #175:否则 xs[0].length - xs[1].length 假折 0)。
|
|
422
516
|
* - abstractLen memo 只对**绑定接收者**合法(跨读同 term sound);
|
|
423
517
|
* lenVarSeq 单调递增,len#N term 全局唯一。
|
|
518
|
+
* - Bug 209:Proxy **set 陷阱**返回值按规范 ToBoolean 判定——falsy(0 / "" /
|
|
519
|
+
* null / undefined / false)→ strict TypeError(只认字面量 false 会漏)。
|
|
520
|
+
* - Bug 197:下标写查 defineProperty 的 writable:false → strict TypeError
|
|
521
|
+
* (此前下标臂只查 frozen / sealed,flags 面没查 → 写穿无声)。
|
|
424
522
|
*/
|
|
425
523
|
|
|
426
524
|
/** 下标读 a[i];规范数组下标走精确投影,确定非下标键 → undefined,否则并所有元素;string[i] → 单字符 */
|
|
@@ -444,20 +542,64 @@ declare function $len(a: Abs, opts?: {
|
|
|
444
542
|
* 内层空 obj,原型链 @@iterator 不在内层建模)。
|
|
445
543
|
* - 生成器/模板标签/matchAll 迭代物挂对象侧表:迭代 = 消费(从当前位
|
|
446
544
|
* 取剩余),体内延迟异常在消费点重放(不得静默截断成前缀,Bug 34)。
|
|
545
|
+
* - async generator(仅 @@asyncIterator 槽的**生成器对象**,Bug 141):
|
|
546
|
+
* for-await 的元素域走**元素侧表**(与同步 generator 同口径:元素取
|
|
547
|
+
* 侧表剩余条目,长度亦由侧表给出)——不得落 asyncOnly 的 unknown 快
|
|
548
|
+
* 路径(元素域精度回退);非生成器的仅异步可迭代对象元素域不可静态刻
|
|
549
|
+
* 画 → 仍折 unknown。
|
|
447
550
|
* - unbounded(长度未知)单代表迭代只跑一次:0 次/出口臂由 fork-arm +
|
|
448
551
|
* snapExit join 承接;break/continue 打断代表体 → widen.markInterrupted
|
|
449
552
|
* (完整迭代效应不可观测,累加器域整体宽化)。
|
|
553
|
+
* - Bug 195:标签模板对象是**冻结的数组 exotic**(原生 GetTemplateObject →
|
|
554
|
+
* CreateArrayFromList + SetIntegrityLevel(frozen))⇒ 元槽(length / raw /
|
|
555
|
+
* @@iterator)**非枚举**、对象**冻结**(extState)、JSON 走**数组序列化面**
|
|
556
|
+
* (数组视图标注)。未冻结的普通 obj 不得被误标。
|
|
557
|
+
* - Bug 198:Map/Set 的条目遍历(forEach / for-of)必须是**接收者的 live
|
|
558
|
+
* 视图**——回调里的增删删改对迭代可见(live 视图按访问序取,条目身份去重)。
|
|
559
|
+
* - Bug 198(S20):live 集合 / 数组迭代器**不登记静态元素侧表**(静态表是
|
|
560
|
+
* 创建期拷贝 ⇒ 元素面与长度冻结在创建时刻)⇒ 迭代物判定($arrRest 的
|
|
561
|
+
* 「侧表迭代物」门、$yieldStarElems 的长度可知性)必须**同口径**认
|
|
562
|
+
* **消费视图**(registerGenDrain)——只查静态侧表会把 live 迭代物误判成
|
|
563
|
+
* 「非迭代物」(rest 解构退 unknown)。
|
|
564
|
+
* - Bug 199:非正常出口(break / return / throw / label break)与**解构模式
|
|
565
|
+
* 填满而迭代器未耗尽**必须 IteratorClose(调用户迭代器的 return());continue
|
|
566
|
+
* 与自然耗尽**不**调;无 return 槽**不**凭空抛(抽象面不判定)。
|
|
567
|
+
* - Bug 200:for..in 遍历 brand 实例须**沿原型链**枚举可枚举键(原型上的
|
|
568
|
+
* class 方法非可枚举 ⇒ 不出现)。
|
|
569
|
+
* - Bug 215:for-of 的**具体出口**(无快照 join)也须实施 @nudo:invariant 公理
|
|
570
|
+
* (无公理时不取绑定包——零行为变化)。
|
|
450
571
|
*/
|
|
451
572
|
|
|
452
573
|
/** 数组 rest:`const [a, ...rest] = arr` → rest = 从 start 起的尾段 */
|
|
453
574
|
declare function $arrRest(a: Abs, start: number): Abs;
|
|
454
575
|
/** 数组连接 [...a, ...b] / [...a, x];结果超 cap 时与字面量同策略降 arr */
|
|
455
576
|
declare function $concat(a: Abs, b: Abs): Abs;
|
|
456
|
-
/**
|
|
457
|
-
*
|
|
458
|
-
*
|
|
459
|
-
*
|
|
460
|
-
|
|
577
|
+
/**
|
|
578
|
+
* 用户 iterable 的**迭代序**元素读取器(`$iterCheck` 返回值):
|
|
579
|
+
* - `get(i)`:第 i 个元素(迭代序);越界 = 迭代已 done → exact undefined;
|
|
580
|
+
* 列表被截断(truncated)→ unknown(sound)。
|
|
581
|
+
* - `rest(i)`:从第 i 项起的剩余元素(原生 rest 语义:迭代到 done 为止);
|
|
582
|
+
* 截断 → unknown(剩余长度不可知)。
|
|
583
|
+
*/
|
|
584
|
+
interface UserIterReader {
|
|
585
|
+
get(i: number): Abs;
|
|
586
|
+
rest(i: number): Abs;
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* 数组解构模式接收者守卫 + **用户 iterable 迭代序元素读取器**。
|
|
590
|
+
*
|
|
591
|
+
* 两件事(同一调用,避免生成码再判一次接收者形态):
|
|
592
|
+
* ①守卫:原生数组解构 = GetIterator + IteratorNext,非可迭代接收者抛
|
|
593
|
+
* TypeError(definite);抽象接收者记 may-throw。
|
|
594
|
+
* ②返回用户 iterable(对象带自有 `@@iterator` 槽、引擎无其元素模型)的
|
|
595
|
+
* 迭代序元素读取器;**非**用户 iterable → null ⇒ 调用方走既有 `$idx` /
|
|
596
|
+
* `$arrRest` 快速路径(tuple / 数组 / 字符串 / Set / Map / 生成器 /
|
|
597
|
+
* `$tpl` / 数组迭代器…逐字不变)。
|
|
598
|
+
*
|
|
599
|
+
* `maxElements`:本次最多取几个元素(原生按需取:模式有 n 个位置就取 n 个,
|
|
600
|
+
* 空位也消耗一个);缺省 / 负数 = 取到 done(受 USER_ITER_MAX_STEPS 上界约束)。
|
|
601
|
+
*/
|
|
602
|
+
declare function $iterCheck(a: unknown, maxElements?: number): UserIterReader | null;
|
|
461
603
|
/** 元素列表(tuple 展开;arr 抽象;C1 Set/Map 逐条目;matchAll 迭代器逐匹配项;
|
|
462
604
|
* 字符串按 code points)。Map 迭代语义是 entry `[key, value]` 元组,不是裸 value。
|
|
463
605
|
* 消费前先过可迭代性守卫(Bug 6):prim 字面量接收者 → 原生 definite
|
|
@@ -469,18 +611,28 @@ declare function $elems(a: Abs): Abs[];
|
|
|
469
611
|
* 为 cooked 字符串(无效转义序列时 cooked 是 undefined,原生实测)、
|
|
470
612
|
* length 精确、.raw 为 raw 字符串数组;@@iterator 槽给函数形状
|
|
471
613
|
* (`[...s]` / `for..of` / `Symbol.iterator in s` 均按可迭代面判定,
|
|
472
|
-
* 不得把冻结数组误判 definite 不可迭代)。
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
*
|
|
476
|
-
*
|
|
477
|
-
*
|
|
478
|
-
*
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
*
|
|
482
|
-
*
|
|
614
|
+
* 不得把冻结数组误判 definite 不可迭代)。
|
|
615
|
+
*
|
|
616
|
+
* Bug 195:原生 GetTemplateObject = `CreateArrayFromList` + `SetIntegrityLevel(frozen)`
|
|
617
|
+
* ⇒ 模板对象是**冻结的数组 exotic**:
|
|
618
|
+
* - `length` / `raw` / `@@iterator` 是**非枚举**自有属性(原生三者全非枚举;
|
|
619
|
+
* `Object.keys(s)` 只有下标 "0".."n-1")——此前平铺为可枚举槽 ⇒ Object.keys
|
|
620
|
+
* 折出 "0,1,length,raw,@@iterator"(错值)。
|
|
621
|
+
* - `Object.isFrozen(s)` / `Object.isFrozen(s.raw)` 均为 true(原生冻结)——
|
|
622
|
+
* 此前 false。冻结走 extState 侧表(`Object.isFrozen` 的判定源)。
|
|
623
|
+
* - `JSON.stringify(s)` 走**数组序列化**(原生 `["a","b"]`)——此前走 obj 面
|
|
624
|
+
* 折 `{"0":"a",...}`。数组视图标注(markMatchArrayView)复用 RegExp exec
|
|
625
|
+
* 结果同款机制(json.ts 消费,不改 json.ts)。
|
|
626
|
+
*
|
|
627
|
+
* **未建模(越界,需 member.ts / builtins/array.ts)**:
|
|
628
|
+
* - `Array.isArray(s)` 原生 **true**(模板对象是数组 exotic)——引擎 isArray
|
|
629
|
+
* 只认 arr/tuple 形状 ⇒ 仍折 false(需 builtins/array.ts 查模板对象标注)。
|
|
630
|
+
* - 数组原型方法(`s.join` / `s.map` / `s.slice` / `s.indexOf` / `s.concat`)
|
|
631
|
+
* 原生可调(模板对象继承 Array.prototype)——引擎 obj 接收者的数组方法
|
|
632
|
+
* 派发面只认 tuple/arr 形状 ⇒ 此前折**确定抛 TypeError**(假抛)。
|
|
633
|
+
* 需 member.ts 的 $get 数组方法臂认模板对象(按元素侧表投影)。
|
|
483
634
|
*/
|
|
635
|
+
declare function $tpl(cooked: Array<string | undefined>, raw: string[]): Abs;
|
|
484
636
|
declare function $forInKeys(o: Abs): Abs;
|
|
485
637
|
declare function $forOf(iterable: Abs, body: (item: Abs, index: Abs) => void, maxIters?: number, opts?: {
|
|
486
638
|
pack?: () => Abs;
|
|
@@ -489,7 +641,9 @@ declare function $forOf(iterable: Abs, body: (item: Abs, index: Abs) => void, ma
|
|
|
489
641
|
label?: string;
|
|
490
642
|
/** for await:接收者按 GetIterator(hint=async) 校验(@@asyncIterator 槽
|
|
491
643
|
* 即全量);仅异步可迭代(无 @@iterator 槽)的接收者不折同步槽位投影,
|
|
492
|
-
* 元素取抽象 unknown(原生由 next()
|
|
644
|
+
* 元素取抽象 unknown(原生由 next() 链驱动)——**async generator 例外**
|
|
645
|
+
* (Bug 141):它是生成器对象,元素域走元素侧表(与同步 generator
|
|
646
|
+
* 同口径)。 */
|
|
493
647
|
forAwait?: boolean;
|
|
494
648
|
/** for-in(Bug 98):接收者重查 thunk——快照键进体前重查在场,体内
|
|
495
649
|
* delete 的未访问键跳过该迭代(与原生 EnumerateObjectProperties 的
|
|
@@ -501,6 +655,11 @@ declare function $forOf(iterable: Abs, body: (item: Abs, index: Abs) => void, ma
|
|
|
501
655
|
* Map/Set forEach:条目表逐条调用回调(value, key, recv)。
|
|
502
656
|
* 回调是 求值引擎 JS 函数(transpile 内联箭头)直接调用;Abs fn 走 $call。
|
|
503
657
|
* 回调返回值丢弃;forEach 表达式值恒 undefined。
|
|
658
|
+
*
|
|
659
|
+
* Bug 198:**live 视图**——原生 forEach 持条目指针:迭代期间新增的条目被
|
|
660
|
+
* 访问、删除的条目被跳过(`m.forEach(v => { out.push(k); m.set("b",2) })`
|
|
661
|
+
* 原生 "a,b",引擎快照口径只有 "a")。表不干净(shadow / maybeAbsent)⇒
|
|
662
|
+
* 无 live 视图 ⇒ 沿用快照口径。
|
|
504
663
|
*/
|
|
505
664
|
declare function $collectionForEach(recv: Abs, cb: unknown): Abs | undefined;
|
|
506
665
|
|
|
@@ -517,6 +676,51 @@ declare function $collectionForEach(recv: Abs, cb: unknown): Abs | undefined;
|
|
|
517
676
|
* - 闭 shape 字面量 key miss → 精确 undefined(键确定不存在);open
|
|
518
677
|
* shape / 抽象键 → 并 unknown(键可能存在);已知原型访问器名槽面
|
|
519
678
|
* 未建模 → 诚实 unknown(不得 wrong-exact undefined)。
|
|
679
|
+
* - Bug 149:符号投影键("[Symbol.X]" → "@@X")在 **Proxy 陷阱边界**还原成
|
|
680
|
+
* 真 symbol(规范 PropertyKey);字面量串键 "@@X" 不带标记,仍是字符串键。
|
|
681
|
+
* - Bug 218:prim(number/boolean/bigint/symbol)读**确定不存在**的成员 →
|
|
682
|
+
* undefined 字面量(原生语义),不是 unknown——unknown 接收者不记
|
|
683
|
+
* may-throw,会让后续读该值的 TypeError 丢失(L2 门禁假绿)。
|
|
684
|
+
* - Bug 219:symbol prim 的 toString/toLocaleString/valueOf 走
|
|
685
|
+
* **Symbol.prototype 自己的面**(toString/valueOf 带 brand check——
|
|
686
|
+
* 借用调用非 symbol 接收者定抛 TypeError),不落 Object.prototype 泛型版。
|
|
687
|
+
* - Bug 206/225:类值写面的两个原生「不可写」——`A.prototype = v` 与
|
|
688
|
+
* getter-only 静态访问器的写,都定抛 strict TypeError(例外:引擎内部
|
|
689
|
+
* defineProperty 对原型的就地改写回装)。
|
|
690
|
+
* - Bug 234:类值的 `constructor` = 内建 Function(原生继承自
|
|
691
|
+
* Function.prototype),不是「以类名命名的内建构造器」。
|
|
692
|
+
* - Bug 235:Proxy 无 get 陷阱时转发 `target.[[Get]](key, Receiver)`——
|
|
693
|
+
* Receiver 必须是 proxy 自己(靶上 getter 的 this = receiver,不是靶)。
|
|
694
|
+
* - Bug 210:Proxy **get 陷阱**返回值过 [[Get]] 规范不变量(state.ts 的
|
|
695
|
+
* enforceProxyGetInvariant)——靶上自有属性不可配置且不可写时,陷阱值
|
|
696
|
+
* 须 SameValue 靶值,否则原生定抛 TypeError(此前直接返陷阱值,假绿)。
|
|
697
|
+
* - Bug 209:Proxy **set 陷阱**返回值按规范 ToBoolean 判定——falsy(0 / "" /
|
|
698
|
+
* null / undefined / false)→ strict TypeError(只认字面量 false 会漏)。
|
|
699
|
+
* - Bug 197:[[Set]] 写门——receiver **无自有该键**时沿 [[Prototype]] 链
|
|
700
|
+
* 上溯(OrdinarySet):访问器(无 setter)→ strict TypeError;带 setter
|
|
701
|
+
* → 派发 setter;数据属性 writable:false / frozen 原型 → strict
|
|
702
|
+
* TypeError;链上无人持该键 → receiver 建自有属性。fn 臂 / 静态类值臂 /
|
|
703
|
+
* 数组下标臂另查 defineProperty 的 writable:false(见 proto-set.ts)。
|
|
704
|
+
* **类实例面**同走该门(原型 = `A.prototype`,proto-set.ts 经
|
|
705
|
+
* protoOfRecv 解析类注册表)——此前类实例未登记 protoTable ⇒ 门恒 allow
|
|
706
|
+
* ⇒ 原型上动态装的只读属性 / getter-only 被静默写穿。
|
|
707
|
+
* - Bug 223/231:数组 length 写门——域判定走 ToNumber(具体非数值
|
|
708
|
+
* undefined / {} / "abc" 定抛 RangeError,Symbol 抛 TypeError);sealed
|
|
709
|
+
* 数组 length **截断**写要删不可配置元素 → strict TypeError(增长合法;
|
|
710
|
+
* preventExtensions 不冻结元素 → 截断不抛)。见 array-length.ts。
|
|
711
|
+
* - Bug 198(S20):内建 brand 实例上的 `@@iterator` 读值 = **原型上同一个
|
|
712
|
+
* 函数对象**(原生 m[Symbol.iterator] === Map.prototype[Symbol.iterator])
|
|
713
|
+
* ⇒ 走符号成员表(builtinSymbolMemberAbs),不得给 no-op fn——no-op fn 被
|
|
714
|
+
* 调用折 <abs:never>(自信的错值:原生返回集合迭代器)。Map/Set 的该成员
|
|
715
|
+
* 产出 **live 视图**集合迭代器(collectionIteratorFor),投影口径同原生:
|
|
716
|
+
* Map → [k,v] 元组(entries),Set → 元素本身(values,非 [el,el])。
|
|
717
|
+
* - Bug 291:fn 臂的**不变性写门**与 obj 臂同款——frozen 全写 strict
|
|
718
|
+
* TypeError;sealed/nonext 新键 TypeError(函数亦是不可扩展对象)。
|
|
719
|
+
* - Bug 315:本模块向 builtins/object-proto.ts 注册**接收者 toString 解析
|
|
720
|
+
* 钩子**(Object.prototype.toLocaleString 委派 this.toString())——注册式
|
|
721
|
+
* 注入断开 builtins↔exec 的 import 环(同 protoMethodDispatch 口径)。
|
|
722
|
+
* - Bug 325:fn impl 的 kind 值域含 "async-generator"(与 "generator" 同有
|
|
723
|
+
* 原生 prototype)——prototype 面读该戳。
|
|
520
724
|
*/
|
|
521
725
|
|
|
522
726
|
declare function namespaceNameOf(v: unknown): string | undefined;
|
|
@@ -524,8 +728,17 @@ declare function namespaceNameOf(v: unknown): string | undefined;
|
|
|
524
728
|
declare function $regex(pattern: string, flags?: string): Abs;
|
|
525
729
|
/** 成员读:obj.slots[key];缺失 → undefined 字面量;brand 解包内层 */
|
|
526
730
|
declare function $get(o: Abs, key: string, opts?: {
|
|
527
|
-
silent?: boolean;
|
|
528
|
-
|
|
731
|
+
/** 调用方已负责诊断(如 $invoke) */ silent?: boolean;
|
|
732
|
+
/** Bug 149:键来自符号投影("[Symbol.X]" → "@@X")——陷阱边界还原真 symbol */
|
|
733
|
+
symbolKey?: boolean;
|
|
734
|
+
},
|
|
735
|
+
/**
|
|
736
|
+
* Bug 235:[[Get]] 的 **receiver**(规范 Proxy.[[Get]](P, key, Receiver)
|
|
737
|
+
* 无 get 陷阱时转发 `target.[[Get]](key, Receiver)`)。缺省 = 接收者自身。
|
|
738
|
+
* 只作用于本次读取的访问器 `this` 绑定——不向下递归传递(内层读取的
|
|
739
|
+
* receiver 仍是它自己的接收者)。
|
|
740
|
+
*/
|
|
741
|
+
receiver?: Abs): Abs;
|
|
529
742
|
/** 成员写:返回新 obj/brand(不可变更新);frozen/sealed/只读目标按 sloppy 静默失败。
|
|
530
743
|
* opts.internal(Bug 84):私有字段落地——槽打 Slot.internal 标记;后续覆写
|
|
531
744
|
* 保留既有标记(this.#x = v 不丢失 internal)。
|
|
@@ -538,45 +751,26 @@ declare function $set(o: Abs, key: string, value: Abs, opts?: {
|
|
|
538
751
|
}): Abs;
|
|
539
752
|
|
|
540
753
|
/**
|
|
541
|
-
*
|
|
754
|
+
* 空值 / 类型 / 相等 / 关系守卫的臂剪影(narrowing)运行时。
|
|
755
|
+
*
|
|
756
|
+
* 域:转译器在守卫臂内对绑定名做的影子重绑(`exec/transpile/stmt-predicates.ts`
|
|
757
|
+
* 发射、`runtime.ts` facade 转出):
|
|
758
|
+
* - nullish:`$removeNullish` / `$removeNull` / `$removeUndefined` /
|
|
759
|
+
* `$removeMemberNullish`——按 term 字面量逐成员剥离 null / undefined
|
|
760
|
+
* (Bug 3 粒度),`$nullishTest` 产出 `??` / `??=` 的测试值;
|
|
761
|
+
* - typeof:`$narrowTypeOf` 按 typeof 分类剪 union 成员(事实臂 / 补集臂);
|
|
762
|
+
* - 判别等值:`$narrowMemberEq` 按 key 槽的字面量事实剪成员(issue #126);
|
|
763
|
+
* - 关系:`$refineRel` 给关系事实臂挂界(Bug 1)。
|
|
764
|
+
*
|
|
765
|
+
* 共享 nullish 谓词:`isNullishLitAbs` / `definitelyNotNullishShape`
|
|
766
|
+
* (surface.ts)与本地 `isNullLitAbs` / `isUndefLitAbs` /
|
|
767
|
+
* `definitelyNullishAbs` 是同一套逐成员判定口径——各剪影的「剪空 → 原样
|
|
768
|
+
* 返回」保守分支都以此为准;其它 runtime 文件不要另造第二套。
|
|
769
|
+
*
|
|
770
|
+
* 本文件不依赖 async / generator 机制(单向:runtime/async.ts 与
|
|
771
|
+
* runtime.ts 只做转出);新增 narrow 算子放这里,不要回填 async.ts。
|
|
542
772
|
*/
|
|
543
773
|
|
|
544
|
-
declare function $async(thunk: () => Abs): Abs;
|
|
545
|
-
/** await → 解包 eff("promise") */
|
|
546
|
-
declare function $await(v: Abs): Abs;
|
|
547
|
-
/** async 直接 return 的 coerce */
|
|
548
|
-
declare function $asyncReturn(v: Abs): Abs;
|
|
549
|
-
/** function* 体:收集所有 yield 值;返回带迭代器协议面的生成器对象 Abs;
|
|
550
|
-
* 抽象分支时降 conf(P0-6)
|
|
551
|
-
*
|
|
552
|
-
* Bug 58:调用生成器是原生全操作——体只在首个 next() 执行。body() eager
|
|
553
|
-
* 执行的体内效果(成员读 may-throw / 显式 throw)不折进**调用方** throws
|
|
554
|
-
* 域——以捕获式 may-throw 帧包裹:soft 效果与 NudoThrow 挂生成器对象
|
|
555
|
-
* (Bug 34 延迟重放:首个触达抛点的 next()/迭代消费,仅构造不消费不
|
|
556
|
-
* 表面)。yield 收集保持 eager(既有值域建模,注释口径不变)。
|
|
557
|
-
* Bug 2:thunk 返回值 = 终末 return 值——不再丢弃,经 makeGenObject 在
|
|
558
|
-
* 首个 done:true 作为 value 交付(node 实测:此后 next 回 undefined)。
|
|
559
|
-
* Bug 22:结果从 yield 元组数组改为生成器对象(next/return/throw 方法面 +
|
|
560
|
-
* constructor 身份);元素域经侧表保留($arr 的 ≤cap tuple / >cap arr
|
|
561
|
-
* widen 策略不变),迭代路径(for-of/spread/Array.from)继续工作。
|
|
562
|
-
* Bug 53:侧表/next() 消费完整收集序列(ys.els)——$arr >cap widen 只影响
|
|
563
|
-
* 形状槽(类型面),不再把 >8 yield 截断成单元素流。
|
|
564
|
-
* Bug 52:yield 点 try 上下文(ys.ctxs,$yield 第二实参)随序列传递——
|
|
565
|
-
* .return()/.throw() 挂起点语义见 makeGenObject。 */
|
|
566
|
-
declare function $gen(body: () => Abs): Abs;
|
|
567
|
-
/** yield v:压入当前生成器收集器;表达式值用 unknown。
|
|
568
|
-
* tryCtx(Bug 52)= transpile 静态标注的 yield 点 try 上下文位
|
|
569
|
-
* (YIELD_TRY_FINALLY / YIELD_TRY_CATCH),.return()/.throw() 挂起点
|
|
570
|
-
* 语义用(见 makeGenObject)。 */
|
|
571
|
-
declare function $yield(v: Abs, tryCtx?: number): Abs;
|
|
572
|
-
/** yield* v(Bug 82):委托迭代 ≠ yield v——GetIterator 校验先行($elems
|
|
573
|
-
* 同分类器:非可迭代接收者 definite/may TypeError,生成器体内按 $gen
|
|
574
|
-
* 迭代期语义由外层帧吸收),**元素**逐个压入收集器(此前把整个可迭代值
|
|
575
|
-
* 压一次);表达式值 = 内层迭代器的 return 值(生成器 return / 自定义
|
|
576
|
-
* iterator 的 done 值,不可判)→ 保守 unknown。长度不可判的接收者
|
|
577
|
-
* (arr/any/…)单代表元素过近似并入 + bumpGenPathSensitive 压 conf
|
|
578
|
-
* (mergeArmYields 同口径,禁 exact 元组出货)。 */
|
|
579
|
-
declare function $yieldStar(v: unknown, tryCtx?: number): Abs;
|
|
580
774
|
/**
|
|
581
775
|
* `??` 非 nullish 臂:从左值 Abs 剥离 nullish 部分($nullishTest 判 true
|
|
582
776
|
* 的成员)。索引访问 `M[k]` 对抽象键产出 joinAbs(element, undef()),
|
|
@@ -649,14 +843,164 @@ declare function $narrowMemberEq(a: Abs, key: string, value: string | number | b
|
|
|
649
843
|
/** `??` / `??=` 测试:确定非 nullish → false;lit nullish → true;否则抽象 boolean */
|
|
650
844
|
declare function $nullishTest(v: Abs): Abs;
|
|
651
845
|
|
|
846
|
+
/**
|
|
847
|
+
* async / await / generator 运行时(nullish / typeof / 判别 / 关系守卫的臂
|
|
848
|
+
* 剪影在 runtime/narrow.ts,本文件只为深路径导入者做兼容转出)。
|
|
849
|
+
*
|
|
850
|
+
* 不变量(本文件):
|
|
851
|
+
* - `$await` 的取值面 = 原生的 adopt 口径:promise 走 eff("promise") 通道
|
|
852
|
+
* (**双臂** promise 的 rejected 臂不得丢——记入 throw 通道供体内
|
|
853
|
+
* try/catch 吸收,未被吸收者并入 promise 的 rejected 通道);**thenable**
|
|
854
|
+
* (闭对象 + 自有 then 槽)走 PromiseResolve 式采纳(取 then(res, rej)
|
|
855
|
+
* 的 settle 值,不是 thenable 本身)。any/unknown/fn/开对象的采纳面
|
|
856
|
+
* 不可判 → 保持原值(不猜、不用 unknown 掩盖)。
|
|
857
|
+
* - Bug 1052:thenable 采纳的**判定与调用**与 promise 构造面(`Promise.resolve`
|
|
858
|
+
* / `new Promise(resolve => resolve(thenable))`)**同一套机制**
|
|
859
|
+
* (`builtins/promise.ts` 的 `thenableAdoption`)——本文件只做 await 面的
|
|
860
|
+
* 语义映射(reject → throw;未 settle → 悬挂)。
|
|
861
|
+
* - 生成器对象是**内部槽对象**:协议方法与 yield 元素的槽标 internal
|
|
862
|
+
* (枚举面 / 自有面不可见;$get / $in 照常直读直查)。
|
|
863
|
+
* - `yield*` 委托的 `.return(v)` 必须**转发**给委托迭代器(委托的清理
|
|
864
|
+
* 副作用不得整体丢失)。
|
|
865
|
+
*/
|
|
866
|
+
|
|
867
|
+
declare function $async(thunk: () => Abs): Abs;
|
|
868
|
+
/**
|
|
869
|
+
* Bug 201:async 体的**真挂起**路径(宿主生成器驱动)。
|
|
870
|
+
*
|
|
871
|
+
* 转译侧:async 体(**直接含 await**)编译成宿主生成器 `function*(){…}`,
|
|
872
|
+
* `await x` 发射 `yield x`(挂起点 + 被等待值)。本函数驱动生成器:
|
|
873
|
+
*
|
|
874
|
+
* - **同步段**:跑到第一个挂起点即返回 promise(inner 暂 unknown)⇒
|
|
875
|
+
* await 之后的语句**不在调用点内联跑完**(原生:恢复点是微任务)。
|
|
876
|
+
* - **续体**:登记到宿主微任务队列(与 promise reaction **同一队列** ⇒
|
|
877
|
+
* 跨 promise 链的先后顺序天然保真——上游 promise 的续体先跑,下游
|
|
878
|
+
* `await` 恢复时读到的已是上游终值)。
|
|
879
|
+
* - **值域**:续体跑完 ⇒ 就地填 promise 的 inner(终值由续体给出)。
|
|
880
|
+
*
|
|
881
|
+
* 与 `$async(thunk)` 的分工:**无 await 的 async 体**没有挂起点,沿用
|
|
882
|
+
* `$async` 的同步路径(发射产物逐字不变 ⇒ 既有金标零漂移)。
|
|
883
|
+
*
|
|
884
|
+
* Bug 1126:live `$asyncGen` promise 带 **pending 态**(体尚未 settle)与
|
|
885
|
+
* **waiter 列表**(等它 settle 才恢复的 await 恢复点)。
|
|
886
|
+
*
|
|
887
|
+
* **机制共用**(Bug 1148):pending 判定 + waiter 冲刷抽到
|
|
888
|
+
* `builtins/promise.ts` 的 `pendingPromiseWaiters`(`registerPendingPromise` /
|
|
889
|
+
* `isPendingPromiseShape` / `onPromiseSettled` / `flushPromiseWaiters`)——
|
|
890
|
+
* `Promise.all` 的活通道聚合(元素 settle 后刷新兑现值)与本文件的 await 恢复
|
|
891
|
+
* 点**同一套** pending 机制(不另造第二套)。
|
|
892
|
+
*
|
|
893
|
+
* 键 = promise 的 shape 对象(活通道本体:`inner` 就地填)。每个 `$asyncGen`
|
|
894
|
+
* 调用一个 shape ⇒ 键唯一;WeakMap ⇒ 随 promise 回收,不泄漏。
|
|
895
|
+
*
|
|
896
|
+
* **不挂在 shape 上**:`Shape` 是 `abs.ts` 的公开联合类型(eff 面无 pending
|
|
897
|
+
* 槽),且 waiter 闭包不该进投影 / 指纹面(`absShapeKey` / `shapeKey` 只读
|
|
898
|
+
* `inner`)。
|
|
899
|
+
*/
|
|
900
|
+
declare function $asyncGen(genFn: () => Generator): Abs;
|
|
901
|
+
/** await → 解包 eff("promise") */
|
|
902
|
+
declare function $await(v: Abs): Abs;
|
|
903
|
+
/** function* 体:收集所有 yield 值;返回带迭代器协议面的生成器对象 Abs;
|
|
904
|
+
* 抽象分支时降 conf(P0-6)
|
|
905
|
+
*
|
|
906
|
+
* Bug 58:调用生成器是原生全操作——体只在首个 next() 执行。body() eager
|
|
907
|
+
* 执行的体内效果(成员读 may-throw / 显式 throw)不折进**调用方** throws
|
|
908
|
+
* 域——以捕获式 may-throw 帧包裹:soft 效果与 NudoThrow 挂生成器对象
|
|
909
|
+
* (Bug 34 延迟重放:首个触达抛点的 next()/迭代消费,仅构造不消费不
|
|
910
|
+
* 表面)。yield 收集保持 eager(既有值域建模,注释口径不变)。
|
|
911
|
+
* Bug 2:thunk 返回值 = 终末 return 值——不再丢弃,经 makeGenObject 在
|
|
912
|
+
* 首个 done:true 作为 value 交付(node 实测:此后 next 回 undefined)。
|
|
913
|
+
* Bug 22:结果从 yield 元组数组改为生成器对象(next/return/throw 方法面 +
|
|
914
|
+
* constructor 身份);元素域经侧表保留($arr 的 ≤cap tuple / >cap arr
|
|
915
|
+
* widen 策略不变),迭代路径(for-of/spread/Array.from)继续工作。
|
|
916
|
+
* Bug 53:侧表/next() 消费完整收集序列(ys.els)——$arr >cap widen 只影响
|
|
917
|
+
* 形状槽(类型面),不再把 >8 yield 截断成单元素流。
|
|
918
|
+
* Bug 52:yield 点 try 上下文(ys.ctxs,$yield 第二实参)随序列传递——
|
|
919
|
+
* .return()/.throw() 挂起点语义见 makeGenObject。
|
|
920
|
+
* Bug 141:asyncMode(第二实参)= async generator 面——迭代结果经 promise
|
|
921
|
+
* 交付(next/return/throw 返 promise)、装 @@asyncIterator 自返槽与
|
|
922
|
+
* @@toStringTag "AsyncGenerator"(原生 async function* / async * 方法)。 */
|
|
923
|
+
declare function $gen(body: () => Abs, asyncMode?: boolean): Abs;
|
|
924
|
+
/** yield v:压入当前生成器收集器;表达式值用 unknown。
|
|
925
|
+
* tryCtx(Bug 52)= transpile 静态标注的 yield 点 try 上下文位
|
|
926
|
+
* (YIELD_TRY_FINALLY / YIELD_TRY_CATCH),.return()/.throw() 挂起点
|
|
927
|
+
* 语义用(见 makeGenObject)。 */
|
|
928
|
+
declare function $yield(v: Abs, tryCtx?: number): Abs;
|
|
929
|
+
/** yield* v(Bug 82):委托迭代 ≠ yield v——GetIterator 校验先行($elems
|
|
930
|
+
* 同分类器:非可迭代接收者 definite/may TypeError,生成器体内按 $gen
|
|
931
|
+
* 迭代期语义由外层帧吸收),**元素**逐个压入收集器(此前把整个可迭代值
|
|
932
|
+
* 压一次);表达式值 = 内层迭代器的 return 值(生成器 return / 自定义
|
|
933
|
+
* iterator 的 done 值,不可判)→ 保守 unknown。长度不可判的接收者
|
|
934
|
+
* (arr/any/…)单代表元素过近似并入 + bumpGenPathSensitive 压 conf
|
|
935
|
+
* (mergeArmYields 同口径,禁 exact 元组出货)。 */
|
|
936
|
+
declare function $yieldStar(v: unknown, tryCtx?: number): Abs;
|
|
937
|
+
|
|
652
938
|
type TranspileOptions = {
|
|
653
|
-
/**
|
|
654
|
-
|
|
939
|
+
/**
|
|
940
|
+
* 运行时 import 说明符。
|
|
941
|
+
*
|
|
942
|
+
* `null` = **不发射**运行时 import 行(宿主编译:`new Function` 单元以
|
|
943
|
+
* 形参注入运行符号)。缺省 = `@nudojs/core/exec`。
|
|
944
|
+
*/
|
|
945
|
+
runtimeImport?: string | null;
|
|
946
|
+
/**
|
|
947
|
+
* 发射目标(缺省 `"esm"`,既有产物逐字节不变):
|
|
948
|
+
* - `"esm"`:保留标准 `import` / `export` 语句(run.ts 后处理改写);
|
|
949
|
+
* - `"host"`:直接发射宿主编译形态——import → `__nudoBindImport` /
|
|
950
|
+
* `__nudoBindNamespace` 绑定,export → `__nudoExport*` 调用,不残留任何
|
|
951
|
+
* `import` / `export` 语句,也不发射运行时 import 行(宿主以形参注入)。
|
|
952
|
+
*/
|
|
953
|
+
target?: "esm" | "host";
|
|
954
|
+
/**
|
|
955
|
+
* 发射模式(缺省 `"exec"`):
|
|
956
|
+
* - `"exec"`:完整发射(全部顶层语句,含副作用);
|
|
957
|
+
* - `"analyze"`:**发射期**剥离顶层效应语句——顶层 `if` / `for` /
|
|
958
|
+
* `while`、危险或未知全局调用(判定表见 `transpile/analyze-strip.ts`);
|
|
959
|
+
* `var` 提升仍按**原始**源 AST 计算。调用方(run.ts 的 analyze 模式)
|
|
960
|
+
* 不再解析生成产物做二次剥离;保留语句的发射字节与 `"exec"` 完全一致,
|
|
961
|
+
* 剥离只减少语句。
|
|
962
|
+
*
|
|
963
|
+
* `for-in` / `for-of` **不剥离**(判定表无该臂):二者按发射形态落顶层
|
|
964
|
+
* `$forOf(...)` 调用(循环体随该调用在模块顶层执行)⇒ analyze 模式保留
|
|
965
|
+
* 其语义;标签 `for` / `while` 随标签一并剥离。
|
|
966
|
+
*/
|
|
967
|
+
mode?: "exec" | "analyze";
|
|
968
|
+
/**
|
|
969
|
+
* host target 的 mock 名集:命中的 import 本地名绑定 `__nudoEnv[<名>]`
|
|
970
|
+
* 而非 `__nudoBindImport` / `__nudoBindNamespace`,且不登记 live refresh
|
|
971
|
+
* (刷新会把 mock 冲掉)。esm target 忽略(run.ts 的文本改写负责 mock)。
|
|
972
|
+
*/
|
|
973
|
+
mockNames?: ReadonlySet<string>;
|
|
974
|
+
/**
|
|
975
|
+
* @internal host target 的 live import refresh 发射状态(transpileFile
|
|
976
|
+
* 创建并跨语句线程化):`binds` 是全量刷新赋值文本(按源序,已排除
|
|
977
|
+
* mock),`done` 标记注册行是否已随首个「产生绑定」的 import 语句发射。
|
|
978
|
+
* 直接调用 `transpileStatement` 的低层单元不传 ⇒ 不发射注册行。
|
|
979
|
+
*/
|
|
980
|
+
hostImportRefresh?: {
|
|
981
|
+
readonly binds: readonly string[];
|
|
982
|
+
done: boolean;
|
|
983
|
+
};
|
|
655
984
|
maxLoopIters?: number;
|
|
656
985
|
/** 方法/函数体内 this 的绑定名(transpile class 时注入) */
|
|
657
986
|
thisParam?: string;
|
|
987
|
+
/**
|
|
988
|
+
* Bug 1160:本转译单元**共享**的 this 载体名(`__this` 基名经
|
|
989
|
+
* `internalTmpName` 分配)。载体是跨发射器协议——真函数体 prologue
|
|
990
|
+
* (`let <名> = $rawThis(this)`)与类/对象方法、访问器 thunk、字段 /
|
|
991
|
+
* 静态块 thunk 的首参**一方声明、多方读**(读方即 `thisParam`)——必须
|
|
992
|
+
* 同名。根转译单元(`transpileFile` / `transpileBodyNode`)分配一次并
|
|
993
|
+
* 线程化;无碰撞时基名 `__this` 原样返回 ⇒ 产物逐字不变。
|
|
994
|
+
*/
|
|
995
|
+
thisSlot?: string;
|
|
658
996
|
/** 当前类名(super 派发用) */
|
|
659
997
|
className?: string;
|
|
998
|
+
/**
|
|
999
|
+
* Bug 133:类表达式的 **NamedEvaluation 名**(`const K = class {}` → "K")。
|
|
1000
|
+
* 只对**本表达式自身**生效——类体内的嵌套类表达式拿不到该名(原生内层
|
|
1001
|
+
* 仍是无名类);类自身的名字(`class Named {}`)优先于绑定名。
|
|
1002
|
+
*/
|
|
1003
|
+
classNameHint?: string;
|
|
660
1004
|
/**
|
|
661
1005
|
* 静态方法体内 super 的接收者源(父类构造器——extends 表达式经
|
|
662
1006
|
* classSpecOf 前移计算注入)。super.x / super.m() / super[k] 落通用
|
|
@@ -670,11 +1014,17 @@ type TranspileOptions = {
|
|
|
670
1014
|
replacements?: Array<{
|
|
671
1015
|
target: string;
|
|
672
1016
|
varName: string;
|
|
673
|
-
/**
|
|
1017
|
+
/**
|
|
1018
|
+
* 仅该**节点**范围内生效——字符区间 `[stmtStart, stmtEnd)`
|
|
1019
|
+
* (Babel 节点的 start/end 偏移),**不是行号**:Bug 166 修法把
|
|
1020
|
+
* 「行号窗口」改成「AST 节点身份」,行号窗口会泄漏进嵌套/同行的
|
|
1021
|
+
* 其它子表达式。
|
|
1022
|
+
*/
|
|
674
1023
|
stmtStart?: number;
|
|
675
1024
|
stmtEnd?: number;
|
|
676
1025
|
}>;
|
|
677
|
-
/** @nudo:as:覆盖紧随语句的 init / return
|
|
1026
|
+
/** @nudo:as:覆盖紧随语句的 init / return(stmtStart/stmtEnd = 字符区间,
|
|
1027
|
+
* 语义同上——按节点身份定位,不按行号) */
|
|
678
1028
|
asOverrides?: Array<{
|
|
679
1029
|
varName: string;
|
|
680
1030
|
stmtStart: number;
|
|
@@ -692,6 +1042,19 @@ type TranspileOptions = {
|
|
|
692
1042
|
lenientGlobals?: boolean;
|
|
693
1043
|
/** try 嵌套深度(>0 时 return 前 drain throwExits,使 catch 能吸收抽象 throw) */
|
|
694
1044
|
inTry?: number;
|
|
1045
|
+
/**
|
|
1046
|
+
* 「块完成 ≠ 函数尾」深度(>0 时**早退提升**走控制流协议而非「返回值」
|
|
1047
|
+
* 协议)。
|
|
1048
|
+
*
|
|
1049
|
+
* 族 65 · BC #28:try / catch / finally **块体**的完成不是函数尾(块跑完
|
|
1050
|
+
* 后函数继续往下走)⇒ 早退提升(fn-body.ts)的 alt 臂(后续路径)跑完后
|
|
1051
|
+
* **不得**把它的值当函数返回值抛出。此前只有 `inTry` 计入 inCtrl ⇒ catch /
|
|
1052
|
+
* finally 体(inTry 不加)落「返回值」协议(`return $fork(...)`)⇒ 后续
|
|
1053
|
+
* 路径的值被当成函数返回值(自信的错值)。
|
|
1054
|
+
*
|
|
1055
|
+
* 与 `inTry` 分开:inTry 另有职责(return 前 drain throwExits)。
|
|
1056
|
+
*/
|
|
1057
|
+
inCtrlBlock?: number;
|
|
695
1058
|
/** 当前 try 的 mark 变量名(return drain 用;避免全局栈顶污染) */
|
|
696
1059
|
tryMarkName?: string;
|
|
697
1060
|
/** 当前 try 是否带 catch handler(soft may-throw digest/release 分支) */
|
|
@@ -707,6 +1070,40 @@ type TranspileOptions = {
|
|
|
707
1070
|
yieldTryCtx?: number;
|
|
708
1071
|
/** 分支/循环体内深度(赋值记录 conditional 标记;inLoop 也计入) */
|
|
709
1072
|
conditionalFlow?: number;
|
|
1073
|
+
/**
|
|
1074
|
+
* 当前处在 **async 函数体**内(Bug 201)。
|
|
1075
|
+
*
|
|
1076
|
+
* async 体内的 `await` 是**真挂起点**:发射 `yield <operand>`(宿主生成器
|
|
1077
|
+
* 挂起),由 `$asyncGen` 驱动恢复 ⇒ await 之后的语句不在调用点内联跑完
|
|
1078
|
+
* (原生:恢复点是微任务)。
|
|
1079
|
+
*
|
|
1080
|
+
* 函数/方法体边界重置:async 体 ⇒ true;**非** async 体 ⇒ false(嵌套
|
|
1081
|
+
* 同步函数不得继承——它不是生成器,`yield` 会是语法错误)。
|
|
1082
|
+
*/
|
|
1083
|
+
inAsyncBody?: boolean;
|
|
1084
|
+
/**
|
|
1085
|
+
* **强制关闭** async 体的生成器路径(`$async` 同步路径)。
|
|
1086
|
+
*
|
|
1087
|
+
* Bug 1139(安全网):`await` 的位置表(`async-plan.ts`)与转译侧一旦脱节,
|
|
1088
|
+
* `yield` 会落进嵌套箭头 ⇒ `new Function` SyntaxError ⇒ **整个模块**编译
|
|
1089
|
+
* 失败 ⇒ 全部导出丢失 ⇒ L2 闸门**假绿**(exit 0)。求值引擎在生成器模式
|
|
1090
|
+
* 编译失败时以本开关**重试一次** ⇒ 模块至少编译得出来 ⇒ 导出可见 ⇒ 闸门
|
|
1091
|
+
* 照常判定(宁可少精确,不可整模块消失)。
|
|
1092
|
+
*/
|
|
1093
|
+
disableAsyncGen?: boolean;
|
|
1094
|
+
/**
|
|
1095
|
+
* 当前 async 体内**需发挂起门**的 `for await` 语句节点(节点身份)。
|
|
1096
|
+
*
|
|
1097
|
+
* Bug 201:原生 `for await` 每轮一个 await;引擎既有建模是同步驱动 ⇒
|
|
1098
|
+
* 生成器级发**整循环一个**挂起门(循环前 `yield`)。只有落在**生成器级**
|
|
1099
|
+
* 位置(生成器体内联)的 for await 才能发门——分支臂/循环体里的 for await
|
|
1100
|
+
* 是宿主 thunk(`yield` 会是语法错误)⇒ 由 async-plan 判定排除。
|
|
1101
|
+
*
|
|
1102
|
+
* 键 = 源偏移量(`String(node.start)`)——转译侧会**浅拷贝**语句节点
|
|
1103
|
+
* (completeElseChains / flattenEarlyReturnBlocks)⇒ 节点身份不稳定,
|
|
1104
|
+
* 源偏移量在拷贝间稳定。
|
|
1105
|
+
*/
|
|
1106
|
+
asyncForAwaitGates?: ReadonlySet<string>;
|
|
710
1107
|
/** 函数/箭头体内(顶层绑定表只收顶层作用域) */
|
|
711
1108
|
inFunction?: boolean;
|
|
712
1109
|
/**
|
|
@@ -739,6 +1136,56 @@ type TranspileOptions = {
|
|
|
739
1136
|
* 成员/下标写对根的内部重绑不在用户赋值路径,不走此表。
|
|
740
1137
|
*/
|
|
741
1138
|
constNames?: ReadonlySet<string>;
|
|
1139
|
+
/**
|
|
1140
|
+
* 直接 const 别名组(`const a = {...}; const b = a;`)。
|
|
1141
|
+
*
|
|
1142
|
+
* fork/循环 pack 只按「被写绑定」收集快照名;别名伙伴不在集合里时,
|
|
1143
|
+
* 臂/轮次结束把 `a` 重绑为副本会断开 `b` 的引用语义。该表在**作用域
|
|
1144
|
+
* 边界**上计算(只收 init 为同作用域、此前已声明 const 的标识符,避免
|
|
1145
|
+
* TDZ 与可重绑 let):函数/方法体与嵌套块由 transpileFnBodyStmts 算,
|
|
1146
|
+
* **模块顶层**(模块体逐语句发射、不经函数体入口)由 transpile.ts 算。
|
|
1147
|
+
* 嵌套作用域**继承**外层组并按自身遮蔽名过滤(未被遮蔽 ⇒ 同一绑定,
|
|
1148
|
+
* 展开安全;被遮蔽 ⇒ 该组在本处指向不同绑定,丢弃),fork/pack 发射时
|
|
1149
|
+
* 据此扩展 snapshot 集合。
|
|
1150
|
+
*/
|
|
1151
|
+
aliasGroups?: ReadonlyArray<readonly string[]>;
|
|
1152
|
+
/**
|
|
1153
|
+
* 本转译单元内被用户绑定**遮蔽**的宿主内建名(undefined / NaN / Infinity
|
|
1154
|
+
* 的子集,保守单位级)。
|
|
1155
|
+
*
|
|
1156
|
+
* 名字是**宿主全局**但用户可合法遮蔽(`const undefined = 5`、形参名
|
|
1157
|
+
* `undefined`、`let NaN`、import 绑定)。命中者按**位置**分态:
|
|
1158
|
+
* - Identifier 读点(含标签模板位)→ `$absVal(<名>)`,由 JS 词法绑定
|
|
1159
|
+
* 决定读值;
|
|
1160
|
+
* - 调用位 callee → `$callNamed(<名>, <名>, …)`(绑定是 Abs 值,宿主裸
|
|
1161
|
+
* 调用会把它当非函数调 ⇒ 假抛 TypeError)。
|
|
1162
|
+
*
|
|
1163
|
+
* 未命中者:读点恢复字面量精确折叠(`$lit(void 0)` / `$lit(0/0)` /
|
|
1164
|
+
* `$lit(1/0)`,与旧产物逐字节一致),调用位保留宿主裸调用(原生
|
|
1165
|
+
* `undefined(1)` / `NaN(1)` 定抛 TypeError,抛点与原生一致)。
|
|
1166
|
+
*
|
|
1167
|
+
* 计算:`transpileFile` 从源 AST 声明扫描(任意作用域,保守单位级);
|
|
1168
|
+
* `transpileBodyNode` 从 body AST 计算并并入调用方补给;body-fn 补给
|
|
1169
|
+
* 形参 / 闭包绑定名;evalExprAbs 补给注入的 bindings 名 **∪ 表达式 AST
|
|
1170
|
+
* 声明扫描**;表达式入口(exec/transpile/expr.ts 的 `transpileExpression`)
|
|
1171
|
+
* 同补声明扫描(表达式内部的形参 / 局部声明此前不可见);run.ts 补给
|
|
1172
|
+
* @nudo:mock 注入的内建名(env 注入本就跳过这三个名字)。
|
|
1173
|
+
*
|
|
1174
|
+
* 静态窄化面:`x === undefined` / `case undefined:` 只在**未遮蔽**时作
|
|
1175
|
+
* 字面量事实——遮蔽后该标识符是普通绑定,比较值是绑定值(如 5)。
|
|
1176
|
+
*/
|
|
1177
|
+
shadowedIntrinsics?: ReadonlySet<string>;
|
|
1178
|
+
/**
|
|
1179
|
+
* **调用方补给的**用户标识符词形集(Bug 1058 避让的补充来源)。
|
|
1180
|
+
*
|
|
1181
|
+
* `internalTmpName` 的避让集 = `userIdentInfo(opts.source).names`(源文本
|
|
1182
|
+
* 词形)∪ 本集合。用于**没有源文本**的转译单元——`exec/body-fn.ts` 的
|
|
1183
|
+
* body 编译路径(`transpileBodyNode(impl.body, …)` 原先传空 opts ⇒ 无
|
|
1184
|
+
* source ⇒ 避让集恒空 ⇒ 引擎内部临时名与用户标识符相撞 ⇒ 产物非法 JS
|
|
1185
|
+
* ⇒ 整模块 fail-closed)。该路径的调用方从 **AST** 收标识符词形
|
|
1186
|
+
* (body 内全部 Identifier + 形参名)补进来。
|
|
1187
|
+
*/
|
|
1188
|
+
userIdents?: ReadonlySet<string>;
|
|
742
1189
|
/**
|
|
743
1190
|
* 本作用域已提升到函数体顶部的 var 名(Bug 21):块内 `var x = init`
|
|
744
1191
|
* 改发赋值 `x = init`(绑定由顶部 `let x = $lit(void 0)` 提供)。
|
|
@@ -750,6 +1197,21 @@ type TranspileOptions = {
|
|
|
750
1197
|
* 声明语句),此类名字从提升集扣除、不发改赋值。
|
|
751
1198
|
*/
|
|
752
1199
|
keepVarDecl?: boolean;
|
|
1200
|
+
/**
|
|
1201
|
+
* 本文件**真实**的静态声明导出名(源 AST:`export function|class|const|let`
|
|
1202
|
+
* / `var`,多声明符全收;解构声明不收内部名)。
|
|
1203
|
+
*
|
|
1204
|
+
* 只有顶层 FunctionDeclaration 的名字命中本集合时才发射 `export ` 前缀
|
|
1205
|
+
* ——此前所有顶层函数一律带 export(发射 quirk)⇒ run.ts 的文本回收把
|
|
1206
|
+
* 私有顶层函数当导出 ⇒ `export *` 被本地私有同名函数遮蔽、私有名泄漏进
|
|
1207
|
+
* 模块导出面、转译产物作为真实 ESM 时多出导出。
|
|
1208
|
+
*
|
|
1209
|
+
* `export { f }` specifier 名**不**在此集合(同名声明未必是声明式导出;
|
|
1210
|
+
* run.ts 在运行时把 specifier 改写成 __nudoExportLazy)。
|
|
1211
|
+
* transpileFile 从已解析 AST 计算并线程化;缺省(直接调用
|
|
1212
|
+
* transpileStatement 的低层单元)⇒ 不发 export。
|
|
1213
|
+
*/
|
|
1214
|
+
exportedDeclNames?: ReadonlySet<string>;
|
|
753
1215
|
/**
|
|
754
1216
|
* issue #165:文件含 `@nudo:assume` 引理——transpileFile 顶层对源文本
|
|
755
1217
|
* 做一次 includes 判定后置位。文件级快速门:无引理的文件不进锚定收集,
|
|
@@ -779,6 +1241,14 @@ type TranspileOptions = {
|
|
|
779
1241
|
/**
|
|
780
1242
|
* transpile 共享 AST 工具:形参名、match、fold、静态键、作用域收集、mutator receiver 扫描。
|
|
781
1243
|
* 不依赖 stmt/expr 发射器(无环)。
|
|
1244
|
+
*
|
|
1245
|
+
* 不变量(@nudo:as / @nudo:replace 指令面):
|
|
1246
|
+
* - **作用范围按 AST 节点身份**(源文本字符区间 [start, end))判定,
|
|
1247
|
+
* 不是「同一行号窗口」:多行语句 / 嵌套块 / 同行下一条语句都不再被命中
|
|
1248
|
+
* (Bug 166)。as 的目标是**承载指令的那条语句**;replace 的目标是该
|
|
1249
|
+
* 语句子树内、**不跨作用域边界**的子表达式节点(边界在收集面划定)。
|
|
1250
|
+
* - **replace 命中的子表达式仍要求值**(副作用与 throws 域保留),只是
|
|
1251
|
+
* 结果被注入值取代(Bug 165);旧口径整段替换 → 副作用与抛错域消失。
|
|
782
1252
|
*/
|
|
783
1253
|
|
|
784
1254
|
/**
|
|
@@ -792,6 +1262,22 @@ declare function foldStaticStringExpr(node: unknown): string | undefined;
|
|
|
792
1262
|
/** require(...) 第一个参数 → 可折叠说明符(StringLiteral / 模板 / 字面量拼接) */
|
|
793
1263
|
declare function foldRequireSpecArg(arg: unknown): string | undefined;
|
|
794
1264
|
|
|
1265
|
+
/**
|
|
1266
|
+
* 运行时 import 行(body-fn 编译执行 / evalExprAbs / 模块体拼接用)。
|
|
1267
|
+
* 产出形态:`import { $a, $b } from "<runtime>";`(单行,双引号说明符)。
|
|
1268
|
+
*/
|
|
1269
|
+
declare function runtimeImportOf(runtime: string): string;
|
|
1270
|
+
/**
|
|
1271
|
+
* 宿主编译前**剥离**上面那行 import 的正则(默认 ESM 产物 / 旧调用方)。
|
|
1272
|
+
*
|
|
1273
|
+
* `new Function` 单元没有 ESM 导入面——运行符号是形参注入(rt.ts 的
|
|
1274
|
+
* compileRuntimeUnit)。host target(`runtimeImport: null`)不发射该行;
|
|
1275
|
+
* 默认 ESM 产物若被宿主直接编译,仍需本正则剥离。只认**双引号**说明符
|
|
1276
|
+
* (runtimeImportOf 的产物);用户源码的 import 由 host target 的
|
|
1277
|
+
* `emitHostImportDeclaration` 直接发射绑定。
|
|
1278
|
+
*/
|
|
1279
|
+
declare const RUNTIME_IMPORT_RE: RegExp;
|
|
1280
|
+
|
|
795
1281
|
/**
|
|
796
1282
|
* 方法/函数体统一发射(stmt 按域拆分之一;语句 switch 在 ./statement.ts)。
|
|
797
1283
|
*
|
|
@@ -800,6 +1286,14 @@ declare function foldRequireSpecArg(arg: unknown): string | undefined;
|
|
|
800
1286
|
* (emitFnBlockBody / transpileFnBodyStmts)——逐语句 map(transpileStatement)
|
|
801
1287
|
* 会绕过早退 if 提升,`if (c) return X; return Y` 的早退值被语句级 $fork
|
|
802
1288
|
* thunk 吞掉(假精确);
|
|
1289
|
+
* - 早退提升的 alt 臂 = **后续路径**(事实臂已 return/throw 提前退出 ⇒ 测试
|
|
1290
|
+
* 为假)⇒ 该臂**不断言否定关系界**(Bug 1115:¬(x <= k) 含 NaN,不可健全
|
|
1291
|
+
* 表示 ⇒ 断言否定界会把 NaN 排除 ⇒ 假绿;事实臂窄化不受影响);
|
|
1292
|
+
* - 早退摊平的**送达范围**(Bug 186):内含早退 if 且**无词法声明**的块
|
|
1293
|
+
* 摊平到当前语句表(flattenEarlyReturnBlocks)——块正常完成 ⇒ 早退测试为
|
|
1294
|
+
* 假;块内有词法声明时不摊平(作用域不外泄);
|
|
1295
|
+
* - try / catch / finally 的**块体**也走本入口(与函数体顶层同口径)——裸
|
|
1296
|
+
* map(transpileStatement) 会绕过早退提升;
|
|
803
1297
|
* - 函数体边界 var 提升(Bug 21):skip = 参数模式名;嵌套块不传
|
|
804
1298
|
* varScope(var 已在函数级提升,块内改发赋值);
|
|
805
1299
|
* - P4b 参数遮蔽:继承 constNames 被本函数参数模式名遮蔽时扣除(假
|
|
@@ -808,27 +1302,56 @@ declare function foldRequireSpecArg(arg: unknown): string | undefined;
|
|
|
808
1302
|
* (Bug 9:先用后声明时 new g() 不误判)。
|
|
809
1303
|
*/
|
|
810
1304
|
|
|
1305
|
+
/**
|
|
1306
|
+
* 关系守卫的**补集**精化已**整体撤销**(Bug 1115)。
|
|
1307
|
+
*
|
|
1308
|
+
* 原实现(Bug 182)在「测试为假」的后续路径上断言**否定关系界**
|
|
1309
|
+
* (`x <= k` 为假 ⇒ `x > k`,`REL_COMPLEMENT_OP`)——但 JS 里
|
|
1310
|
+
* `¬(x <= k)` 还含 `x` 为 NaN 的情形(NaN 与任何比较皆假):
|
|
1311
|
+
* 后续路径只能断定 `x > k ∨ x is NaN` ⇒ 断言 `x > k` **排除了 NaN**
|
|
1312
|
+
* (不健全)⇒
|
|
1313
|
+
* - `if (x < 0) return 0; return x;` + `return nonNeg`:后续路径断言
|
|
1314
|
+
* `x >= 0` ⇒ 契约被「证成」⇒ **0 诊断**(假绿);原生 x=NaN ⇒
|
|
1315
|
+
* `NaN < 0` 为假 ⇒ `return x` ⇒ 返回 NaN ⇒ 违反 nonNeg(真违规)。
|
|
1316
|
+
* - 三元写法 `return x < 0 ? 0 : x;` 的 else 臂没有否定界窄化 ⇒ 判
|
|
1317
|
+
* `unproven-return` ⇒ 两种等价写法结论不一致。
|
|
1318
|
+
*
|
|
1319
|
+
* ⇒ 后续路径**不断言否定界**(事实臂 `narrowRelArmThunk` 保留:那一侧
|
|
1320
|
+
* 「测试为真」⇒ NaN 不可达,断言是健全的)。
|
|
1321
|
+
*/
|
|
811
1322
|
declare function transpileBodyNode(node: Node, opts: TranspileOptions): string;
|
|
812
1323
|
|
|
813
1324
|
/**
|
|
814
|
-
*
|
|
1325
|
+
* 表达式发射:transpileExpression / transpileShortCircuitExpr。
|
|
1326
|
+
* 按域拆分(facade 保持原导入面不变):
|
|
1327
|
+
* - transpile 主分派(replace/Chain/可选链入口/switch 路由 + dispatch bind)
|
|
1328
|
+
* - short-circuit $fork 短路协议(&&/||/??/三元/逻辑赋值)
|
|
1329
|
+
* - optional-chain 可选链整链短路(flatten/emit/delete 链)
|
|
1330
|
+
* - atom 字面量/标识符/模板/import()/JSX
|
|
1331
|
+
* - operators 二元逻辑/条件/一元/更新/await/yield/序列
|
|
1332
|
+
* - member 成员读(静态/计算/私有名/length/super 读)
|
|
1333
|
+
* - call 调用/new/super 调用/require
|
|
1334
|
+
* - object 对象/数组字面量与展开
|
|
1335
|
+
* - assignment 赋值/复合赋值/逻辑赋值/解构赋值
|
|
1336
|
+
* - function 函数/类表达式 + 参数模式名
|
|
815
1337
|
*
|
|
816
|
-
*
|
|
817
|
-
*
|
|
818
|
-
* (./optional-chain.ts)→ Super 接收者 → 按节点类别族路由;未 lowering
|
|
819
|
-
* 的表达式统一 default unsupported(不得假精确 undefined);
|
|
820
|
-
* - positionRecordWrap 只包一次:内部递归一律经 transpileExpression 入口,
|
|
821
|
-
* 族模块回环经 transpile-dispatch 别名(emitTranspileExpression);
|
|
822
|
-
* - SSR 加载序陷阱:模块体尾部的 dispatch bind 是加载期副作用——必须直接
|
|
823
|
-
* import leaf(transpile-dispatch)与定义模块(./short-circuit.ts),不经
|
|
824
|
-
* facade/barrel 中转(vite SSR 下 barrel 再导出不是实例化期绑定)。
|
|
1338
|
+
* 本文件是**表达式入口**(公开面):`transpileExpression` 在此补遮蔽判定
|
|
1339
|
+
* (见下方函数注释)——主分派(./expr/transpile.ts)保持纯发射。
|
|
825
1340
|
*/
|
|
826
1341
|
|
|
827
1342
|
/**
|
|
828
|
-
*
|
|
829
|
-
*
|
|
830
|
-
*
|
|
831
|
-
*
|
|
1343
|
+
* 表达式入口(公开面):**遮蔽判定**补声明扫描。
|
|
1344
|
+
*
|
|
1345
|
+
* 宿主内建名(undefined / NaN / Infinity)的读点按遮蔽分态(未遮蔽 → 字面量
|
|
1346
|
+
* 精确折叠;已遮蔽 → 标识符读点 `$absVal`,由 JS 词法绑定决定读值)。模块
|
|
1347
|
+
* 入口(transpileFile / transpileBodyNode / body-fn)按**单元级**扫描声明
|
|
1348
|
+
* 绑定名判定;表达式入口此前只信调用方给的 `opts.shadowedIntrinsics` ⇒ 表达
|
|
1349
|
+
* 式**内部**的声明(形参名 undefined / 局部 let / const / var / catch 参数)
|
|
1350
|
+
* 不可见 ⇒ 体折宿主内建(原生读的是绑定值 ⇒ 自信的错值)。
|
|
1351
|
+
*
|
|
1352
|
+
* 口径与模块入口同源(helpers.ts 的 shadowedIntrinsicsOf):单元级**保守**
|
|
1353
|
+
* 扫描(任意作用域出现同名绑定即计入)∪ 调用方已给的遮蔽集(注入名 / mock)。
|
|
1354
|
+
* 无命中 → 不写 opts 字段 ⇒ 产物逐字节不变。
|
|
832
1355
|
*/
|
|
833
1356
|
declare function transpileExpression(expr: Expression, opts?: TranspileOptions): string;
|
|
834
1357
|
|
|
@@ -838,12 +1361,16 @@ declare function transpileExpression(expr: Expression, opts?: TranspileOptions):
|
|
|
838
1361
|
* 值类型是 Abs;副作用与模块仍由 host mock/注入。
|
|
839
1362
|
*
|
|
840
1363
|
* 实现按语句/表达式/模式拆在 transpile/*.ts;本文件是 re-export facade,
|
|
841
|
-
* 对外符号面保持不变(exec/index.ts
|
|
1364
|
+
* 对外符号面保持不变(exec/index.ts 对公开符号做显式具名导出)。
|
|
1365
|
+
*
|
|
1366
|
+
* 不变量(解构临时名,Bug 181):
|
|
1367
|
+
* - 模块级解构临时名计数器(`destrTmpSeq`)在**创建处**即预置避让:序号
|
|
1368
|
+
* 推过用户已占用的 `_d{n}` / `_n{n}` ⇒ 首次分配(模块首条语句即解构
|
|
1369
|
+
* 声明)也拿不到与用户同名绑定重复的临时名(重复词法声明 ⇒ SyntaxError
|
|
1370
|
+
* ⇒ 整模块求值失败 ⇒ 导出退化 unknown)。
|
|
842
1371
|
*/
|
|
843
1372
|
|
|
844
1373
|
declare function transpileSource(source: string, opts?: TranspileOptions): string;
|
|
845
|
-
/** 运行时 import 行(body-fn 编译执行拼接用) */
|
|
846
|
-
declare function runtimeImportOf(runtime: string): string;
|
|
847
1374
|
declare function transpileFile(file: File, opts?: TranspileOptions): string;
|
|
848
1375
|
/** 解析 + transpile */
|
|
849
1376
|
declare function transpile(source: string, opts?: TranspileOptions): string;
|
|
@@ -877,10 +1404,19 @@ type EvalClassSpec = {
|
|
|
877
1404
|
methods?: Record<string, (thisVal: Abs, ...args: Abs[]) => Abs>;
|
|
878
1405
|
/** 实例方法形参展示名(AST 形参名;未调用方法槽 `shape.params` 用) */
|
|
879
1406
|
methodParams?: Record<string, string[]>;
|
|
1407
|
+
/**
|
|
1408
|
+
* Bug 325:实例方法的**函数种类**戳(async × generator 四象限)——
|
|
1409
|
+
* 原生类方法的标签面(Object.prototype.toString.call(A.prototype.m))
|
|
1410
|
+
* 随 async / generator 变("[object AsyncFunction]" 等)。类方法**同时**
|
|
1411
|
+
* 可能是 generator ⇒ 与 impl.kind 的派发角色维度分开承载。
|
|
1412
|
+
*/
|
|
1413
|
+
methodKinds?: Record<string, "function" | "async" | "generator" | "async-generator">;
|
|
880
1414
|
/** R5:静态方法 impl 首参 __this = 类值(接收者——沿链调用时是调用类) */
|
|
881
1415
|
staticMethods?: Record<string, (thisVal: Abs, ...args: Abs[]) => Abs>;
|
|
882
1416
|
/** 静态方法形参展示名 */
|
|
883
1417
|
staticMethodParams?: Record<string, string[]>;
|
|
1418
|
+
/** Bug 325:静态方法的函数种类戳(实例方法同口径) */
|
|
1419
|
+
staticMethodKinds?: Record<string, "function" | "async" | "generator" | "async-generator">;
|
|
884
1420
|
/**
|
|
885
1421
|
* P2b:构造器元数(首个默认值/rest 形参前的形参数,nativeParamArity
|
|
886
1422
|
* 口径)——类值 .length 自有属性。隐式构造器(基类零参 / 派生
|
|
@@ -927,7 +1463,7 @@ declare function getEvalClass(name: string): EvalClassSpec | undefined;
|
|
|
927
1463
|
declare function clearBClasses(): void;
|
|
928
1464
|
|
|
929
1465
|
/**
|
|
930
|
-
* 类声明/注册/构造:$class/$new
|
|
1466
|
+
* 类声明/注册/构造:$class/$new + registry 辅助。
|
|
931
1467
|
*
|
|
932
1468
|
* Invariants:
|
|
933
1469
|
* - classImpl(WeakMap)是 spec 的唯一私有挂载点:Abs 对象身份 → 定义
|
|
@@ -938,20 +1474,15 @@ declare function clearBClasses(): void;
|
|
|
938
1474
|
* withNewTargetReset 包裹(嵌套 new 不串帧)。
|
|
939
1475
|
*/
|
|
940
1476
|
|
|
941
|
-
/** 定义类 → 可 new 的 Abs(brand 标记;静态字段挂在 slots
|
|
1477
|
+
/** 定义类 → 可 new 的 Abs(brand 标记;静态字段挂在 slots)。
|
|
1478
|
+
* displayName(Bug 133):对外可见的 **name**(原生无名类名为空串);缺省
|
|
1479
|
+
* 用内部类名(类声明 / 具名类表达式同口径)。 */
|
|
942
1480
|
declare function $class(name: string, spec: Omit<EvalClassSpec, "name"> & {
|
|
943
1481
|
extends?: string | Abs | unknown;
|
|
944
1482
|
hasExtends?: boolean;
|
|
945
|
-
}): Abs;
|
|
1483
|
+
}, displayName?: string): Abs;
|
|
946
1484
|
/** new C(...) → 空 brand 实例 + ctor 写字段;非类构造走 impl/$call */
|
|
947
1485
|
declare function $new(cls: Abs | ((...a: unknown[]) => unknown), args: Abs[]): Abs;
|
|
948
|
-
/**
|
|
949
|
-
* Bug 77:静态块在类定义期执行(原生 ClassDefinitionEvaluation 的
|
|
950
|
-
* InitializeStaticElements)。transpile 在 `let C = $class(...)` 绑定完成
|
|
951
|
-
* **之后**发射本调用——块体内类名按词法可见(原生 static 块内类绑定已
|
|
952
|
-
* 初始化);this 绑定类值;块内 throw 在定义点表面(NudoThrow 上浮)。
|
|
953
|
-
*/
|
|
954
|
-
declare function $staticInit(cls: Abs, thunks: Array<(thisVal: Abs) => unknown>): void;
|
|
955
1486
|
|
|
956
1487
|
/**
|
|
957
1488
|
* super 家族:$super/$invokeSuper/$getSuper/$setSuper + 对象超与静态超。
|
|
@@ -1019,42 +1550,48 @@ declare function $setSuperStatic(thisVal: Abs, childName: string, key: Abs, valu
|
|
|
1019
1550
|
* - 数组方法(map/filter/reduce/…)委派 invokeArrMethod(invoke-arr.ts);
|
|
1020
1551
|
* mutator 语句快路径在 transpile 层(emitArrMutatorRebinds),两条路径
|
|
1021
1552
|
* 的元素域语义必须同口径(issue #153:SpreadElement 折 $unknown 的教训)。
|
|
1553
|
+
* - Bug 152:实参可以是 **thunk**(`() => [args]`)——调用点成员**先于实参**
|
|
1554
|
+
* 求值(原生 CallExpression 顺序:引用取值(getter 在此触发)→ 实参 →
|
|
1555
|
+
* 调用)。thunk 形态:$invoke 先读成员(预读),再求实参,最后派发;
|
|
1556
|
+
* 派发复用预读值(不再二次读 ⇒ getter 只跑一次)。预读对 sum(union)
|
|
1557
|
+
* 接收者跳过(派发按成员各读一次,预读会重复触发 getter)。
|
|
1022
1558
|
*/
|
|
1023
1559
|
|
|
1024
1560
|
/** 实例方法调用:沿继承链;类 Abs 上回落 staticMethods;obj 上回落属性函数 */
|
|
1025
|
-
declare function $invoke(thisVal: Abs, method: string, args: Abs[], loc?: [number, number]): Abs;
|
|
1561
|
+
declare function $invoke(thisVal: Abs, method: string, args: Abs[] | (() => Abs[]), loc?: [number, number]): Abs;
|
|
1026
1562
|
/** obj[key]():计算键成员调用(键运行时求值)。键折叠成槽名后走 $invoke
|
|
1027
1563
|
* 既有派发;@@iterator 键按接收者形态折迭代器对象。键不可折叠(抽象键 /
|
|
1028
1564
|
* 用户 symbol)→ 诚实 unknown(与 $call 对 unknown callee 同口径——
|
|
1029
|
-
* unknown 是 fail-closed 令牌,不记 may-throw)。
|
|
1030
|
-
|
|
1565
|
+
* unknown 是 fail-closed 令牌,不记 may-throw)。
|
|
1566
|
+
* Bug 152:实参 thunk 形态(`() => [args]`)——键求值后**先读成员**再求
|
|
1567
|
+
* 实参(原生顺序:键 → 引用取值 → 实参 → 调用)。 */
|
|
1568
|
+
declare function $invokeKey(thisVal: Abs, key: Abs, args: Abs[] | (() => Abs[]), loc?: [number, number]): Abs;
|
|
1031
1569
|
/** 可选链计算键调用(a?.[k]() / a[k]?.() 的非链路径):nullish 接收者
|
|
1032
1570
|
* 短路 undefined 字面量($optionalInvoke 同口径);键折叠与派发同
|
|
1033
1571
|
* $invokeKey。 */
|
|
1034
1572
|
declare function $optionalInvokeKey(thisVal: Abs, key: Abs, args: Abs[]): Abs;
|
|
1035
1573
|
|
|
1036
1574
|
/**
|
|
1037
|
-
* this/可选链/静态成员读写:$
|
|
1575
|
+
* this/可选链/静态成员读写:$optionalGet/$staticInvoke/$setKey。
|
|
1038
1576
|
*
|
|
1039
1577
|
* Invariants:
|
|
1040
|
-
* -
|
|
1041
|
-
* (?.)已过 nullish 排除——不重复记 may-throw。
|
|
1578
|
+
* - 可选链臂(?.)已过 nullish 排除——不重复记 may-throw。
|
|
1042
1579
|
* - $setKey 计算键写:非字面量 key → open + index join(不得写成字面
|
|
1043
1580
|
* 槽 "?");对象字面量计算键 __proto__ 是自有数据属性(与 $set 的
|
|
1044
1581
|
* setter 语义分流)。
|
|
1045
1582
|
*/
|
|
1046
1583
|
|
|
1047
|
-
declare function $thisGet(thisVal: Abs, key: string): Abs;
|
|
1048
|
-
declare function $thisSet(thisVal: Abs, key: string, value: Abs): Abs;
|
|
1049
1584
|
/** 解构默认值:undefined(含 sum 成员 / 可能缺失)时用 default 并入非 undefined 部分 */
|
|
1050
1585
|
declare function $orDefault(v: Abs, dflt: () => Abs): Abs;
|
|
1051
1586
|
/** 可选链 a?.b:nullish 短路为 undefined 字面量。非 nullish 臂的属性读对
|
|
1052
|
-
* 非 nullish 值原生不抛 → silent(不记 any may-throw,Bug 3
|
|
1053
|
-
|
|
1587
|
+
* 非 nullish 值原生不抛 → silent(不记 any may-throw,Bug 3)。
|
|
1588
|
+
* opts.symbolKey(Bug 149):键来自符号投影("[Symbol.X]" → "@@X")——
|
|
1589
|
+
* 陷阱边界把 "@@X" 还原成真 symbol(规范 PropertyKey)。 */
|
|
1590
|
+
declare function $optionalGet(o: Abs, key: string, opts?: {
|
|
1591
|
+
symbolKey?: boolean;
|
|
1592
|
+
}): Abs;
|
|
1054
1593
|
/** 可选链 a?.m():nullish 短路为 undefined */
|
|
1055
1594
|
declare function $optionalInvoke(thisVal: Abs, method: string, args: Abs[]): Abs;
|
|
1056
|
-
/** 静态方法:cls.staticMethod(args) */
|
|
1057
|
-
declare function $staticInvoke(cls: Abs, method: string, args: Abs[]): Abs;
|
|
1058
1595
|
/** 计算属性写:o[kAbs] = v。非字面量 key → open + index join(不得写成字面槽 "?") */
|
|
1059
1596
|
declare function $setKey(o: Abs, key: Abs, value: Abs): Abs;
|
|
1060
1597
|
|
|
@@ -1092,4 +1629,4 @@ declare class NudoUnsupportedError extends Error {
|
|
|
1092
1629
|
detail?: string);
|
|
1093
1630
|
}
|
|
1094
1631
|
|
|
1095
|
-
export { $absVal, $add, $arguments, $arr, $arrMutContainer, $arrRest, $arrWithHoles, $async, $
|
|
1632
|
+
export { $absVal, $add, $arguments, $arr, $arrMutContainer, $arrRest, $arrWithHoles, $assumeAnchor, $async, $asyncGen, $await, $bitand, $bitnot, $bitor, $bitxor, $catchReturn, $catchVal, $class, $classExpr, $collectionForEach, $concat, $copy, $del, $delRes, $div, $dynamicImport, $elems, $eq, $eqLoose, $fnKindStamp, $fnVal, $for, $forInKeys, $forOf, $fork, $ge, $gen, $get, $getSuper, $getSuperObj, $gt, $idx, $idxSet, $importMeta, $in, $instanceof, $instanceofNonIdent, $invoke, $invokeKey, $invokeSuper, $invokeSuperKey, $invokeSuperObj, $isBreakTo, $isForkExit, $iterCheck, $join, $le, $len, $lit, $litTruth, $loopBreak, $loopContinue, $loopReturn, $lt, $mod, $mul, $narrowMemberEq, $narrowTypeOf, $ne, $neLoose, $neg, $new, $newTarget, $not, $nullishTest, $obj, $objAccessor, $objAccessorKey, $objRest, $optionalGet, $optionalInvoke, $optionalInvokeKey, $orDefault, $pow, $pushLoopExit, $rawThis, $reStateCall, $refineRel, $regex, $removeMemberNullish, $removeNull, $removeNullish, $removeUndefined, $restBind, $rethrowIfNudoReturn, $set, $setKey, $setProto, $setSuper, $setSuperObj, $setSuperStatic, $shl, $shr, $spread, $staticSuperInvoke, $sub, $super, $switch, $throw, $throwConstAssign, $throwFreeArguments, $toNumber, $toNumeric, $tpl, $tryCurrentMark, $tryDetachSoftCatch, $tryDigestSoftCatch, $tryDiscardSoft, $tryMark, $tryOrphanSoft, $tryPopMark, $tryReleaseSoftCatch, $tryReleaseSoftOut, $tryTakeSince, $typeof, $unknown, $updateAdd, $updateSub, $ushr, $whileSeq, $yield, $yieldStar, DEFAULT_MAX_LOOP_ITERS, type EvalClassSpec, NudoLoopSignal, NudoReturn, NudoThrow, NudoUnsupportedError, RUNTIME_IMPORT_RE, type TranspileOptions, asAbsVal, callAtFunctionBoundary, clearBClasses, clearStaleTermPred, currentAssumePremises, 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, withAssumePremises, withExecPhi };
|