// Path: lang/src/main/java/mumbler/truffle/node/MumblerNode.java
// @TypeSystemReference(MumblerTypes.class)
// @NodeInfo(language = "Mumbler Language", description = "The abstract base node for all expressions")
// public abstract class MumblerNode extends Node {
//     @CompilationFinal
//     private SourceSection sourceSection;
// 
//     @CompilationFinal
//     private boolean isTail = false;
// 
//     @Override
//     public SourceSection getSourceSection() {
//     	return this.sourceSection;
//     }
// 
//     public void setSourceSection(SourceSection sourceSection) {
//     	this.sourceSection = sourceSection;
//     }
// 
//     public boolean isTail() {
//         return this.isTail;
//     }
// 
//     public void setIsTail() {
//         this.isTail = true;
//     }
// 
//     public abstract Object execute(VirtualFrame virtualFrame);
// 
//     public long executeLong(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectLong(this.execute(virtualFrame));
//     }
// 
//     public boolean executeBoolean(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectBoolean(this.execute(virtualFrame));
//     }
// 
//     public BigInteger executeBigInteger(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectBigInteger(this.execute(virtualFrame));
//     }
// 
//     public MumblerSymbol executeMumblerSymbol(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectMumblerSymbol(this.execute(virtualFrame));
//     }
// 
//     public MumblerFunction executeMumblerFunction(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectMumblerFunction(
//                 this.execute(virtualFrame));
//     }
// 
//     public MumblerList<?> executeMumblerList(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectMumblerList(this.execute(virtualFrame));
//     }
// 
//     public String executeString(VirtualFrame virtualFrame)
//             throws UnexpectedResultException{
//         return MumblerTypesGen.expectString(this.execute(virtualFrame));
//     }
// 
//     protected boolean isArgumentIndexInRange(VirtualFrame virtualFrame,
//             int index) {
//         return (index + 1) < virtualFrame.getArguments().length;
//     }
// 
//     protected Object getArgument(VirtualFrame virtualFrame, int index) {
//         return virtualFrame.getArguments()[index + 1];
//     }
// 
//     protected static MaterializedFrame getLexicalScope(Frame frame) {
//         Object[] args = frame.getArguments();
//         if (args.length > 0) {
//             return (MaterializedFrame) frame.getArguments()[0];
//         } else {
//             return null;
//         }
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/node/MumblerRootNode.java
// public class MumblerRootNode extends RootNode {
//     @Children private final MumblerNode[] bodyNodes;
//     @CompilationFinal public String name;
// 
//     public MumblerRootNode(MumblerLanguage lang, MumblerNode[] bodyNodes,
//             FrameDescriptor frameDescriptor) {
//         super(lang, frameDescriptor);
//         this.bodyNodes = bodyNodes;
//     }
// 
//     @Override
//     @ExplodeLoop
//     public Object execute(VirtualFrame virtualFrame) {
//         int last = this.bodyNodes.length - 1;
//         CompilerAsserts.compilationConstant(last);
//         for (int i=0; i<last; i++) {
//             this.bodyNodes[i].execute(virtualFrame);
//         }
//         return this.bodyNodes[last].execute(virtualFrame);
//     }
// 
//     public static MumblerRootNode create(MumblerLanguage lang, FrameSlot[] argumentNames,
//             MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) {
//         MumblerNode[] allNodes = new MumblerNode[argumentNames.length
//                                                  + bodyNodes.length];
//         for (int i=0; i<argumentNames.length; i++) {
//             allNodes[i] = DefineNodeGen.create(
//                     new ReadArgumentNode(i), argumentNames[i]);
//         }
//         System.arraycopy(bodyNodes, 0, allNodes,
//                 argumentNames.length, bodyNodes.length);
//         return new MumblerRootNode(lang, allNodes, frameDescriptor);
//     }
// 
//     public void setName(String name) {
//         if (this.name == null) {
//             this.name = name;
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return Arrays.toString(this.bodyNodes);
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerFunction.java
// public class MumblerFunction {
//     public final RootCallTarget callTarget;
//     private MaterializedFrame lexicalScope;
// 
//     public MumblerFunction(RootCallTarget callTarget) {
//         this.callTarget = callTarget;
//     }
// 
//     public MaterializedFrame getLexicalScope() {
//         return lexicalScope;
//     }
// 
//     public void setLexicalScope(MaterializedFrame lexicalScope) {
//         this.lexicalScope = lexicalScope;
//     }
// 
//     public static MumblerFunction create(MumblerLanguage lang, FrameSlot[] arguments,
//                                          MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) {
//         return new MumblerFunction(
//                 Truffle.getRuntime().createCallTarget(
//                         MumblerRootNode.create(lang, arguments, bodyNodes, frameDescriptor)));
//     }
// }


import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import mumbler.truffle.node.MumblerNode;
import mumbler.truffle.node.MumblerRootNode;
import mumbler.truffle.type.MumblerFunction;
import com.oracle.truffle.api.dsl.NodeField;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;
package mumbler.truffle.node.special;



@NodeField(name = "function", type = MumblerFunction.class)
public abstract class LambdaNode extends MumblerNode {
    public abstract MumblerFunction getFunction();

    @CompilationFinal private boolean scopeSet = false;

