版本
- 适用于 JDK 24 的 GraalVM(最新)
- 适用于 JDK 25 的 GraalVM(早期访问)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发构建
- Truffle 语言实现框架
- Truffle 分支插桩
- 动态对象模型
- 静态对象模型
- 解释器代码的主机优化
- Truffle 函数内联方法
- 分析 Truffle 解释器
- Truffle 互操作 2.0
- 语言实现
- 使用 Truffle 实现新语言
- Truffle 语言和工具迁移到 Java 模块
- Truffle 原生函数接口
- 优化 Truffle 解释器
- 选项
- 栈上替换
- Truffle 字符串指南
- 特化直方图
- 测试 DSL 特化
- 基于多语言 API 的 TCK
- Truffle 编译队列方法
- Truffle 库指南
- Truffle AOT 概述
- Truffle AOT 编译
- 辅助引擎缓存
- Truffle 语言安全点教程
- 单态化
- 拆分算法
- 单态化用例
- 向运行时报告多态特化
测试 Truffle DSL 专用化
本文讨论了用于测试 Truffle DSL 专用化的工具。
仅编译模式下的慢路径专用化 #
本指南将使用以下示例
abstract class PowNode extends Node {
public abstract double execute(double a, int exp);
@Specialization(guards = "exp==1")
double doOne(double a, int exp) {
return a;
}
@Specialization(replaces = "doOne")
int doGeneric(double a, int exp) {
double res = 1;
for (int i = 0; i < exp; i++)
res *= a;
return res;
}
}
为了测试 doGeneric
在参数 exp == 1
时产生正确结果,您首先需要用不同的值执行此节点。例如,您可以使用 exp == 2
来激活 doGeneric
专用化,然后只使用 1
,此时将由 doGeneric
专用化而不是 doOne
专用化处理。在实际代码中,编写测试来覆盖替换其他专用化的专用化可能要复杂得多,并且会导致脆弱的测试。生产代码的更改可能会导致测试突然覆盖不同的专用化。这很容易在不知不觉中发生。
Truffle DSL 提供了一种模式,其中“快速路径”专用化(那些被其他专用化“替换”的,在我们的示例中是 doOne
)被忽略。这允许您通过运行相同的测试来简单地增加测试覆盖率,这些测试现在可能覆盖不同的代码路径。
使用 mx
构建语言时,请传递附加选项
mx build -c -A-Atruffle.dsl.GenerateSlowPathOnly=true
重建后,生成的代码将仅调用“慢路径”专用化。请确保您的 IDE 在此期间不会自动重新编译源代码。请注意,如果您将依赖项(例如 Truffle)作为构建的一部分从源代码编译,此选项也将适用于这些依赖项的代码。您可以选择通过使用过滤器将此选项仅应用于某些类
mx build -c -A-Atruffle.dsl.GenerateSlowPathOnly=true -A-Atruffle.dsl.GenerateSlowPathOnlyFilter=org.my.truffle.language.package