dvander@47: /* vim: set ts=4 sw=4 tw=99 et: dvander@47: * 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_jc_stack_h_ dvander@0: #define _include_jc_stack_h_ dvander@0: dvander@0: #include dvander@0: #include "Utility.h" dvander@0: #include "Code.h" dvander@26: #include "Functions.h" dvander@47: #include "VirtualObjectVisitor.h" dvander@0: dvander@59: namespace ke { dvander@12: dvander@12: class Object; dvander@12: class Array; dvander@14: class Reference; dvander@47: class Frame; dvander@0: dvander@0: union LocalSlot dvander@0: { dvander@0: int i32; dvander@4: float f; dvander@12: Address address; dvander@12: Object *obj; dvander@12: Array *array; dvander@14: Reference *ref; dvander@0: }; dvander@0: dvander@0: struct Top dvander@0: { dvander@0: LocalSlot *sp; dvander@0: bytecode *pc; dvander@47: Frame *fp; dvander@0: dvander@47: Top(LocalSlot *sp, bytecode *pc, Frame *fp) dvander@47: : sp(sp), pc(pc), fp(NULL) dvander@0: { dvander@0: } dvander@0: dvander@0: Top(LocalSlot *sp) dvander@47: : sp(sp), pc(NULL), fp(NULL) dvander@0: { dvander@0: } dvander@0: }; dvander@0: dvander@0: class Frame dvander@0: { dvander@0: friend class Stack; dvander@0: dvander@0: Frame *prev_; dvander@0: bytecode *prevpc_; dvander@26: Function *fun_; dvander@0: Code *code_; dvander@12: Address lifoPosition_; dvander@0: dvander@0: public: dvander@26: Frame(Frame *prev, bytecode *prevpc, Function *fun, Code *code, Address lifoPosition) dvander@0: : prev_(prev), dvander@0: prevpc_(prevpc), dvander@26: fun_(fun), dvander@1: code_(code), dvander@12: lifoPosition_(lifoPosition) dvander@0: { dvander@0: } dvander@0: dvander@0: LocalSlot *locals() { dvander@0: return reinterpret_cast(this + 1); dvander@0: } dvander@0: LocalSlot *stackBase() { dvander@0: return locals() + code_->nlocals(); dvander@0: } dvander@26: Function *fun() const { dvander@26: assert(fun_); dvander@26: return fun_; dvander@26: } dvander@26: Function *maybeFun() const { dvander@26: return fun_; dvander@26: } dvander@0: Code *code() const { dvander@0: return code_; dvander@0: } dvander@0: Frame *prev() const { dvander@0: return prev_; dvander@0: } dvander@0: bytecode *prevpc() const { dvander@0: return prevpc_; dvander@0: } dvander@12: Address lifoPosition() const { dvander@12: return lifoPosition_; dvander@1: } dvander@0: LocalSlot &arg(unsigned slot) { dvander@26: assert(slot < fun()->nargs()); dvander@0: return *(reinterpret_cast(this) - slot - 1); dvander@0: } dvander@47: void accept(VirtualObjectVisitor *visitor); dvander@0: }; dvander@0: dvander@0: class Stack dvander@0: { dvander@0: char *buffer_; dvander@0: char *end_; dvander@0: Top *top_; dvander@0: dvander@0: private: dvander@0: static const size_t STACK_SIZE = 1024 * 1024; dvander@0: dvander@0: public: dvander@0: Stack(); dvander@0: ~Stack(); dvander@0: dvander@0: bool initialize(); dvander@0: dvander@0: public: dvander@47: Frame *pushFrame(Function *fun); dvander@47: Frame *popFrame(); dvander@0: dvander@0: Top *top() { dvander@0: return top_; dvander@0: } dvander@0: void setTop(Top *top) { dvander@0: top_ = top; dvander@0: } dvander@0: Top begin() { dvander@0: return Top((LocalSlot *)buffer_); dvander@0: } dvander@62: bool isInCallStack(Handle module); dvander@47: void accept(VirtualObjectVisitor *visitor); dvander@0: }; dvander@0: dvander@0: } dvander@0: dvander@0: #endif // _include_jc_stack_h_