为什么Truffle DSL在添加@Specialization注解时会报错?
Why does Truffle DSL makes an error when adding @Specialization annotations?
我正在尝试将 Truffle 框架实现到现有语言 (INI) 中,并且我设法 运行 具有基本功能和 Truffle 的语言。但是,当我尝试向我的方法添加 @Specialization
注释时,编译器崩溃并输出此消息:
src/main/java/ini/eval/function/PrintFunction.java:[17,17] Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. The following execute methods do not provide all evaluated values for the expected signature size 1: [executeGeneric(VirtualFrame), executeNumber(VirtualFrame), executeBoolean(VirtualFrame), executeChar(VirtualFrame), executeString(VirtualFrame)]
但是,当我删除 @Specialization
注释时,它工作正常
这是我唯一设置专业化的 class :
@NodeInfo(shortName = "print")
@GenerateNodeFactory()
public abstract class PrintFunction extends BuiltInExecutable {
public PrintFunction(IniParser parser, String name, String[] parameterNames) {
super();
}
private static final PrintStream out = System.out;
@Specialization
public Number print(Number value) {
doPrint(value);
return value;
}
@TruffleBoundary
private static void doPrint(Number value) {
out.print(value);
}
... More specializations for other types (boolean, and String)
@Specialization
public Object print(Object value) {
doPrint(value);
return value;
}
@TruffleBoundary
private static void doPrint(Object value) {
out.print(value);
}
}
所有节点(AstElement)的superclass有方法executeGeneric(VirtaulFrame)和executeNumber、executeBoolean、executeChar和executeString。所以 class PrintFunction 也有这些方法
那么,您认为导致错误消息的真正原因是什么,或者至少是什么意思?
我从使用 Truffle 实现的 Mumbler Language 和 SimpleLanguage 中获得灵感。
我从 Graal Slack 上的一位伟人那里得到的答案
value
需要来自某个地方。 Truffle 希望您有一种表达形式作为打印函数的子节点。标准方法是在 class 定义中添加类似 @NodeChild(value = "receiver", type = ExpressionNode.class)
的内容
Stefan Marr 等了 10 分钟
如果 value
不应来自子节点,即子节点,您可以改为定义抽象 execute(Object value)
方法,DLS 将使用特化
为您实现该方法
我正在尝试将 Truffle 框架实现到现有语言 (INI) 中,并且我设法 运行 具有基本功能和 Truffle 的语言。但是,当我尝试向我的方法添加 @Specialization
注释时,编译器崩溃并输出此消息:
src/main/java/ini/eval/function/PrintFunction.java:[17,17] Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. The following execute methods do not provide all evaluated values for the expected signature size 1: [executeGeneric(VirtualFrame), executeNumber(VirtualFrame), executeBoolean(VirtualFrame), executeChar(VirtualFrame), executeString(VirtualFrame)]
但是,当我删除 @Specialization
注释时,它工作正常
这是我唯一设置专业化的 class :
@NodeInfo(shortName = "print")
@GenerateNodeFactory()
public abstract class PrintFunction extends BuiltInExecutable {
public PrintFunction(IniParser parser, String name, String[] parameterNames) {
super();
}
private static final PrintStream out = System.out;
@Specialization
public Number print(Number value) {
doPrint(value);
return value;
}
@TruffleBoundary
private static void doPrint(Number value) {
out.print(value);
}
... More specializations for other types (boolean, and String)
@Specialization
public Object print(Object value) {
doPrint(value);
return value;
}
@TruffleBoundary
private static void doPrint(Object value) {
out.print(value);
}
}
所有节点(AstElement)的superclass有方法executeGeneric(VirtaulFrame)和executeNumber、executeBoolean、executeChar和executeString。所以 class PrintFunction 也有这些方法
那么,您认为导致错误消息的真正原因是什么,或者至少是什么意思?
我从使用 Truffle 实现的 Mumbler Language 和 SimpleLanguage 中获得灵感。
我从 Graal Slack 上的一位伟人那里得到的答案
value
需要来自某个地方。 Truffle 希望您有一种表达形式作为打印函数的子节点。标准方法是在 class 定义中添加类似 @NodeChild(value = "receiver", type = ExpressionNode.class)
的内容
Stefan Marr 等了 10 分钟
如果 value
不应来自子节点,即子节点,您可以改为定义抽象 execute(Object value)
方法,DLS 将使用特化