Skip to content

Port math lib to 26.1 将数学库移植到 26.1 - #123

Merged
PigeonNian merged 1 commit into
dev/26.1from
math/26.1
Sep 16, 2026
Merged

PigeonNian merged 1 commit into
dev/26.1from
math/26.1

Conversation

@QiuShui1012

Copy link
Copy Markdown
Contributor

No description provided.

@Gugle2308

Copy link
Copy Markdown

⚠️ Dangerous command requires approval:

cd /tmp; curl -s "https://api.github.com/repos/Anvil-Dev/AnvilLib/commits/1815220dda89365bf385a35206c7898610a83040/check-runs" -H "Accept: application/vnd.github+json" | python3 -c "
import json,sys
d...

Reason: Security scan — [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection.
Safer: tirith run https://api.github.com/repos/Anvil-Dev/AnvilLib/commits/1815220dda89365bf385a35206c7898610a83040/check-runs — or: vet https://api.github.com/repos/Anvil-Dev/AnvilLib/commits/1815220dda89365bf385a35206c7898610a83040/check-runs (https://getvet.sh); [HIGH] Pipe to interpreter: curl | python3: Command pipes output from 'curl' directly to interpreter 'python3'. Downloaded content will be executed without inspection.
Safer: tirith run https://api.github.com/repos/Anvil-Dev/AnvilLib/commits/1815220dda89365bf385a35206c7898610a83040/status — or: vet https://api.github.com/repos/Anvil-Dev/AnvilLib/commits/1815220dda89365bf385a35206c7898610a83040/status (https://getvet.sh); script execution via -e/-c flag

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

@Gugle2308

Copy link
Copy Markdown

🌿 Roseau API Breaking Change Report

Module Status Breaking Changes
codec ✅ Compatible 0
collision ✅ Compatible 0
cube ✅ Compatible 0
config ✅ Compatible 0
integration ✅ Compatible 0
moveable-entity-block ✅ Compatible 0
network ✅ Compatible 0
rendering ✅ Compatible 0
space-select ✅ Compatible 0
font ✅ Compatible 0
util ✅ Compatible 0
explosion ✅ Compatible 0
rpc ✅ Compatible 0
multiblock ✅ Compatible 0
recipe ✅ Compatible 0
registrum ✅ Compatible 0
sync ✅ Compatible 0
wheel ✅ Compatible 0
main ✅ Compatible 0

Full CSVs: see the Artifacts section of this workflow run.

@Gugle2308

Copy link
Copy Markdown

⚠️ Dangerous command requires approval:

cd /tmp; rm -rf qlib && mkdir qlib && cd qlib && git init -q . && for r in QualiaLib Core-Lib Simple-Chemistry-Lib; do echo "=== $r"; git ls-remote https://github.com/QiuShui1012/$r HEAD 2>&1 | head -...

Reason: recursive delete

Reply /approve to execute, /approve session to approve this pattern for the session, /approve always to approve permanently, or /deny to cancel.

@Gugle2308

Copy link
Copy Markdown

代码审查摘要 — PR #123

操作: opened(synchronize 前的首次审查)
范围: 41 个文件(32 Java / 37 新增 / 0 删除)/ 6300 行 diff,+6021 / −1
HEAD: 1815220d(本地 git fetch origin math/26.1 校验一致);changed_files=41 与 diff 头数完全对齐 ✅

✅ 已做的交叉验证(不是只看 diff)

检查项 结果
CI(commit 1815220d 的 45 个 check-run) 全部 success,含 build-l2 (math,...) / build 89s、roseau-l2 (math) / check 65s、main / build 150s(该 job 带 gametest,聚合 jar 会 jarJar math 并跑 dedicated-server-launch-test)
module.math/build.gradle 里的 addModdingDependenciesTo 在 moddev-gradle 2.0.141 与 2.0.147 中都存在(下载两个插件 jar 逐字节查 ModDevExtension.class),见下方 ⚠️2
dev.anvilcraft.lib.v2.util.ISerializer(唯一跨模块依赖) 签名与 IFunction.Typecodec()/streamCodec() 完全一致 ✅
注册表键 anvillib:function_type / anvillib:function 与 base 分支已有键路径(trigger / predicate / predicate_function / outcome / outcome_function / definitions / sync_entry)无冲突
mods.toml / anvillib_math.mixins.json / icon.png module.multiblock 的模板逐字节一致;icon 与 module.main/src/main/resources/icon.png 同 blob(15304bd5),符合 createModule 约定
CI 接入 .github/modules.jsonneeds:["util"] 正确)、settings.gradlemodule.main/build.gradle 两个分支(NOT_DEV / dev)都已补 math ✅
迁移健康度 jspecify 13 / jetbrains 0 / javax 0 / Identifier 17 / ResourceLocation 0 / @OnlyIn 0 / TODO 0 / EOF 缺失 0 ✅

