测试 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

联系我们