GraalVM / Polyglot:如何以编程方式获取SourceLocation

时间:2019-07-28 16:03:07

标签: graalvm

有没有办法从Java获取当前源位置(SourceSection)?

例如通过context.eval()执行的js脚本调用了Java方法,该Java方法记录了当前的js脚本名称+行

PolyglotException具有提供此信息的getSourceLocation()。来自polyglot的堆栈跟踪也似乎包含有关源位置的信息,例如在:program(未命名:2:23-53)

2 个答案:

答案 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()