dvander@0: /* dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@0: * This file is part of JITCraft. dvander@0: * dvander@0: * JITCraft is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@0: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@0: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #include dvander@0: #include "Utility.h" dvander@0: #include "Scanner.h" dvander@0: #include "Parser.h" dvander@0: #include "SemanticAnalysis.h" dvander@0: #include "Zone.h" dvander@0: #include "BytecodeCompiler.h" dvander@0: #include "Code.h" dvander@0: #include "Interpreter.h" dvander@0: #include "Modules.h" dvander@0: dvander@0: using namespace jc; dvander@0: dvander@0: class File dvander@0: { dvander@0: FILE *fp_; dvander@0: dvander@0: public: dvander@0: File(FILE *fp) dvander@0: : fp_(fp) dvander@0: { dvander@0: } dvander@0: dvander@0: ~File() { dvander@0: if (fp_) dvander@0: fclose(fp_); dvander@0: } dvander@0: dvander@0: operator FILE *() { dvander@0: return fp_; dvander@0: } dvander@0: dvander@0: operator bool () { dvander@0: return !!fp_; dvander@0: } dvander@0: }; dvander@0: dvander@0: static bool dvander@0: Compile(const char *stream, size_t length) dvander@0: { dvander@0: if (!ZONE()->initialize()) dvander@0: return false; dvander@0: dvander@0: Parser parser(stream, length); dvander@0: ParseTree *tree = parser.parse(); dvander@0: if (!tree) dvander@0: return false; dvander@0: tree->dump(stdout); dvander@0: dvander@12: if (!Scope::Bind(tree)) dvander@0: return false; dvander@0: dvander@0: SemanticAnalysis semantics(tree); dvander@0: if (!semantics.analyze()) dvander@0: return false; dvander@0: dvander@12: Scope::Allocate(tree); dvander@12: dvander@14: BytecodeCompiler compiler(tree, NULL); dvander@0: Module *module = compiler.compile(); dvander@0: if (!module) dvander@0: return false; dvander@0: dvander@0: printf("\n ------------ \n\n"); dvander@0: dvander@14: Disassemble(module->getFunction(1), stdout); dvander@0: //Disassemble(module->getFunction(1), stdout); dvander@0: dvander@0: printf("\n ------------ \n\n"); dvander@0: dvander@14: Code *main = module->getFunction(1); dvander@0: dvander@0: Top top = ZONE()->stack().begin(); dvander@0: LocalTop localTop(top); dvander@0: dvander@0: Frame *frame = ZONE()->stack().pushFrame(NULL, main); dvander@0: if (!frame) dvander@0: return false; dvander@0: dvander@4: LocalSlot result; dvander@0: if (!Interpret(frame, &result)) dvander@0: return false; dvander@0: dvander@8: printf("Result: %d\n", result.i32); dvander@0: dvander@0: return true; dvander@0: } dvander@0: dvander@0: int main(int argc, char **argv) dvander@0: { dvander@0: if (argc < 2) { dvander@0: fprintf(stderr, "Usage: \n"); dvander@0: return 1; dvander@0: } dvander@0: dvander@0: AutoVec bytes(NULL); dvander@0: size_t length; dvander@0: { dvander@0: File fp = fopen(argv[1], "rb"); dvander@0: if (!fp) { dvander@0: fprintf(stderr, "Can't open file: \"%s\"\n", argv[1]); dvander@0: return 1; dvander@0: } dvander@0: dvander@0: if (fseek(fp, 0, SEEK_END)) { dvander@0: fprintf(stderr, "Error seeking file!\n"); dvander@0: return 1; dvander@0: } dvander@0: long size = ftell(fp); dvander@0: if (size < 0) { dvander@0: fprintf(stderr, "Error getting file length!\n"); dvander@0: return 1; dvander@0: } dvander@0: rewind(fp); dvander@0: length = size_t(size); dvander@0: bytes = new char[length + 1]; dvander@0: if (fread(bytes, 1, length, fp) != length) { dvander@0: fprintf(stderr, "Error reading file!\n"); dvander@0: return 1; dvander@0: } dvander@0: } dvander@0: dvander@0: Compile(bytes, length); dvander@0: dvander@0: }