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: #ifndef _include_bytecode_compiler_h_ dvander@0: #define _include_bytecode_compiler_h_ dvander@0: dvander@0: #include "AST.h" dvander@0: #include "BytecodeEmitter.h" dvander@0: #include "Code.h" dvander@0: dvander@0: namespace jc { dvander@0: dvander@0: class Module; dvander@0: dvander@0: class BytecodeCompiler : public AstVisitor dvander@0: { dvander@0: ParseTree *tree_; dvander@0: BytecodeEmitter emitter_; dvander@0: Module *module_; dvander@0: Type **locals_; dvander@1: Scope *scope_; dvander@1: dvander@1: public: dvander@1: class AutoEnterScope dvander@1: { dvander@1: BytecodeCompiler *bc_; dvander@1: Scope *saved_; dvander@1: dvander@1: public: dvander@1: AutoEnterScope(BytecodeCompiler *bc, Scope *scope) dvander@1: : bc_(bc), dvander@1: saved_(bc->scope_) dvander@1: { dvander@1: if (scope) dvander@1: bc->scope_ = scope; dvander@1: } dvander@1: ~AutoEnterScope() { dvander@1: bc_->scope_ = saved_; dvander@1: } dvander@1: }; dvander@0: dvander@0: private: dvander@1: void leaveScope(Scope *scope); dvander@0: void visitForTest(Expression *expression, BytecodeEmitter::Label *label, bool onTrue); dvander@0: Code *compileFunction(Module *module, FunctionStatement *fun); dvander@0: dvander@0: public: dvander@0: BytecodeCompiler(ParseTree *tree); dvander@0: dvander@0: Module *compile(); dvander@0: dvander@0: public: dvander@0: void visit(NameProxy *name); dvander@0: void visit(Assignment *node); dvander@0: void visit(BinaryExpression *node); dvander@0: void visit(ReturnStatement *node); dvander@0: void visit(ForStatement *node); dvander@0: void visit(BlockStatement *node); dvander@0: void visit(VariableDeclaration *node); dvander@0: void visit(IntegerLiteralExpression *node); dvander@0: void visit(ExpressionStatement *node); dvander@0: void visit(FunctionStatement *node); dvander@0: void visit(CallExpression *node); dvander@0: void visit(IfStatement *node); dvander@0: void visit(IndexExpression *node); dvander@2: void visit(EnumStatement *node); dvander@0: }; dvander@0: dvander@0: } dvander@0: dvander@0: #endif // _include_bytecode_generator_h_