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

联系我们