Search in sources :

Example 86 with RootNode

use of com.oracle.truffle.api.nodes.RootNode in project sulong by graalvm.

the class LLVMSourceScope method create.

@TruffleBoundary
public static Iterable<Scope> create(Node node, Frame frame, LLVMContext context) {
    final LLVMSourceContext sourceContext = context.getSourceContext();
    final RootNode rootNode = node.getRootNode();
    LLVMNode llvmNode = findStatementNode(node);
    if (rootNode == null || llvmNode == null) {
        return Collections.singleton(new LLVMSourceScope(sourceContext, node).toScope(frame));
    }
    LLVMSourceLocation scope = llvmNode.getSourceLocation();
    final SourceSection sourceSection = llvmNode.getSourceSection();
    LLVMSourceScope baseScope = new LLVMSourceScope(sourceContext, new LinkedList<>(), rootNode);
    LLVMSourceScope staticScope = null;
    for (boolean isLocalScope = true; isLocalScope && scope != null; scope = scope.getParent()) {
        final LLVMSourceScope next = toScope(scope, sourceContext, rootNode, sourceSection);
        copySymbols(next, baseScope);
        if (scope.getKind() == LLVMSourceLocation.Kind.FUNCTION) {
            baseScope.setName(next.getName());
            if (scope.getCompileUnit() != null) {
                staticScope = toScope(scope.getCompileUnit(), sourceContext, null, sourceSection);
            }
            isLocalScope = false;
        }
    }
    List<Scope> scopeList = new ArrayList<>();
    scopeList.add(baseScope.toScope(frame));
    for (; scope != null; scope = scope.getParent()) {
        // e.g. lambdas are compiled to calls to a method in a locally defined class. We
        // cannot access the locals of the enclosing function since they do not lie on the
        // function's frame. They are still accessible from the calling function's frame, so
        // we can simply ignore this scope here. Also, any variables actually used in the
        // lambda would still be available as the members of the 'this' pointer.
        final LLVMSourceScope next = toScope(scope, sourceContext, null, sourceSection);
        switch(scope.getKind()) {
            case NAMESPACE:
            case FILE:
            case BLOCK:
                if (next.hasSymbols()) {
                    scopeList.add(next.toScope(frame));
                }
                break;
            case COMPILEUNIT:
                if (staticScope == null) {
                    staticScope = next;
                } else {
                    copySymbols(next, staticScope);
                }
                break;
        }
    }
    if (staticScope != null && staticScope.hasSymbols()) {
        scopeList.add(staticScope.toScope(frame));
    }
    return Collections.unmodifiableList(scopeList);
}
Also used : RootNode(com.oracle.truffle.api.nodes.RootNode) Scope(com.oracle.truffle.api.Scope) ArrayList(java.util.ArrayList) SourceSection(com.oracle.truffle.api.source.SourceSection) LLVMNode(com.oracle.truffle.llvm.runtime.nodes.api.LLVMNode) LLVMSourceContext(com.oracle.truffle.llvm.runtime.debug.LLVMSourceContext) TruffleBoundary(com.oracle.truffle.api.CompilerDirectives.TruffleBoundary)

Aggregations

RootNode (com.oracle.truffle.api.nodes.RootNode)86 Test (org.junit.Test)36 VirtualFrame (com.oracle.truffle.api.frame.VirtualFrame)24 Node (com.oracle.truffle.api.nodes.Node)23 CallTarget (com.oracle.truffle.api.CallTarget)16 OptimizedCallTarget (org.graalvm.compiler.truffle.runtime.OptimizedCallTarget)16 RootCallTarget (com.oracle.truffle.api.RootCallTarget)12 FrameDescriptor (com.oracle.truffle.api.frame.FrameDescriptor)12 RootTestNode (org.graalvm.compiler.truffle.test.nodes.RootTestNode)9 Source (com.oracle.truffle.api.source.Source)8 AbstractTestNode (org.graalvm.compiler.truffle.test.nodes.AbstractTestNode)8 TruffleRuntime (com.oracle.truffle.api.TruffleRuntime)7 TruffleBoundary (com.oracle.truffle.api.CompilerDirectives.TruffleBoundary)6 SourceSection (com.oracle.truffle.api.source.SourceSection)6 LanguageInfo (com.oracle.truffle.api.nodes.LanguageInfo)5 ArrayList (java.util.ArrayList)5 TruffleObject (com.oracle.truffle.api.interop.TruffleObject)4 TruffleContext (com.oracle.truffle.api.TruffleContext)3 TruffleException (com.oracle.truffle.api.TruffleException)3 TruffleLanguage (com.oracle.truffle.api.TruffleLanguage)3