    @Specialization
    public Object getMumblerFunction(VirtualFrame virtualFrame) {
// Path: lang/src/main/java/mumbler/truffle/node/MumblerNode.java
// @TypeSystemReference(MumblerTypes.class)
// @NodeInfo(language = "Mumbler Language", description = "The abstract base node for all expressions")
// public abstract class MumblerNode extends Node {
//     @CompilationFinal
//     private SourceSection sourceSection;
// 
//     @CompilationFinal
//     private boolean isTail = false;
// 
//     @Override
//     public SourceSection getSourceSection() {
//     	return this.sourceSection;
//     }
// 
//     public void setSourceSection(SourceSection sourceSection) {
//     	this.sourceSection = sourceSection;
//     }
// 
//     public boolean isTail() {
//         return this.isTail;
//     }
// 
//     public void setIsTail() {
//         this.isTail = true;
//     }
// 
//     public abstract Object execute(VirtualFrame virtualFrame);
// 
//     public long executeLong(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectLong(this.execute(virtualFrame));
//     }
// 
//     public boolean executeBoolean(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectBoolean(this.execute(virtualFrame));
//     }
// 
//     public BigInteger executeBigInteger(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectBigInteger(this.execute(virtualFrame));
//     }
// 
//     public MumblerSymbol executeMumblerSymbol(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectMumblerSymbol(this.execute(virtualFrame));
//     }
// 
//     public MumblerFunction executeMumblerFunction(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectMumblerFunction(
//                 this.execute(virtualFrame));
//     }
// 
//     public MumblerList<?> executeMumblerList(VirtualFrame virtualFrame)
//             throws UnexpectedResultException {
//         return MumblerTypesGen.expectMumblerList(this.execute(virtualFrame));
//     }
// 
//     public String executeString(VirtualFrame virtualFrame)
//             throws UnexpectedResultException{
//         return MumblerTypesGen.expectString(this.execute(virtualFrame));
//     }
// 
//     protected boolean isArgumentIndexInRange(VirtualFrame virtualFrame,
//             int index) {
//         return (index + 1) < virtualFrame.getArguments().length;
//     }
// 
//     protected Object getArgument(VirtualFrame virtualFrame, int index) {
//         return virtualFrame.getArguments()[index + 1];
//     }
// 
//     protected static MaterializedFrame getLexicalScope(Frame frame) {
//         Object[] args = frame.getArguments();
//         if (args.length > 0) {
//             return (MaterializedFrame) frame.getArguments()[0];
//         } else {
//             return null;
//         }
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/node/MumblerRootNode.java
// public class MumblerRootNode extends RootNode {
//     @Children private final MumblerNode[] bodyNodes;
//     @CompilationFinal public String name;
// 
//     public MumblerRootNode(MumblerLanguage lang, MumblerNode[] bodyNodes,
//             FrameDescriptor frameDescriptor) {
//         super(lang, frameDescriptor);
//         this.bodyNodes = bodyNodes;
//     }
// 
//     @Override
//     @ExplodeLoop
//     public Object execute(VirtualFrame virtualFrame) {
//         int last = this.bodyNodes.length - 1;
//         CompilerAsserts.compilationConstant(last);
//         for (int i=0; i<last; i++) {
//             this.bodyNodes[i].execute(virtualFrame);
//         }
//         return this.bodyNodes[last].execute(virtualFrame);
//     }
// 
//     public static MumblerRootNode create(MumblerLanguage lang, FrameSlot[] argumentNames,
//             MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) {
//         MumblerNode[] allNodes = new MumblerNode[argumentNames.length
//                                                  + bodyNodes.length];
//         for (int i=0; i<argumentNames.length; i++) {
//             allNodes[i] = DefineNodeGen.create(
//                     new ReadArgumentNode(i), argumentNames[i]);
//         }
//         System.arraycopy(bodyNodes, 0, allNodes,
//                 argumentNames.length, bodyNodes.length);
//         return new MumblerRootNode(lang, allNodes, frameDescriptor);
//     }
// 
//     public void setName(String name) {
//         if (this.name == null) {
//             this.name = name;
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return Arrays.toString(this.bodyNodes);
//     }
// }
// 
// Path: lang/src/main/java/mumbler/truffle/type/MumblerFunction.java
// public class MumblerFunction {
//     public final RootCallTarget callTarget;
//     private MaterializedFrame lexicalScope;
// 
//     public MumblerFunction(RootCallTarget callTarget) {
//         this.callTarget = callTarget;
//     }
// 
//     public MaterializedFrame getLexicalScope() {
//         return lexicalScope;
//     }
// 
//     public void setLexicalScope(MaterializedFrame lexicalScope) {
//         this.lexicalScope = lexicalScope;
//     }
// 
//     public static MumblerFunction create(MumblerLanguage lang, FrameSlot[] arguments,
//                                          MumblerNode[] bodyNodes, FrameDescriptor frameDescriptor) {
//         return new MumblerFunction(
//                 Truffle.getRuntime().createCallTarget(
//                         MumblerRootNode.create(lang, arguments, bodyNodes, frameDescriptor)));
//     }
// }


// Path: lang/src/main/java/mumbler/truffle/node/special/LambdaNode.java
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import mumbler.truffle.node.MumblerNode;
import mumbler.truffle.node.MumblerRootNode;
import mumbler.truffle.type.MumblerFunction;
import com.oracle.truffle.api.dsl.NodeField;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.VirtualFrame;

package mumbler.truffle.node.special;



@NodeField(name = "function", type = MumblerFunction.class)
public abstract class LambdaNode extends MumblerNode {
    public abstract MumblerFunction getFunction();

    @CompilationFinal private boolean scopeSet = false;

    @Specialization
    public Object getMumblerFunction(VirtualFrame virtualFrame) {
        MumblerFunction function = this.getFunction();