測試 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

與我們聯繫