scummvm/engine/lua/lstate.h

133 lines
3.1 KiB
C
Raw Normal View History

2003-08-15 18:00:22 +00:00
/*
** $Id$
** Global State
** See Copyright Notice in lua.h
*/
#ifndef lstate_h
#define lstate_h
#include <setjmp.h>
#include "lobject.h"
#include "lua.h"
#define MAX_C_BLOCKS 10
#define GARBAGE_BLOCK 150
2008-07-20 21:08:22 +00:00
typedef int32 StkId; /* index to stack elements */
2003-08-15 18:00:22 +00:00
struct Stack {
TObject *top;
TObject *stack;
TObject *last;
};
struct C_Lua_Stack {
StkId base; /* when Lua calls C or C calls Lua, points to */
/* the first slot after the last parameter. */
StkId lua2C; /* points to first element of "array" lua2C */
2008-07-20 21:08:22 +00:00
int32 num; /* size of "array" lua2C */
2003-08-15 18:00:22 +00:00
};
typedef struct {
2008-07-20 21:08:22 +00:00
int32 size;
int32 nuse; /* number of elements (including EMPTYs) */
2003-08-15 18:00:22 +00:00
TaggedString **hash;
} stringtable;
enum Status {LOCK, HOLD, FREE, COLLECTED};
struct ref {
TObject o;
enum Status status;
};
struct CallInfo {
Closure *c;
TProtoFunc *tf; /* Set to NULL for C function */
StkId base;
Byte *pc;
2008-07-20 21:08:22 +00:00
int32 nResults;
2003-08-15 18:00:22 +00:00
};
enum TaskState {RUN, YIELD, PAUSE, DONE};
2003-08-15 18:00:22 +00:00
struct lua_Task {
struct Stack stack;
struct C_Lua_Stack Cstack;
jmp_buf *errorJmp;
struct CallInfo *ci;
struct CallInfo *base_ci;
2008-07-20 21:08:22 +00:00
int32 base_ci_size;
2003-08-15 18:00:22 +00:00
struct CallInfo *end_ci;
char *Mbuffer;
char *Mbuffbase;
2008-07-20 21:08:22 +00:00
int32 Mbuffsize;
int32 Mbuffnext;
2003-08-15 18:00:22 +00:00
struct C_Lua_Stack Cblocks[MAX_C_BLOCKS];
2008-07-20 21:08:22 +00:00
int32 numCblocks;
2003-08-15 18:00:22 +00:00
enum TaskState Tstate;
struct lua_Task *next;
2008-07-20 21:08:22 +00:00
int32 id;
2003-08-15 18:00:22 +00:00
};
struct lua_State {
/* thread-specific state */
struct Stack stack; /* Lua stack */
struct C_Lua_Stack Cstack; /* C2lua struct */
jmp_buf *errorJmp; /* current error recover point */
struct CallInfo *ci; /* call info for current function */
struct CallInfo *base_ci; /* array of CallInfo's */
2008-07-20 21:08:22 +00:00
int32 base_ci_size;
2003-08-15 18:00:22 +00:00
struct CallInfo *end_ci; /* points after end of ci array */
char *Mbuffer; /* global buffer */
char *Mbuffbase; /* current first position of Mbuffer */
2008-07-20 21:08:22 +00:00
int32 Mbuffsize; /* size of Mbuffer */
int32 Mbuffnext; /* next position to fill in Mbuffer */
2003-08-15 18:00:22 +00:00
struct C_Lua_Stack Cblocks[MAX_C_BLOCKS];
2008-07-20 21:08:22 +00:00
int32 numCblocks; /* number of nested Cblocks */
2003-08-15 18:00:22 +00:00
enum TaskState Tstate; /* state of current thread */
/* global state */
struct lua_Task *root_task; /* first task created */
struct lua_Task *curr_task;
struct lua_Task *last_task;
TObject errorim; /* error tag method */
GCnode rootproto; /* list of all prototypes */
GCnode rootcl; /* list of all closures */
GCnode roottable; /* list of all tables */
GCnode rootglobal; /* list of strings with global values */
stringtable *string_root; /* array of hash tables for strings and udata */
struct IM *IMtable; /* table for tag methods */
2008-07-20 21:08:22 +00:00
int32 IMtable_size; /* size of IMtable */
int32 last_tag; /* last used tag in IMtable */
2003-08-15 18:00:22 +00:00
struct ref *refArray; /* locked objects */
2008-07-20 21:08:22 +00:00
int32 refSize; /* size of refArray */
int32 GCthreshold;
int32 nblocks; /* number of 'blocks' currently allocated */
2003-08-15 18:00:22 +00:00
};
extern lua_State *lua_state;
2008-07-20 21:08:22 +00:00
extern int32 globalTaskSerialId;
2003-08-15 18:00:22 +00:00
#define L lua_state
void lua_resetglobals(void);
2003-08-15 18:00:22 +00:00
/* Switch to the given task */
void luaI_switchtask(struct lua_Task *t);
/* Create a new task and switch to it */
struct lua_Task *luaI_newtask(void);
#endif