1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
// Copyright (c) 1996 James Clark
// See the file copying.txt for copying permission.
#ifndef VM_INCLUDED
#define VM_INCLUDED 1
#include "Collector.h"
#include "EvalContext.h"
#include "Location.h"
#ifdef DSSSL_NAMESPACE
namespace DSSSL_NAMESPACE {
#endif
class ELObj;
class ContinuationObj;
class Interpreter;
class Insn;
class VM : public EvalContext, private Collector::DynamicRoot {
public:
VM(Interpreter &);
VM(EvalContext &, Interpreter &);
virtual ~VM();
ELObj **sp;
Interpreter *interp;
ELObj **closure;
ELObj *protectClosure;
ELObj **frame;
int nActualArgs;
Location closureLoc;
ELObj *eval(const Insn *, ELObj **display = 0, ELObj *arg = 0);
void initStack();
void needStack(int);
void pushFrame(const Insn *next, int argsPushed);
const Insn *popFrame();
void setClosureArgToCC();
void trace(Collector &) const;
Vector<const ProcessingMode *> modeStack;
private:
void growStack(int);
void init();
void stackTrace();
ELObj **slim;
ELObj **sbase;
struct ControlStackEntry {
int frameSize; // before pushing args
ELObj **closure;
ELObj *protectClosure;
Location closureLoc;
ContinuationObj *continuation;
const Insn *next;
};
ControlStackEntry *csp;
ControlStackEntry *csbase;
ControlStackEntry *cslim;
friend class ContinuationObj;
};
inline
void VM::needStack(int n)
{
if (slim - sp < n)
growStack(n);
}
#ifdef DSSSL_NAMESPACE
}
#endif
#endif /* not VM_INCLUDED */
|