版本
- 适用于 JDK 23 的 GraalVM(最新版)
- 适用于 JDK 24 的 GraalVM(抢先体验版)
- 适用于 JDK 21 的 GraalVM
- 适用于 JDK 17 的 GraalVM
- 存档
- 开发版本
- Truffle 语言实现框架
- Truffle 分支检测
- 动态对象模型
- 静态对象模型
- 解释器代码的主机优化
- Truffle 的函数内联方法
- 分析 Truffle 解释器
- Truffle 交互操作 2.0
- 语言实现
- 使用 Truffle 实现新语言
- 将 Truffle 语言和工具迁移到 Java 模块
- Truffle 本地函数接口
- 优化 Truffle 解释器
- 选项
- 栈上替换
- Truffle 字符串指南
- 特化直方图
- 测试 DSL 特化
- 基于 Polyglot 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