what
|
0c947dde70
|
docs: 加一篇函数流走向
call-flow.md 讲的是三个阶段各自在做什么,缺的是**函数之间怎么串起来的**——
想改代码、想知道加一层该加在哪,没有一处能查。
docs/flow.md 七张图:
全景 公开 API → 注册表 / 取 VM / 调用 三条链
runner 三态 Script / Instance / staticTarget 的 acquire+finish 差别,
「同一实例串行」就是 acquire 到 finish 之间一直持着 i.mu
newVM 内部 为什么 scope 是显式参数而不是从 ctx 嗅
作用域进 VM WithScope → vmGlobals → bind → lazyGlobal → freeze 五跳,
这是全库最容易看不清的一条链
invoke 内部 含 defer 的注册顺序(finish → stop → recover,后进先出)
lookup 三级 exports → ctor 静态 → 全局兜底,解释了 Script.Has 为什么
对静态方法也返回 true
编译链 Prepared 为什么不是优化开关而是正确性要求
写的时候实地核对了每条断言,抓出三处我自己写错的:
1. 图上把 Bundle → FinalizeBundle 画成两步,实际 Bundle 末尾自己就调了
2. 把「省 44% 常驻内存」归因给惰性注入——那是关掉 console 的收益
3. 「只读全局赋值静默失败」只对全局本身成立,freeze 拷出来的嵌套只读属性
(store.Set = null)实测是抛错的
顺带修一处上一轮改名的残留:engine.go 的注释还指着 lazyglobal_test.go。
|
2026-09-10 16:24:18 +08:00 |
|
what
|
6477b27ef4
|
docs: 校对 README 和 docs,改掉三处跟代码对不上的
不是全面重写——文档里不指向具体源文件,所以上一轮的改名没波及它们。逐条核对
「文档提到的 API」和「实际导出」之后,只有三处不符:
README 的哨兵错误列表 多了 ErrUnsupportedSignature(这轮删了),
少了 ErrInterrupted(一直都有)
call-flow.md 的 freeze 说白名单「逐层拷贝成只读对象,否则同一个 Go map 会被
所有 VM 共享」——那只对 map[string]any 成立。结构体
指针和 slice 走 rt.ToValue,是**共享同一个对象**的。
扩展走的正是这条路,不该被当成隔离保证。
(doc.go 里同一处上一个 commit 已经改过)
lifecycle.md 的状态图 写着 [*] --> 池中: newVM(),但 newVM 产出的 VM 是
直接借出去用的,回池要等 release
错误分类那张表(KindTimeout/KindCanceled/KindPanic/KindRuntime)核对过,没有
KindSignature,不受这轮删除影响。
|
2026-09-10 15:51:48 +08:00 |
|
what
|
c2ce37ad2d
|
docs: README 与执行流程、生命周期两篇
README 分四段:脚本怎么写、Go 侧怎么调、安全边界与可靠性、性能。
docs/call-flow.md 讲源码怎么变成可执行的、一次调用经过哪些环节;
docs/lifecycle.md 讲 Engine / Script / VM / Instance / 作用域各活多久。
性能一节的每一行都标了对应的基准名,数字过时了可以自己重跑。原来有一张
「循环里访问 Go 对象」的表没有对应的基准测试,数字无法复现,换成了
Benchmark绑定_* 的实测结果。内存那张表仍是手工测的,已在旁边注明。
挑第三方库那节记了两条实测结论:esbuild 的 target 只降级语法、不补全局
对象,所以库只要用了 structuredClone 或定时器就是运行期才炸;CommonJS
包摇不动,同一组功能 lodash 打出 419 KB 而 es-toolkit 只要 7 KB。
|
2026-09-05 22:13:57 +08:00 |
|