有没有办法从Java获取当前源位置(SourceSection)?
例如通过context.eval()执行的js脚本调用了Java方法,该Java方法记录了当前的js脚本名称+行
PolyglotException具有提供此信息的getSourceLocation()。来自polyglot的堆栈跟踪也似乎包含有关源位置的信息,例如在:program(未命名:2:23-53)
答案 0 :(得分:0)
棘手的解决方案:您可以将new Error().stack
作为参数传递给Java函数以获取堆栈跟踪。给定
public class A {
public A() {}
public void foo(String x) {
System.out.println("MY ARGUMENT IS: " + x);
}
}
您可以
$GRAALVM_HOME/bin/js --jvm --vm.cp=.
> function bar() { var x = new (Java.type("A"))(); x.foo(new Error().stack) }
> bar()
MY ARGUMENT IS: Error
at bar (<shell>:6:1:56)
at <shell>:7:1:1
答案 1 :(得分:0)
我已经找到了解决方案,但是我仍然不确定它是好是坏。但目前看来,这是唯一可行的方法。
基本上,我需要在Java参数中添加一堆--add-opens:
--add-opens org.graalvm.truffle/com.oracle.truffle.api=ALL-UNNAMED
--add-opens org.graalvm.truffle/com.oracle.truffle.api.frame=ALL-UNNAMED
--add-opens org.graalvm.truffle/com.oracle.truffle.api.nodes=ALL-UNNAMED
--add-opens org.graalvm.truffle/com.oracle.truffle.api.source=ALL-UNNAMED
然后使用Truffle运行时,我可以获取调用者框架和SourceSelection
Truffle.getRuntime().getCallerFrame().getCallNode().getEncapsulatingSourceSection()