
#ifndef _Machine_h_INCLUDED
#define _Machine_h_INCLUDED

#include "Program.h"
#include "Frame.h"
#include "Value.h"

class Machine {
    
  public:

    Machine(void);
    Value Run(Program *p, Frame *e);
    
  private:

    Value *stack;
    long stackSize;
    long stackPointer;
    long insPointer;
    Program *prog;
    Frame *env;
    void RunOne(void);
    void Push(Value v);
    Value Pop(void);
    Value TOS(void) { return stack[stackPointer - 1]; }
    short FetchS(void) { return prog->FetchS(insPointer); }
    long FetchL(void) { return prog->FetchL(insPointer); }
    void *FetchP(void) { return prog->FetchP(insPointer); }
};

#endif
