mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
126 lines
2.8 KiB
C
126 lines
2.8 KiB
C
/*
|
|
** $Id$
|
|
** Global State
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#ifndef lstate_h
|
|
#define lstate_h
|
|
|
|
#include <setjmp.h>
|
|
|
|
#include "engine/lua/lobject.h"
|
|
#include "engine/lua/lua.h"
|
|
|
|
|
|
#define MAX_C_BLOCKS 10
|
|
#define GARBAGE_BLOCK 150
|
|
|
|
typedef int32 StkId; /* index to stack elements */
|
|
|
|
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
|
|
int32 num; // size of "array" lua2C
|
|
};
|
|
|
|
|
|
typedef struct {
|
|
int32 size;
|
|
int32 nuse; // number of elements (including EMPTYs)
|
|
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;
|
|
int32 nResults;
|
|
};
|
|
|
|
enum TaskState { RUN, YIELD, PAUSE, DONE };
|
|
|
|
struct lua_Task {
|
|
Stack stack;
|
|
C_Lua_Stack Cstack;
|
|
jmp_buf *errorJmp;
|
|
CallInfo *ci;
|
|
CallInfo *base_ci;
|
|
int32 base_ci_size;
|
|
CallInfo *end_ci;
|
|
char *Mbuffer;
|
|
char *Mbuffbase;
|
|
int32 Mbuffsize;
|
|
int32 Mbuffnext;
|
|
C_Lua_Stack Cblocks[MAX_C_BLOCKS];
|
|
int32 numCblocks;
|
|
enum TaskState Tstate;
|
|
struct lua_Task *next;
|
|
int32 id;
|
|
};
|
|
|
|
struct lua_State {
|
|
// thread-specific state
|
|
Stack stack; // Lua stack
|
|
C_Lua_Stack Cstack; // C2lua struct
|
|
jmp_buf *errorJmp; // current error recover point
|
|
CallInfo *ci; // call info for current function
|
|
CallInfo *base_ci; // array of CallInfo's
|
|
int32 base_ci_size;
|
|
CallInfo *end_ci; // points after end of ci array
|
|
char *Mbuffer; // global buffer
|
|
char *Mbuffbase; // current first position of Mbuffer
|
|
int32 Mbuffsize; // size of Mbuffer
|
|
int32 Mbuffnext; // next position to fill in Mbuffer
|
|
C_Lua_Stack Cblocks[MAX_C_BLOCKS];
|
|
int32 numCblocks; // number of nested Cblocks
|
|
enum TaskState Tstate; // state of current thread
|
|
// global state
|
|
lua_Task *root_task; // first task created
|
|
lua_Task *curr_task;
|
|
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
|
|
int32 IMtable_size; // size of IMtable
|
|
int32 last_tag; // last used tag in IMtable
|
|
ref *refArray; // locked objects
|
|
int32 refSize; // size of refArray
|
|
int32 GCthreshold;
|
|
int32 nblocks; // number of 'blocks' currently allocated
|
|
};
|
|
|
|
extern lua_State *lua_state;
|
|
extern int32 globalTaskSerialId;
|
|
|
|
#define L lua_state
|
|
|
|
void lua_resetglobals();
|
|
|
|
// Switch to the given task */
|
|
void luaI_switchtask(lua_Task *t);
|
|
|
|
// Create a new task and switch to it
|
|
lua_Task *luaI_newtask();
|
|
|
|
#endif
|