diff -r 11c81eb30246 -r 7c942b5adebc jitcraft/Stack.h --- a/jitcraft/Stack.h Sun Jul 08 17:57:44 2012 -0700 +++ b/jitcraft/Stack.h Mon Jul 09 01:22:03 2012 -0700 @@ -31,6 +31,7 @@ class Array; class Reference; class Frame; +class Stack; union LocalSlot { @@ -47,16 +48,6 @@ LocalSlot *sp; bytecode *pc; Frame *fp; - - Top(LocalSlot *sp, bytecode *pc, Frame *fp) - : sp(sp), pc(pc), fp(NULL) - { - } - - Top(LocalSlot *sp) - : sp(sp), pc(NULL), fp(NULL) - { - } }; class Frame @@ -111,11 +102,34 @@ void accept(VirtualObjectVisitor *visitor); }; +// RAII object for calling a function from C++. +class InvokeArgs +{ + friend class Stack; + + Stack *stack_; + LocalSlot *args_; + unsigned nargs_; + + public: + InvokeArgs() + : stack_(NULL), + args_(NULL), + nargs_(0) + { + } + + ~InvokeArgs(); + + LocalSlot &arg(unsigned index) { + assert(index < nargs_); + return args_[nargs_ - index - 1]; + } +}; + class Stack { - char *buffer_; - char *end_; - Top *top_; + friend class InvokeArgs; private: static const size_t STACK_SIZE = 1024 * 1024; @@ -127,20 +141,24 @@ bool initialize(); public: - Frame *pushFrame(Function *fun); - Frame *popFrame(); + Frame *pushInlineFrame(Handle fun); + Frame *popInlineFrame(); + + bool pushInvokeFrame(Handle fun, InvokeArgs &args); Top *top() { - return top_; - } - void setTop(Top *top) { - top_ = top; - } - Top begin() { - return Top((LocalSlot *)buffer_); + return &top_; } bool isInCallStack(Handle module); void accept(VirtualObjectVisitor *visitor); + + private: + void popInvokeFrame(InvokeArgs &args); + + private: + char *buffer_; + char *end_; + Top top_; }; }