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を使用すると、doOne特殊化ではなくdoGeneric特殊化によって処理されます。実際のコードでは、他の特殊化を置き換える特殊化を対象とするテストを記述することは、はるかに複雑になる可能性があり、脆弱なテストにつながります。本番コードを変更すると、テストで別の特殊化が突然対象となる可能性があります。これは、気付かないうちに簡単に起こる可能性があります。

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