🔴 关键

未发现阻塞性问题。

⚠️ 警告

  1. 对象形式没有深度守卫,StackOverflowError 会穿出 codecFlatExpressionParser.java:77/230flat 文本 加了 MAX_NESTING_DEPTH=512(注释明确写「不让 StackOverflowError 从 codec 穿到数据包加载流程」,这是对的),但 {"function":…,"arguments":[…]} 对象形式与网络包完全不过这道闸FunctionExpression.MAP_CODECFunctionExpression.java:25)递归调 IExpression.CODECIFunction.MAX_CALL_DEPTH=64guarded() 只在 CustomFunction/LambdaFunction 里计一层「函数调用」,对 add(add(add(…))) 这种纯嵌套树没有约束。后果:

    • 深度几千的对象形式 JSON(数据包)或 S2C/C2S 包 → evaluate() 深递归 → StackOverflowErrorErrorparseResultcatch (RuntimeException)FlatExpressionWriter.write 的 catch 都拦不住)→ 崩服/崩端;
    • FlatExpressionWriter.write() 自身也递归,深树在 encode 时同样会炸出 Error,正好破坏它承诺的「写不出来就退回对象形式」契约。
      建议:在 IExpression.CODEC / FunctionExpression.MAP_CODEC 的解码路径(或用 FunctionExpression.evaluate)上加与 parser 同源的深度计数(复用时记得两处守卫位置都要过一遍,注释里已提醒「改动任意一处守卫都会静默改变可用深度」)。
  2. modDevGradle 2.0.141 → 2.0.147 与「移植数学库」无关(scope creep) — 我实测该 API 在 2.0.141 就已存在,所以这个 bump 不是新模块测试源集所必需。它影响所有模块的构建/CI,建议拆成独立 PR 或在本 PR 描述里给出理由(例如某个 MDG bug)。

  3. module.test/build.gradle 未加 math — 该集成测试模块逐个列出了全部子模块(cube/codec/…/wheel),唯独缺 anvillib-math-neoforge-26.1。结果:仓库内的 port-smoke / gametest 环境拿不到 math 的类,运行期覆盖只有聚合 jar 的 dedicated-server-launch-test 那一条路径(已通过,但覆盖面窄)。建议按惯例补上。

