2812
+ − 1
/*
+ − 2
** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $
+ − 3
** Global State
+ − 4
** See Copyright Notice in lua.h
+ − 5
*/
+ − 6
+ − 7
#ifndef lstate_h
+ − 8
#define lstate_h
+ − 9
+ − 10
#include "lua.h"
+ − 11
+ − 12
#include "lobject.h"
+ − 13
#include "ltm.h"
+ − 14
#include "lzio.h"
+ − 15
+ − 16
+ − 17
+ − 18
struct lua_longjmp; /* defined in ldo.c */
+ − 19
+ − 20
+ − 21
/* table of globals */
10017
+ − 22
#define gt(L) (&L->l_gt)
2812
+ − 23
+ − 24
/* registry */
10017
+ − 25
#define registry(L) (&G(L)->l_registry)
2812
+ − 26
+ − 27
+ − 28
/* extra stack space to handle TM calls and some other extras */
+ − 29
#define EXTRA_STACK 5
+ − 30
+ − 31
+ − 32
#define BASIC_CI_SIZE 8
+ − 33
+ − 34
#define BASIC_STACK_SIZE (2*LUA_MINSTACK)
+ − 35
+ − 36
+ − 37
+ − 38
typedef struct stringtable {
+ − 39
GCObject **hash;
+ − 40
lu_int32 nuse; /* number of elements */
+ − 41
int size;
+ − 42
} stringtable;
+ − 43
+ − 44
+ − 45
/*
+ − 46
** informations about a call
+ − 47
*/
+ − 48
typedef struct CallInfo {
+ − 49
StkId base; /* base for this function */
+ − 50
StkId func; /* function index in the stack */
10017
+ − 51
StkId top; /* top for this function */
2812
+ − 52
const Instruction *savedpc;
+ − 53
int nresults; /* expected number of results from this function */
+ − 54
int tailcalls; /* number of tail calls lost under this entry */
+ − 55
} CallInfo;
+ − 56
+ − 57
+ − 58
10017
+ − 59
#define curr_func(L) (clvalue(L->ci->func))
+ − 60
#define ci_func(ci) (clvalue((ci)->func))
+ − 61
#define f_isLua(ci) (!ci_func(ci)->c.isC)
+ − 62
#define isLua(ci) (ttisfunction((ci)->func) && f_isLua(ci))
2812
+ − 63
+ − 64
+ − 65
/*
+ − 66
** `global state', shared by all threads of this state
+ − 67
*/
+ − 68
typedef struct global_State {
+ − 69
stringtable strt; /* hash table for strings */
+ − 70
lua_Alloc frealloc; /* function to reallocate memory */
+ − 71
void *ud; /* auxiliary data to `frealloc' */
+ − 72
lu_byte currentwhite;
+ − 73
lu_byte gcstate; /* state of garbage collector */
+ − 74
int sweepstrgc; /* position of sweep in `strt' */
+ − 75
GCObject *rootgc; /* list of all collectable objects */
+ − 76
GCObject **sweepgc; /* position of sweep in `rootgc' */
+ − 77
GCObject *gray; /* list of gray objects */
+ − 78
GCObject *grayagain; /* list of objects to be traversed atomically */
+ − 79
GCObject *weak; /* list of weak tables (to be cleared) */
+ − 80
GCObject *tmudata; /* last element of list of userdata to be GC */
+ − 81
Mbuffer buff; /* temporary buffer for string concatentation */
+ − 82
lu_mem GCthreshold;
+ − 83
lu_mem totalbytes; /* number of bytes currently allocated */
+ − 84
lu_mem estimate; /* an estimate of number of bytes actually in use */
+ − 85
lu_mem gcdept; /* how much GC is `behind schedule' */
+ − 86
int gcpause; /* size of pause between successive GCs */
+ − 87
int gcstepmul; /* GC `granularity' */
+ − 88
lua_CFunction panic; /* to be called in unprotected errors */
+ − 89
TValue l_registry;
+ − 90
struct lua_State *mainthread;
+ − 91
UpVal uvhead; /* head of double-linked list of all open upvalues */
+ − 92
struct Table *mt[NUM_TAGS]; /* metatables for basic types */
+ − 93
TString *tmname[TM_N]; /* array with tag-method names */
+ − 94
} global_State;
+ − 95
+ − 96
+ − 97
/*
+ − 98
** `per thread' state
+ − 99
*/
+ − 100
struct lua_State {
+ − 101
CommonHeader;
+ − 102
lu_byte status;
+ − 103
StkId top; /* first free slot in the stack */
+ − 104
StkId base; /* base of current function */
+ − 105
global_State *l_G;
+ − 106
CallInfo *ci; /* call info for current function */
+ − 107
const Instruction *savedpc; /* `savedpc' of current function */
+ − 108
StkId stack_last; /* last free slot in the stack */
+ − 109
StkId stack; /* stack base */
+ − 110
CallInfo *end_ci; /* points after end of ci array*/
+ − 111
CallInfo *base_ci; /* array of CallInfo's */
+ − 112
int stacksize;
+ − 113
int size_ci; /* size of array `base_ci' */
+ − 114
unsigned short nCcalls; /* number of nested C calls */
+ − 115
unsigned short baseCcalls; /* nested C calls when resuming coroutine */
+ − 116
lu_byte hookmask;
+ − 117
lu_byte allowhook;
+ − 118
int basehookcount;
+ − 119
int hookcount;
+ − 120
lua_Hook hook;
+ − 121
TValue l_gt; /* table of globals */
+ − 122
TValue env; /* temporary place for environments */
+ − 123
GCObject *openupval; /* list of open upvalues in this stack */
+ − 124
GCObject *gclist;
+ − 125
struct lua_longjmp *errorJmp; /* current error recover point */
+ − 126
ptrdiff_t errfunc; /* current error handling function (stack index) */
+ − 127
};
+ − 128
+ − 129
10017
+ − 130
#define G(L) (L->l_G)
2812
+ − 131
+ − 132
+ − 133
/*
+ − 134
** Union of all collectable objects
+ − 135
*/
+ − 136
union GCObject {
+ − 137
GCheader gch;
+ − 138
union TString ts;
+ − 139
union Udata u;
+ − 140
union Closure cl;
+ − 141
struct Table h;
+ − 142
struct Proto p;
+ − 143
struct UpVal uv;
+ − 144
struct lua_State th; /* thread */
+ − 145
};
+ − 146
+ − 147
+ − 148
/* macros to convert a GCObject into a specific value */
10017
+ − 149
#define rawgco2ts(o) check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts))
+ − 150
#define gco2ts(o) (&rawgco2ts(o)->tsv)
+ − 151
#define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))
+ − 152
#define gco2u(o) (&rawgco2u(o)->uv)
+ − 153
#define gco2cl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl))
+ − 154
#define gco2h(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))
+ − 155
#define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))
+ − 156
#define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))
2812
+ − 157
#define ngcotouv(o) \
10017
+ − 158
check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv))
+ − 159
#define gco2th(o) check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th))
2812
+ − 160
+ − 161
/* macro to convert any Lua object into a GCObject */
10017
+ − 162
#define obj2gco(v) (cast(GCObject *, (v)))
2812
+ − 163
+ − 164
+ − 165
LUAI_FUNC lua_State *luaE_newthread (lua_State *L);
+ − 166
LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
+ − 167
+ − 168
#endif
+ − 169