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;
  }
}

引数 `exp == 1` に対して `doGeneric` が正しい結果を生成することをテストするには、まずこのノードを異なる値で実行する必要があります。たとえば、`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

お問い合わせ