Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

/ binop throws DivisionByZeroError on PHP8 target (Dynamic division by zero)

未关闭 适合新手
#166 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
78/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
冷清
领域
compilers

调研方向

从 Interp.hx 开始,具体检查 initOps() 和默认的 "/" binop,然后使用 PHP 8 和另一个 target 运行提供的 Parser 和 Interp reproduction。将除以零的结果与 Haxe 文档所述的 Float 行为进行比较;当该表达式在 PHP 8 上不再抛出异常,并且在各个 target 之间保持一致时,即表示完成。

由索引模型根据 Issue 内容生成。

描述

I think this should be reported on Haxe github but since I guess that the answer will be to avoid using Dynamic I try to post it here because hscript is by default using Dynamic.

On the PHP target, Interp's default / binop (Interp.hx, initOps()):

binops.set("/", function(e1,e2) return me.expr(e1) / me.expr(e2));
relies on the native / operator on Dynamic operands. Since PHP 8.0, / throws DivisionByZeroError for any division by zero (including Float), whereas other targets (JS, etc.) return Infinity/NaN without throwing — per Haxe's own documented Float/IEEE754 semantics. Since Interp.expr() always operates in Dynamic, this cross-target guarantee silently breaks specifically on PHP8, even when both operands are genuinely Float at runtime.

Repro:

var i = new hscript.Interp();
i.variables.set("x", 1.0);
i.variables.set("y", 0.0);
i.execute(new hscript.Parser().parseString("x / y")); // throws on PHP8, returns Infinity on JS

Suggested fix guard the divisor explicitly instead of relying on the native operator, restoring cross-target consistency:

binops.set("/", function(e1,e2){
    var b = me.expr(e2);
    return b == 0 ? Math.NaN : me.expr(e1) / b;
});
主要语言
Haxe
星标
308
派生
155
PR 合并指标
30 天内没有已合并 PR

环境准备

这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

HaxeFoundation/hscript 的其他 Issue

查看 HaxeFoundation/hscript 的全部 Issue

相似的 Issue

更多 Compilers Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。