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);
}
Aggregations