💡 建议

  • IFunction.CODECIFunction.STREAM_CODEC 全模块无人使用、也无测试grep -rn "IFunction.CODEC\|IFunction.STREAM_CODEC" 只命中定义处;测试只覆盖 HOLDER_CODEC / HOLDER_STREAM_CODEC)。若属给下游的公开 API,建议至少各写一条往返测试;否则考虑删掉。
  • ConstantFunction.CODEC 名不副实(类型是 Codec<Double>,与 MAP_CODEC 并列易误读),建议改名 VALUE_CODEC/INLINE_CODEC 加注释。
  • 解析缓存的「外层 Map 无容量上限」CACHEFlatExpressionParser.java:62)键是任意 HolderGetter,注释已诚实说明「值强引用键、弱键回收不掉、存活期靠手动 clearCache()」。游戏内 RegistryOps.getter() 返回的 lookup 实例是稳定的,所以现状可控;但下游若每次编码都新建 RegistryAccess/自定义 HolderGetter,外层表会无界增长(内层才限 512)。可考虑改为按 Registry/function_key 归属分组,或给外层也加上限。
  • @ApiStatus.Internal 缺失:其它模块的 @Mod 构造器与 LibRegistries 事件方法都标了(AnvilLibRecipeAnvilLibMultiblockmodule.recipe/.../LibRegistries),本模块一处都没标。纯一致性建议。
  • README 未更新README.md/README.en.md 的特性表逐个列出模块,新增 math 后表格与「模块介绍」缺少条目。库对外 API,建议补(含 data/<ns>/anvillib/function/*.json 的用法说明)。
  • PR 描述为空:作为 port PR,最好写明移植来源(分支/仓库)。我已核对:AnvilLib 的 dev/1.21.1dev/1.21.4dev/1.21.8dev/1.21.11dev/26.1 各分支都没有 math 模块,AnvilCraft 已取分支里也没有对应实现,因此本次无法做「与移植源逐行行为等价」的对照核对——补上来源后可以再核一轮。

🟢 看起来不错

  • 回写路径的设计是这轮最亮的地方FlatExpressionWriter.write():61–81)在返回前实测「同一棵树写两遍文本一致 + 文本能读回同一棵树(sameMeaning 处理了 NamedFunction/Reference.Named/InputFunction 三种等价叶子)+ 语义相同」,任何不满足就 Optional.empty() 退回对象形式。这让「读得回来但写不稳定」的静默数据损坏在结构上不可能发生——正是这类文本↔表达式 codec 最常见的事故点。
  • 逐条核对了几类经典坑,均已被专门处理且有测试钉住:常量×常量不并置(2*323)、负数字面量与 ^ 优先级(-2^2-(2^2) 双向对称)、2*e1(x)parseNumber 吃成 2e1(x) 的并置实测回读(juxtapositionReadsBack)、Double.toString 指数形式两边对称(basicNumberBigDecimal.toPlainString,解析侧支持 E 记法)、负零符号位(isNegation 只认 +0.0)、$(x...)$(x) 的 Spread/Named 区分、isWritableFunctionName 与解析侧共用一份判断(含被内建名遮蔽、x0 会被读成传入值等)、命名空间省略只在 anvillib 下做且有自校验兜底。
  • 缓存是 synchronizedMap(WeakHashMap) + 按注册表分组的内层访问序 LRU(512 上限),computeIfAbsentsynchronized(cache) 配得上同步语义,无可变共享树(全是 record)。
  • 环/自引用有 MAX_CALL_DEPTH=64 + ThreadLocal 守卫,注释点明「lambda 也能互相引用绕过 CustomFunction」这一非显然路径;实参个数在解析期就用 Parameters.checkArity 校验,与求值期同一份实现(单一真源)。
  • 测试质量高:82 个用例,含 3 个固定种子的随机往返 fuzz(默认各 20000 轮,-Pmath.fuzz.rounds 可调)、深度边界(sqrt 嵌套 169 层、一元符号链 512)、MAX_CALL_DEPTH、序列化双路径(JSON + RegistryFriendlyByteBuf 各写一遍字节一致性)、缓存淘汰与 clearCache 语义;MathTestBootstrap 只靠反射置 Bootstrap.isBootstrapped(已核对 26.1.2 该字段确实存在)就在裸 JVM 上跑,并用 addModdingDependenciesTo(sourceSets.test) 拿到打补丁的 MC 类,做法干净。

📋 标题声称核对(PR 描述为空,按标题核对)

声称 状态 依据
Port math lib to 26.1 新增 module.math(37 文件)+ settings.gradle/modules.json/module.main 接线齐全,CI 全绿
(标题未提)modDevGradle bump ⚠️ gradle/libs.versions.toml 2.0.141→2.0.147,非本移植所必需
(标题未提)测试源集与 82 个用例 💡 建议在描述里说明

PR 标题无需修改(已是「英文 + 中文」格式且与内容相符)。

结论: COMMENT / 可合并(无阻塞项) — 代码质量与测试覆盖在我审过的同类 codec PR 里属上乘,且 CI(含聚合 jar 的 dedicated-server gametest)全绿。合并前建议至少处理 ⚠️1(对象形式深度守卫,属健壮性/DoS 面)与 ⚠️2(MDG bump 说明或拆分);⚠️3 与 💡 可随后续 PR 收。

🧪 测试建议(补充现有 82 例)

被测目标 推荐场景 优先级
IExpression.CODEC / FunctionExpression.MAP_CODEC 解码 构造 2k/5k 层对象形式嵌套,断言抛出可读错误而非 StackOverflowError 🔴
IFunction.CODEC / IFunction.STREAM_CODEC 注册表内已有条目时编码为引用、否则内联;两条路径往返 🟡
FlatExpressionWriter.write() 对手工构造的深树断言返回 empty 而不是让 Error 逃出 🟡
FlatExpressionParser.CACHE 传入大量不同 HolderGetter 实例,观察外层表增长(回归上限策略) 🟢

由 Hermes Agent 审查(diff 完整性、CI 结果、跨分支 API、插件 API 均已实测核对)

@Gugle2308

Copy link
Copy Markdown

💾 Self-improvement review: Patched SKILL.md in skill 'github-webhook-pr-review' (1 replacement). · Patched SKILL.md in skill 'dependency-bump-pr-review' (1 replacement). · Patched SKILL.md in skill 'text-codec-roundtrip-pr-review' (1 replacement).

@PigeonNian
PigeonNian merged commit 23a4f2a into dev/26.1 Sep 16, 2026
45 checks passed
@Gugle2308

Copy link
Copy Markdown

The operation is "closed" — per the constraints, I stop here and do not publish a review.

PR #123 已关闭(closed),按约束 1 停止,不发布任何审查评论。

(说明:该 PR 是关闭状态而非新提交或重新打开,webhook 流程对 closed/labeled 事件直接终止,无需审查、无需改动标题。)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants