From bce6572579a7e6c7a96895d9280396b3b33b8f3f Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 26 Jan 2001 09:45:51 -0200 Subject: [PATCH] new macros + new names to facilitate compilation of threaded version --- lapi.c | 208 +++++++++++++++++++++++++++---------------------------- ldebug.c | 26 +++---- ldo.c | 18 ++--- liolib.c | 14 ++-- lstate.c | 14 ++-- lstate.h | 14 ++-- ltm.c | 14 ++-- lua.c | 36 +++++----- lua.h | 22 ++++-- 9 files changed, 190 insertions(+), 176 deletions(-) diff --git a/lapi.c b/lapi.c index d9229444..26563daf 100644 --- a/lapi.c +++ b/lapi.c @@ -1,5 +1,5 @@ /* -** $Id: lapi.c,v 1.119 2001/01/24 15:45:33 roberto Exp roberto $ +** $Id: lapi.c,v 1.120 2001/01/25 16:45:36 roberto Exp roberto $ ** Lua API ** See Copyright Notice in lua.h */ @@ -55,9 +55,9 @@ void luaA_pushobject (lua_State *L, const TObject *o) { LUA_API int lua_stackspace (lua_State *L) { int i; - LUA_ENTRY; + LUA_LOCK; i = (L->stack_last - L->top); - LUA_EXIT; + LUA_UNLOCK; return i; } @@ -70,49 +70,49 @@ LUA_API int lua_stackspace (lua_State *L) { LUA_API int lua_gettop (lua_State *L) { int i; - LUA_ENTRY; + LUA_LOCK; i = (L->top - L->Cbase); - LUA_EXIT; + LUA_UNLOCK; return i; } LUA_API void lua_settop (lua_State *L, int index) { - LUA_ENTRY; + LUA_LOCK; if (index >= 0) luaD_adjusttop(L, L->Cbase, index); else L->top = L->top+index+1; /* index is negative */ - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_remove (lua_State *L, int index) { StkId p; - LUA_ENTRY; + LUA_LOCK; p = luaA_index(L, index); while (++p < L->top) setobj(p-1, p); L->top--; - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_insert (lua_State *L, int index) { StkId p; StkId q; - LUA_ENTRY; + LUA_LOCK; p = luaA_index(L, index); for (q = L->top; q>p; q--) setobj(q, q-1); setobj(p, L->top); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_pushvalue (lua_State *L, int index) { - LUA_ENTRY; + LUA_LOCK; setobj(L->top, luaA_index(L, index)); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } @@ -125,19 +125,19 @@ LUA_API void lua_pushvalue (lua_State *L, int index) { LUA_API int lua_type (lua_State *L, int index) { StkId o; int i; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); i = (o == NULL) ? LUA_TNONE : ttype(o); - LUA_EXIT; + LUA_UNLOCK; return i; } LUA_API const char *lua_typename (lua_State *L, int t) { const char *s; - LUA_ENTRY; + LUA_LOCK; s = (t == LUA_TNONE) ? "no value" : basictypename(G(L), t); - LUA_EXIT; + LUA_UNLOCK; return s; } @@ -145,10 +145,10 @@ LUA_API const char *lua_typename (lua_State *L, int t) { LUA_API const char *lua_xtype (lua_State *L, int index) { StkId o; const char *type; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); type = (o == NULL) ? "no value" : luaT_typename(G(L), o); - LUA_EXIT; + LUA_UNLOCK; return type; } @@ -156,20 +156,20 @@ LUA_API const char *lua_xtype (lua_State *L, int index) { LUA_API int lua_iscfunction (lua_State *L, int index) { StkId o; int i; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); i = (o == NULL) ? 0 : iscfunction(o); - LUA_EXIT; + LUA_UNLOCK; return i; } LUA_API int lua_isnumber (lua_State *L, int index) { TObject *o; int i; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); i = (o == NULL) ? 0 : (tonumber(o) == 0); - LUA_EXIT; + LUA_UNLOCK; return i; } @@ -182,34 +182,34 @@ LUA_API int lua_isstring (lua_State *L, int index) { LUA_API int lua_tag (lua_State *L, int index) { StkId o; int i; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); i = (o == NULL) ? LUA_NOTAG : luaT_tag(o); - LUA_EXIT; + LUA_UNLOCK; return i; } LUA_API int lua_equal (lua_State *L, int index1, int index2) { StkId o1, o2; int i; - LUA_ENTRY; + LUA_LOCK; o1 = luaA_indexAcceptable(L, index1); o2 = luaA_indexAcceptable(L, index2); i = (o1 == NULL || o2 == NULL) ? 0 /* index out-of-range */ : luaO_equalObj(o1, o2); - LUA_EXIT; + LUA_UNLOCK; return i; } LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { StkId o1, o2; int i; - LUA_ENTRY; + LUA_LOCK; o1 = luaA_indexAcceptable(L, index1); o2 = luaA_indexAcceptable(L, index2); i = (o1 == NULL || o2 == NULL) ? 0 /* index out-of-range */ : luaV_lessthan(L, o1, o2, L->top); - LUA_EXIT; + LUA_UNLOCK; return i; } @@ -218,58 +218,58 @@ LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { LUA_API lua_Number lua_tonumber (lua_State *L, int index) { StkId o; lua_Number n; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); n = (o == NULL || tonumber(o)) ? 0 : nvalue(o); - LUA_EXIT; + LUA_UNLOCK; return n; } LUA_API const char *lua_tostring (lua_State *L, int index) { StkId o; const char *s; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); s = (o == NULL || tostring(L, o)) ? NULL : svalue(o); - LUA_EXIT; + LUA_UNLOCK; return s; } LUA_API size_t lua_strlen (lua_State *L, int index) { StkId o; size_t l; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); l = (o == NULL || tostring(L, o)) ? 0 : tsvalue(o)->len; - LUA_EXIT; + LUA_UNLOCK; return l; } LUA_API lua_CFunction lua_tocfunction (lua_State *L, int index) { StkId o; lua_CFunction f; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); f = (o == NULL || !iscfunction(o)) ? NULL : clvalue(o)->f.c; - LUA_EXIT; + LUA_UNLOCK; return f; } LUA_API void *lua_touserdata (lua_State *L, int index) { StkId o; void *p; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); p = (o == NULL || ttype(o) != LUA_TUSERDATA) ? NULL : tsvalue(o)->u.d.value; - LUA_EXIT; + LUA_UNLOCK; return p; } LUA_API const void *lua_topointer (lua_State *L, int index) { StkId o; const void *p; - LUA_ENTRY; + LUA_LOCK; o = luaA_indexAcceptable(L, index); if (o == NULL) p = NULL; else { @@ -285,7 +285,7 @@ LUA_API const void *lua_topointer (lua_State *L, int index) { break; } } - LUA_EXIT; + LUA_UNLOCK; return p; } @@ -297,26 +297,26 @@ LUA_API const void *lua_topointer (lua_State *L, int index) { LUA_API void lua_pushnil (lua_State *L) { - LUA_ENTRY; + LUA_LOCK; setnilvalue(L->top); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { - LUA_ENTRY; + LUA_LOCK; setnvalue(L->top, n); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { - LUA_ENTRY; + LUA_LOCK; setsvalue(L->top, luaS_newlstr(L, s, len)); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } @@ -329,20 +329,20 @@ LUA_API void lua_pushstring (lua_State *L, const char *s) { LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { - LUA_ENTRY; + LUA_LOCK; luaV_Cclosure(L, fn, n); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_pushusertag (lua_State *L, void *u, int tag) { - LUA_ENTRY; + LUA_LOCK; /* ORDER LUA_T */ if (!(tag == LUA_ANYTAG || tag == LUA_TUSERDATA || validtag(G(L), tag))) luaO_verror(L, "invalid tag for a userdata (%d)", tag); setuvalue(L->top, luaS_createudata(L, u, tag)); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } @@ -354,58 +354,58 @@ LUA_API void lua_pushusertag (lua_State *L, void *u, int tag) { LUA_API void lua_getglobal (lua_State *L, const char *name) { StkId top; - LUA_ENTRY; + LUA_LOCK; top = L->top; setobj(top, luaV_getglobal(L, luaS_new(L, name))); L->top = top; api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_gettable (lua_State *L, int index) { StkId t, top; - LUA_ENTRY; + LUA_LOCK; t = Index(L, index); top = L->top; setobj(top-1, luaV_gettable(L, t)); L->top = top; /* tag method may change top */ - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_rawget (lua_State *L, int index) { StkId t; - LUA_ENTRY; + LUA_LOCK; t = Index(L, index); lua_assert(ttype(t) == LUA_TTABLE); setobj(L->top - 1, luaH_get(hvalue(t), L->top - 1)); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_rawgeti (lua_State *L, int index, int n) { StkId o; - LUA_ENTRY; + LUA_LOCK; o = Index(L, index); lua_assert(ttype(o) == LUA_TTABLE); setobj(L->top, luaH_getnum(hvalue(o), n)); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_getglobals (lua_State *L) { - LUA_ENTRY; + LUA_LOCK; sethvalue(L->top, L->gt); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } LUA_API int lua_getref (lua_State *L, int ref) { int status = 1; - LUA_ENTRY; + LUA_LOCK; if (ref == LUA_REFNIL) { setnilvalue(L->top); api_incr_top(L); @@ -417,16 +417,16 @@ LUA_API int lua_getref (lua_State *L, int ref) { } else status = 0; - LUA_EXIT; + LUA_UNLOCK; return status; } LUA_API void lua_newtable (lua_State *L) { - LUA_ENTRY; + LUA_LOCK; sethvalue(L->top, luaH_new(L, 0)); api_incr_top(L); - LUA_EXIT; + LUA_UNLOCK; } @@ -438,60 +438,60 @@ LUA_API void lua_newtable (lua_State *L) { LUA_API void lua_setglobal (lua_State *L, const char *name) { StkId top; - LUA_ENTRY; + LUA_LOCK; top = L->top; luaV_setglobal(L, luaS_new(L, name)); L->top = top-1; /* remove element from the top */ - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_settable (lua_State *L, int index) { StkId t, top; - LUA_ENTRY; + LUA_LOCK; t = Index(L, index); top = L->top; luaV_settable(L, t, top-2); L->top = top-2; /* pop index and value */ - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_rawset (lua_State *L, int index) { StkId t; - LUA_ENTRY; + LUA_LOCK; t = Index(L, index); lua_assert(ttype(t) == LUA_TTABLE); setobj(luaH_set(L, hvalue(t), L->top-2), (L->top-1)); L->top -= 2; - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_rawseti (lua_State *L, int index, int n) { StkId o; - LUA_ENTRY; + LUA_LOCK; o = Index(L, index); lua_assert(ttype(o) == LUA_TTABLE); setobj(luaH_setnum(L, hvalue(o), n), (L->top-1)); L->top--; - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_setglobals (lua_State *L) { StkId newtable; - LUA_ENTRY; + LUA_LOCK; newtable = --L->top; lua_assert(ttype(newtable) == LUA_TTABLE); L->gt = hvalue(newtable); - LUA_EXIT; + LUA_UNLOCK; } LUA_API int lua_ref (lua_State *L, int lock) { int ref; - LUA_ENTRY; + LUA_LOCK; if (ttype(L->top-1) == LUA_TNIL) ref = LUA_REFNIL; else { @@ -508,7 +508,7 @@ LUA_API int lua_ref (lua_State *L, int lock) { G(L)->refArray[ref].st = lock ? LOCK : HOLD; } L->top--; - LUA_EXIT; + LUA_UNLOCK; return ref; } @@ -519,9 +519,9 @@ LUA_API int lua_ref (lua_State *L, int lock) { */ LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) { - LUA_ENTRY; + LUA_LOCK; luaD_call(L, L->top-(nargs+1), nresults); - LUA_EXIT; + LUA_UNLOCK; } @@ -535,28 +535,28 @@ LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) { LUA_API int lua_getgcthreshold (lua_State *L) { int threshold; - LUA_ENTRY; + LUA_LOCK; threshold = GCscale(G(L)->GCthreshold); - LUA_EXIT; + LUA_UNLOCK; return threshold; } LUA_API int lua_getgccount (lua_State *L) { int count; - LUA_ENTRY; + LUA_LOCK; count = GCscale(G(L)->nblocks); - LUA_EXIT; + LUA_UNLOCK; return count; } LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { - LUA_ENTRY; + LUA_LOCK; if (newthreshold > GCscale(ULONG_MAX)) G(L)->GCthreshold = ULONG_MAX; else G(L)->GCthreshold = GCunscale(newthreshold); luaC_checkGC(L); - LUA_EXIT; + LUA_UNLOCK; } @@ -566,7 +566,7 @@ LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { LUA_API int lua_newtype (lua_State *L, const char *name, int basictype) { int tag; - LUA_ENTRY; + LUA_LOCK; if (basictype != LUA_TNONE && basictype != LUA_TTABLE && basictype != LUA_TUSERDATA) @@ -574,7 +574,7 @@ LUA_API int lua_newtype (lua_State *L, const char *name, int basictype) { tag = luaT_newtag(L, name, basictype); if (tag == LUA_TNONE) luaO_verror(L, "type name '%.30s' already exists", name); - LUA_EXIT; + LUA_UNLOCK; return tag; } @@ -582,22 +582,22 @@ LUA_API int lua_newtype (lua_State *L, const char *name, int basictype) { LUA_API int lua_type2tag (lua_State *L, const char *name) { int tag; const TObject *v; - LUA_ENTRY; + LUA_LOCK; v = luaH_getstr(G(L)->type2tag, luaS_new(L, name)); if (ttype(v) == LUA_TNIL) tag = LUA_TNONE; else { lua_assert(ttype(v) == LUA_TNUMBER); - tag = nvalue(v); + tag = (int)nvalue(v); } - LUA_EXIT; + LUA_UNLOCK; return tag; } LUA_API void lua_settag (lua_State *L, int tag) { int basictype; - LUA_ENTRY; + LUA_LOCK; if (tag < 0 || tag >= G(L)->ntag) luaO_verror(L, "%d is not a valid tag", tag); basictype = G(L)->TMtable[tag].basictype; @@ -615,25 +615,25 @@ LUA_API void lua_settag (lua_State *L, int tag) { luaO_verror(L, "cannot change the tag of a %.20s", luaT_typename(G(L), L->top-1)); } - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_error (lua_State *L, const char *s) { - LUA_ENTRY; + LUA_LOCK; luaD_error(L, s); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_unref (lua_State *L, int ref) { - LUA_ENTRY; + LUA_LOCK; if (ref >= 0) { lua_assert(ref < G(L)->nref && G(L)->refArray[ref].st < 0); G(L)->refArray[ref].st = G(L)->refFree; G(L)->refFree = ref; } - LUA_EXIT; + LUA_UNLOCK; } @@ -641,7 +641,7 @@ LUA_API int lua_next (lua_State *L, int index) { StkId t; Node *n; int more; - LUA_ENTRY; + LUA_LOCK; t = luaA_index(L, index); lua_assert(ttype(t) == LUA_TTABLE); n = luaH_next(L, hvalue(t), luaA_index(L, -1)); @@ -655,7 +655,7 @@ LUA_API int lua_next (lua_State *L, int index) { L->top -= 1; /* remove key */ more = 0; } - LUA_EXIT; + LUA_UNLOCK; return more; } @@ -664,7 +664,7 @@ LUA_API int lua_getn (lua_State *L, int index) { Hash *h; const TObject *value; int n; - LUA_ENTRY; + LUA_LOCK; h = hvalue(luaA_index(L, index)); value = luaH_getstr(h, luaS_newliteral(L, "n")); /* = h.n */ if (ttype(value) == LUA_TNUMBER) @@ -682,31 +682,31 @@ LUA_API int lua_getn (lua_State *L, int index) { } n = (int)max; } - LUA_EXIT; + LUA_UNLOCK; return n; } LUA_API void lua_concat (lua_State *L, int n) { StkId top; - LUA_ENTRY; + LUA_LOCK; top = L->top; luaV_strconc(L, n, top); L->top = top-(n-1); luaC_checkGC(L); - LUA_EXIT; + LUA_UNLOCK; } LUA_API void *lua_newuserdata (lua_State *L, size_t size) { TString *ts; void *p; - LUA_ENTRY; + LUA_LOCK; ts = luaS_newudata(L, size, NULL); setuvalue(L->top, ts); api_incr_top(L); p = ts->u.d.value; - LUA_EXIT; + LUA_UNLOCK; return p; } diff --git a/ldebug.c b/ldebug.c index ba43d6bc..1a4c7f96 100644 --- a/ldebug.c +++ b/ldebug.c @@ -1,5 +1,5 @@ /* -** $Id: ldebug.c,v 1.55 2001/01/24 15:45:33 roberto Exp roberto $ +** $Id: ldebug.c,v 1.56 2001/01/25 16:45:36 roberto Exp roberto $ ** Debug Interface ** See Copyright Notice in lua.h */ @@ -42,20 +42,20 @@ static int isLmark (StkId o) { LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) { lua_Hook oldhook; - LUA_ENTRY; + LUA_LOCK; oldhook = L->callhook; L->callhook = func; - LUA_EXIT; + LUA_UNLOCK; return oldhook; } LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) { lua_Hook oldhook; - LUA_ENTRY; + LUA_LOCK; oldhook = L->linehook; L->linehook = func; - LUA_EXIT; + LUA_UNLOCK; return oldhook; } @@ -76,14 +76,14 @@ static StkId aux_stackedfunction (lua_State *L, int level, StkId top) { LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { StkId f; int status; - LUA_ENTRY; + LUA_LOCK; f = aux_stackedfunction(L, level, L->top); if (f == NULL) status = 0; /* there is no such level */ else { ar->_func = f; status = 1; } - LUA_EXIT; + LUA_UNLOCK; return status; } @@ -162,7 +162,7 @@ LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { const char *name; StkId f; Proto *fp; - LUA_ENTRY; + LUA_LOCK; name = NULL; f = ar->_func; fp = getluaproto(f); @@ -171,7 +171,7 @@ LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { if (name) luaA_pushobject(L, (f+1)+(n-1)); /* push value */ } - LUA_EXIT; + LUA_UNLOCK; return name; } @@ -180,7 +180,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { const char *name; StkId f; Proto *fp; - LUA_ENTRY; + LUA_LOCK; name = NULL; f = ar->_func; fp = getluaproto(f); @@ -192,7 +192,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { else setobj((f+1)+(n-1), L->top); } - LUA_EXIT; + LUA_UNLOCK; return name; } @@ -272,7 +272,7 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { StkId func; int isactive; int status = 1; - LUA_ENTRY; + LUA_LOCK; isactive = (*what != '>'); if (isactive) func = ar->_func; @@ -309,7 +309,7 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { } } if (!isactive) L->top--; /* pop function */ - LUA_EXIT; + LUA_UNLOCK; return status; } diff --git a/ldo.c b/ldo.c index ec7897f9..c17385e4 100644 --- a/ldo.c +++ b/ldo.c @@ -1,5 +1,5 @@ /* -** $Id: ldo.c,v 1.115 2001/01/19 13:20:30 roberto Exp roberto $ +** $Id: ldo.c,v 1.116 2001/01/24 15:45:33 roberto Exp roberto $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */ @@ -94,9 +94,9 @@ static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) { StkId old_top = L->Cbase = L->top; luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ L->allowhooks = 0; /* cannot call hooks inside a hook */ - LUA_EXIT; + LUA_UNLOCK; (*hook)(L, ar); - LUA_ENTRY; + LUA_LOCK; lua_assert(L->allowhooks == 0); L->allowhooks = 1; L->top = old_top; @@ -135,9 +135,9 @@ static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) { luaD_checkstack(L, nup+LUA_MINSTACK); /* ensure minimum stack size */ for (n=0; ntop++, &cl->upvalue[n]); - LUA_EXIT; + LUA_UNLOCK; n = (*cl->f.c)(L); /* do the actual call */ - LUA_ENTRY; + LUA_LOCK; L->Cbase = old_Cbase; /* restore old C base */ return L->top - n; /* return index of first result */ } @@ -219,13 +219,13 @@ LUA_API int lua_call (lua_State *L, int nargs, int nresults) { StkId func; struct CallS c; int status; - LUA_ENTRY; + LUA_LOCK; func = L->top - (nargs+1); /* function to be called */ c.func = func; c.nresults = nresults; status = luaD_runprotected(L, f_call, &c); if (status != 0) /* an error occurred? */ L->top = func; /* remove parameters from the stack */ - LUA_EXIT; + LUA_UNLOCK; return status; } @@ -249,7 +249,7 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) { struct ParserS p; mem_int old_blocks; int status; - LUA_ENTRY; + LUA_LOCK; p.z = z; p.bin = bin; luaC_checkGC(L); old_blocks = G(L)->nblocks; @@ -261,7 +261,7 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) { } else if (status == LUA_ERRRUN) /* an error occurred: correct error code */ status = LUA_ERRSYNTAX; - LUA_EXIT; + LUA_UNLOCK; return status; } diff --git a/liolib.c b/liolib.c index 4e5f861a..e4851209 100644 --- a/liolib.c +++ b/liolib.c @@ -1,5 +1,5 @@ /* -** $Id: liolib.c,v 1.99 2001/01/18 15:59:09 roberto Exp roberto $ +** $Id: liolib.c,v 1.100 2001/01/25 16:45:36 roberto Exp roberto $ ** Standard I/O (and system) library ** See Copyright Notice in lua.h */ @@ -86,13 +86,14 @@ static int pushresult (lua_State *L, int i) { static FILE *getopthandle (lua_State *L, int inout) { FILE *p = (FILE *)lua_touserdata(L, 1); if (p != NULL) { /* is it a userdata ? */ - if (!checkfile(L,1)) { + if (!checkfile(L, 1)) { if (strcmp(lua_xtype(L, 1), "ClosedFileHandle") == 0) luaL_argerror(L, 1, "file is closed"); else luaL_argerror(L, 1, "(invalid value)"); } - lua_remove(L, 1); /* remove it from stack */ + /* move it to stack top */ + lua_pushvalue(L, 1); lua_remove(L, 1); } else if (inout != NOFILE) { /* try global value */ lua_getglobal(L, filenames[inout]); @@ -100,9 +101,8 @@ static FILE *getopthandle (lua_State *L, int inout) { luaL_verror(L, "global variable `%.10s' is not a valid file handle", filenames[inout]); p = (FILE *)lua_touserdata(L, -1); - lua_pop(L, 1); /* remove global value from stack */ } - return p; + return p; /* leave handle at stack top to avoid GC */ } @@ -295,7 +295,7 @@ static int read_chars (lua_State *L, FILE *f, size_t n) { static int io_read (lua_State *L) { FILE *f = getopthandle(L, INFILE); - int nargs = lua_gettop(L); + int nargs = lua_gettop(L)-1; int success; int n; if (nargs == 0) { /* no arguments? */ @@ -347,7 +347,7 @@ static int io_read (lua_State *L) { static int io_write (lua_State *L) { FILE *f = getopthandle(L, OUTFILE); - int nargs = lua_gettop(L); + int nargs = lua_gettop(L)-1; int arg; int status = 1; for (arg=1; arg<=nargs; arg++) { diff --git a/lstate.c b/lstate.c index a5666839..fd4edff5 100644 --- a/lstate.c +++ b/lstate.c @@ -1,5 +1,5 @@ /* -** $Id: lstate.c,v 1.53 2001/01/24 15:45:33 roberto Exp roberto $ +** $Id: lstate.c,v 1.54 2001/01/25 16:45:36 roberto Exp roberto $ ** Global State ** See Copyright Notice in lua.h */ @@ -91,7 +91,7 @@ static void f_luaopen (lua_State *L, void *ud) { luaX_init(L); luaT_init(L); G(L)->GCthreshold = 4*G(L)->nblocks; - LUA_EXIT; /* temporary exit to use the API */ + LUA_UNLOCK; /* temporary exit to use the API */ lua_newtable(L); lua_ref(L, 1); /* create registry */ lua_register(L, LUA_ERRORMESSAGE, errormessage); @@ -100,7 +100,7 @@ static void f_luaopen (lua_State *L, void *ud) { if (lua_state == NULL) lua_state = L; /* keep first state to be opened */ lua_assert(lua_gettop(L) == 0); #endif - LUA_ENTRY; /* go back inside */ + LUA_LOCK; /* go back inside */ } } @@ -108,7 +108,7 @@ static void f_luaopen (lua_State *L, void *ud) { LUA_API lua_State *lua_open (lua_State *OL, int stacksize) { struct Sopen so; lua_State *L; - LUA_ENTRY; + LUA_LOCK; L = luaM_new(OL, lua_State); if (L) { /* allocation OK? */ L->G = NULL; @@ -127,7 +127,7 @@ LUA_API lua_State *lua_open (lua_State *OL, int stacksize) { L = NULL; } } - LUA_EXIT; + LUA_UNLOCK; return L; } @@ -158,9 +158,9 @@ static void close_state (lua_State *L) { LUA_API void lua_close (lua_State *L) { lua_assert(L != lua_state || lua_gettop(L) == 0); - LUA_ENTRY; + LUA_LOCK; close_state(L); - LUA_EXIT; + LUA_UNLOCK; lua_assert(L != lua_state || memdebug_numblocks == 0); lua_assert(L != lua_state || memdebug_total == 0); } diff --git a/lstate.h b/lstate.h index 464af1c6..8d25ab89 100644 --- a/lstate.h +++ b/lstate.h @@ -1,5 +1,5 @@ /* -** $Id: lstate.h,v 1.46 2001/01/24 15:45:33 roberto Exp roberto $ +** $Id: lstate.h,v 1.47 2001/01/25 16:45:36 roberto Exp roberto $ ** Global State ** See Copyright Notice in lua.h */ @@ -15,8 +15,8 @@ #ifdef LUA_DEBUG extern int islocked; -#define LUA_ENTRY lua_assert(islocked++ == 0) -#define LUA_EXIT lua_assert(--islocked == 0) +#define LUA_LOCK lua_assert(islocked++ == 0) +#define LUA_UNLOCK lua_assert(--islocked == 0) #endif @@ -24,12 +24,12 @@ extern int islocked; ** macros that control all entries and exits from Lua core machine ** (mainly for thread syncronization) */ -#ifndef LUA_ENTRY -#define LUA_ENTRY +#ifndef LUA_LOCK +#define LUA_LOCK #endif -#ifndef LUA_EXIT -#define LUA_EXIT +#ifndef LUA_UNLOCK +#define LUA_UNLOCK #endif diff --git a/ltm.c b/ltm.c index 8e6996ae..1ccf9a5c 100644 --- a/ltm.c +++ b/ltm.c @@ -1,5 +1,5 @@ /* -** $Id: ltm.c,v 1.62 2001/01/24 15:45:33 roberto Exp roberto $ +** $Id: ltm.c,v 1.63 2001/01/25 16:45:36 roberto Exp roberto $ ** Tag methods ** See Copyright Notice in lua.h */ @@ -111,14 +111,14 @@ static void checktag (lua_State *L, int tag) { LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) { int e; - LUA_ENTRY; + LUA_LOCK; checktag(L, tagto); checktag(L, tagfrom); for (e=0; etop); incr_top; - LUA_EXIT; + LUA_UNLOCK; } LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { int e; - LUA_ENTRY; + LUA_LOCK; e = luaI_checkevent(L, event, t); checktag(L, t); if (!luaT_validevent(t, e)) @@ -190,6 +190,6 @@ LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { luaD_error(L, "tag method must be a function (or nil)"); } L->top--; - LUA_EXIT; + LUA_UNLOCK; } diff --git a/lua.c b/lua.c index d8eca6a8..a7b80e5f 100644 --- a/lua.c +++ b/lua.c @@ -1,5 +1,5 @@ /* -** $Id: lua.c,v 1.56 2001/01/10 16:58:11 roberto Exp roberto $ +** $Id: lua.c,v 1.57 2001/01/22 18:01:38 roberto Exp roberto $ ** Lua stand-alone interpreter ** See Copyright Notice in lua.h */ @@ -16,17 +16,27 @@ #include "lualib.h" -static lua_State *L = NULL; +#ifdef _POSIX_SOURCE +#include +#else +static int isatty (int x) { return x==0; } /* assume stdin is a tty */ +#endif + #ifndef PROMPT #define PROMPT "> " #endif -#ifdef _POSIX_SOURCE -#include -#else -static int isatty (int x) { return x==0; } /* assume stdin is a tty */ + +#ifndef LUA_USERINIT +#define LUA_USERINIT(L) (lua_baselibopen(L), lua_iolibopen(L), \ + lua_strlibopen(L), lua_mathlibopen(L), lua_dblibopen(L)) +#endif + + +#ifndef LUA_USERFINI +#define LUA_USERFINI #endif @@ -39,6 +49,9 @@ struct Options { }; +static lua_State *L = NULL; + + typedef void (*handler)(int); /* type for signal actions */ static void laction (int i); @@ -48,15 +61,6 @@ static lua_Hook old_linehook = NULL; static lua_Hook old_callhook = NULL; -static void userinit (void) { - lua_baselibopen(L); - lua_iolibopen(L); - lua_strlibopen(L); - lua_mathlibopen(L); - lua_dblibopen(L); - /* add your libraries here */ -} - static handler lreset (void) { return signal(SIGINT, laction); @@ -312,7 +316,7 @@ int main (int argc, char *argv[]) { opt.toclose = 0; getstacksize(argc, argv, &opt); /* handle option `-s' */ L = lua_open(NULL, opt.stacksize); /* create state */ - userinit(); /* open libraries */ + LUA_USERINIT(L); /* open libraries */ register_getargs(argv); /* create `getargs' function */ status = handle_argv(argv+1, &opt); if (opt.toclose) diff --git a/lua.h b/lua.h index c6193483..e706eaa9 100644 --- a/lua.h +++ b/lua.h @@ -1,5 +1,5 @@ /* -** $Id: lua.h,v 1.83 2001/01/22 18:01:38 roberto Exp roberto $ +** $Id: lua.h,v 1.84 2001/01/25 16:45:36 roberto Exp roberto $ ** Lua - An Extensible Extension Language ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil ** e-mail: lua@tecgraf.puc-rio.br @@ -16,11 +16,6 @@ #include -/* mark for all API functions */ -#ifndef LUA_API -#define LUA_API extern -#endif - #define LUA_VERSION "Lua 4.1 (work)" #define LUA_COPYRIGHT "Copyright (C) 1994-2000 TeCGraf, PUC-Rio" @@ -77,6 +72,21 @@ typedef int (*lua_CFunction) (lua_State *L); #define LUA_TFUNCTION 5 +/* +** generic extra include file +*/ +#ifdef LUA_USER_H +#include LUA_USER_H +#endif + + + +/* mark for all API functions */ +#ifndef LUA_API +#define LUA_API extern +#endif + + /* ** state manipulation