package mumbler.truffle; import java.io.IOException; import mumbler.truffle.node.MumblerNode; import mumbler.truffle.parser.Converter; import mumbler.truffle.parser.Reader; import mumbler.truffle.syntax.ListSyntax; import mumbler.truffle.type.MumblerFunction; import com.oracle.truffle.api.CallTarget; import com.oracle.truffle.api.TruffleLanguage; import com.oracle.truffle.api.frame.FrameSlot; import com.oracle.truffle.api.frame.MaterializedFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.source.Source; @TruffleLanguage.Registration(name = "Mumbler", version = "0.3", mimeType = MumblerLanguage.MIME_TYPE) public class MumblerLanguage extends TruffleLanguage<Object> { public static final String MIME_TYPE = "application/x-mumbler"; public static final MumblerLanguage INSTANCE = new MumblerLanguage(); private static final boolean TAIL_CALL_OPTIMIZATION_ENABLED = true; private MumblerLanguage() { } @Override protected Object createContext(TruffleLanguage.Env env) { return new MumblerContext(); } @Override protected CallTarget parse(Source source, Node node, String... argumentNames) throws IOException { MumblerContext context = new MumblerContext(); ListSyntax sexp = Reader.read(source); Converter converter = new Converter(TAIL_CALL_OPTIMIZATION_ENABLED); MumblerNode[] nodes = converter.convertSexp(context, sexp); MumblerFunction function = MumblerFunction.create(new FrameSlot[] {}, nodes, context.getGlobalFrame().getFrameDescriptor()); return function.callTarget; } @Override protected Object evalInContext(Source code, Node node, MaterializedFrame frame) throws IOException { throw new IllegalStateException("evalInContext not supported in this language: Python"); } @Override protected Object findExportedSymbol(Object arg0, String arg1, boolean arg2) { // TODO Auto-generated method stub return null; } @Override protected Object getLanguageGlobal(Object arg0) { // TODO Auto-generated method stub return null; } @Override protected boolean isObjectOfLanguage(Object obj) { return false; } }