hslua 0.2 → 0.3
raw patch · 55 files changed
+280/−559 lines, 55 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
- Scripting.Lua: instance (StackValue a) => LuaImport (IO a)
- Scripting.Lua: instance (StackValue t) => LuaCallFunc (IO t)
+ Scripting.Lua: instance StackValue a => LuaImport (IO a)
+ Scripting.Lua: instance StackValue t => LuaCallFunc (IO t)
- Scripting.Lua: callfunc :: (LuaCallFunc a) => LuaState -> String -> a
+ Scripting.Lua: callfunc :: LuaCallFunc a => LuaState -> String -> a
- Scripting.Lua: callproc :: (LuaCallProc a) => LuaState -> String -> a
+ Scripting.Lua: callproc :: LuaCallProc a => LuaState -> String -> a
- Scripting.Lua: luaimport :: (LuaImport a) => a -> LuaCFunction
+ Scripting.Lua: luaimport :: LuaImport a => a -> LuaCFunction
- Scripting.Lua: newcfunction :: (LuaImport a) => a -> IO (FunPtr LuaCFunction)
+ Scripting.Lua: newcfunction :: LuaImport a => a -> IO (FunPtr LuaCFunction)
- Scripting.Lua: peek :: (StackValue a) => LuaState -> Int -> IO (Maybe a)
+ Scripting.Lua: peek :: StackValue a => LuaState -> Int -> IO (Maybe a)
- Scripting.Lua: push :: (StackValue a) => LuaState -> a -> IO ()
+ Scripting.Lua: push :: StackValue a => LuaState -> a -> IO ()
- Scripting.Lua: pushhsfunction :: (LuaImport a) => LuaState -> a -> IO ()
+ Scripting.Lua: pushhsfunction :: LuaImport a => LuaState -> a -> IO ()
- Scripting.Lua: registerhsfunction :: (LuaImport a) => LuaState -> String -> a -> IO ()
+ Scripting.Lua: registerhsfunction :: LuaImport a => LuaState -> String -> a -> IO ()
- Scripting.Lua: valuetype :: (StackValue a) => a -> LTYPE
+ Scripting.Lua: valuetype :: StackValue a => a -> LTYPE
Files
- hslua.cabal +9/−8
- src/lapi.c +16/−9
- src/lapi.h +1/−1
- src/lauxlib.c +6/−7
- src/lauxlib.h +1/−1
- src/lbaselib.c +49/−39
- src/lcode.c +2/−2
- src/lcode.h +1/−1
- src/ldblib.c +15/−15
- src/ldebug.c +27/−11
- src/ldebug.h +1/−1
- src/ldo.c +13/−11
- src/ldo.h +1/−1
- src/ldump.c +1/−1
- src/lfunc.c +1/−1
- src/lfunc.h +1/−1
- src/lgc.c +1/−1
- src/lgc.h +1/−1
- src/linit.c +1/−1
- src/liolib.c +45/−24
- src/llex.c +1/−1
- src/llex.h +1/−1
- src/llimits.h +1/−1
- src/lmathlib.c +1/−1
- src/lmem.c +1/−1
- src/lmem.h +1/−1
- src/loadlib.c +5/−3
- src/lobject.c +1/−1
- src/lobject.h +2/−2
- src/lopcodes.c +1/−1
- src/lopcodes.h +1/−1
- src/loslib.c +1/−2
- src/lparser.c +3/−1
- src/lparser.h +1/−1
- src/lstate.c +3/−3
- src/lstate.h +2/−1
- src/lstring.c +1/−1
- src/lstring.h +1/−1
- src/lstrlib.c +7/−6
- src/ltable.c +3/−3
- src/ltable.h +1/−1
- src/ltablib.c +17/−8
- src/ltm.c +1/−1
- src/ltm.h +1/−1
- src/lua.h +7/−4
- src/luaconf.h +5/−4
- src/lualib.h +1/−1
- src/lundump.c +8/−4
- src/lundump.h +1/−1
- src/lvm.c +4/−6
- src/lvm.h +1/−1
- src/lzio.c +1/−1
- src/lzio.h +1/−1
- src/print.c +0/−227
- tests/HsLuaMain.hs +0/−128
hslua.cabal view
@@ -1,10 +1,12 @@ Name: hslua-Version: 0.2-Stability: alpha+Version: 0.3+Stability: beta+Cabal-version: >= 1.6 Exposed-modules: Scripting.Lua License: BSD3+Build-type: Simple License-File: COPYRIGHT-Copyright: 2007-2007, Gracjan Polak+Copyright: 2007-2010, Gracjan Polak Author: Gracjan Polak <gracjanpolak@gmail.com> Maintainer: Gracjan Polak <gracjanpolak@gmail.com> Synopsis: A Lua language interpreter embedding in Haskell@@ -12,10 +14,10 @@ The Scripting.Lua module is a wrapper of Lua language interpreter as described in www.lua.org. .- The package is standalone: full Lua interpreter is distributed in this- package as well.+ The package is standalone: full Lua interpreter version 5.1.4 + is distributed in this package as well. Category: Scripting-Build-depends: base+Build-depends: base==4.* Hs-source-dirs: src C-sources: src/lapi.c, src/lauxlib.c, src/lbaselib.c, src/lcode.c, src/ldblib.c, src/ldebug.c, src/ldo.c, src/ldump.c, src/lfunc.c, src/lgc.c,@@ -25,6 +27,5 @@ src/ltable.c, src/ltablib.c, src/ltm.c, src/lundump.c, src/lvm.c, src/lzio.c, src/ntrljmp.c-Ghc-options: -O2-CC-options: -O2+Extra-source-files: src/*.h Include-dirs: src
src/lapi.c view
@@ -1,5 +1,5 @@ /*-** $Id: lapi.c,v 2.55 2006/06/07 12:37:17 roberto Exp $+** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $ ** Lua API ** See Copyright Notice in lua.h */@@ -93,15 +93,14 @@ LUA_API int lua_checkstack (lua_State *L, int size) {- int res;+ int res = 1; lua_lock(L);- if ((L->top - L->base + size) > LUAI_MAXCSTACK)+ if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) res = 0; /* stack overflow */- else {+ else if (size > 0) { luaD_checkstack(L, size); if (L->ci->top < L->top + size) L->ci->top = L->top + size;- res = 1; } lua_unlock(L); return res;@@ -123,6 +122,11 @@ } +LUA_API void lua_setlevel (lua_State *from, lua_State *to) {+ to->nCcalls = from->nCcalls;+}++ LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { lua_CFunction old; lua_lock(L);@@ -749,7 +753,7 @@ res = 0; break; }- luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));+ if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); L->top--; lua_unlock(L); return res;@@ -925,10 +929,13 @@ g->GCthreshold = g->totalbytes - a; else g->GCthreshold = 0;- while (g->GCthreshold <= g->totalbytes)+ while (g->GCthreshold <= g->totalbytes) { luaC_step(L);- if (g->gcstate == GCSpause) /* end of cycle? */- res = 1; /* signal it */+ if (g->gcstate == GCSpause) { /* end of cycle? */+ res = 1; /* signal it */+ break;+ }+ } break; } case LUA_GCSETPAUSE: {
src/lapi.h view
@@ -1,5 +1,5 @@ /*-** $Id: lapi.h,v 2.2 2005/04/25 19:24:10 roberto Exp $+** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions from Lua API ** See Copyright Notice in lua.h */
src/lauxlib.c view
@@ -1,5 +1,5 @@ /*-** $Id: lauxlib.c,v 1.159 2006/03/21 19:31:09 roberto Exp $+** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */@@ -244,7 +244,7 @@ if (libname) { int size = libsize(l); /* check whether lib already exists */- luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", size);+ luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); lua_getfield(L, -1, libname); /* get _LOADED[libname] */ if (!lua_istable(L, -1)) { /* not found? */ lua_pop(L, 1); /* remove previous result */@@ -535,7 +535,7 @@ return "\n"; } if (feof(lf->f)) return NULL;- *size = fread(lf->buff, 1, LUAL_BUFFERSIZE, lf->f);+ *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); return (*size > 0) ? lf->buff : NULL; } @@ -570,9 +570,8 @@ while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ if (c == '\n') c = getc(lf.f); }- if (c == LUA_SIGNATURE[0] && lf.f != stdin) { /* binary file? */- fclose(lf.f);- lf.f = fopen(filename, "rb"); /* reopen in binary mode */+ if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */+ lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ if (lf.f == NULL) return errfile(L, "reopen", fnameindex); /* skip eventual `#!...' */ while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;@@ -581,7 +580,7 @@ ungetc(c, lf.f); status = lua_load(L, getF, &lf, lua_tostring(L, -1)); readstatus = ferror(lf.f);- if (lf.f != stdin) fclose(lf.f); /* close file (even in case of errors) */+ if (filename) fclose(lf.f); /* close file (even in case of errors) */ if (readstatus) { lua_settop(L, fnameindex); /* ignore results from `lua_load' */ return errfile(L, "read", fnameindex);
src/lauxlib.h view
@@ -1,5 +1,5 @@ /*-** $Id: lauxlib.h,v 1.88 2006/04/12 20:31:15 roberto Exp $+** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */
src/lbaselib.c view
@@ -1,5 +1,5 @@ /*-** $Id: lbaselib.c,v 1.191a 2006/06/02 15:34:00 roberto Exp $+** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $ ** Basic library ** See Copyright Notice in lua.h */@@ -344,10 +344,12 @@ luaL_checktype(L, 1, LUA_TTABLE); i = luaL_optint(L, 2, 1); e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));+ if (i > e) return 0; /* empty range */ n = e - i + 1; /* number of elements */- if (n <= 0) return 0; /* empty range */- luaL_checkstack(L, n, "table too big to unpack");- for (; i<=e; i++) /* push arg[i...e] */+ if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */+ return luaL_error(L, "too many results to unpack");+ lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */+ while (i++ < e) /* push arg[i + 1...e] */ lua_rawgeti(L, 1, i); return n; }@@ -477,19 +479,56 @@ ** ======================================================= */ +#define CO_RUN 0 /* running */+#define CO_SUS 1 /* suspended */+#define CO_NOR 2 /* 'normal' (it resumed another coroutine) */+#define CO_DEAD 3++static const char *const statnames[] =+ {"running", "suspended", "normal", "dead"};++static int costatus (lua_State *L, lua_State *co) {+ if (L == co) return CO_RUN;+ switch (lua_status(co)) {+ case LUA_YIELD:+ return CO_SUS;+ case 0: {+ lua_Debug ar;+ if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */+ return CO_NOR; /* it is running */+ else if (lua_gettop(co) == 0)+ return CO_DEAD;+ else+ return CO_SUS; /* initial state */+ }+ default: /* some error occured */+ return CO_DEAD;+ }+}+++static int luaB_costatus (lua_State *L) {+ lua_State *co = lua_tothread(L, 1);+ luaL_argcheck(L, co, 1, "coroutine expected");+ lua_pushstring(L, statnames[costatus(L, co)]);+ return 1;+}++ static int auxresume (lua_State *L, lua_State *co, int narg) {- int status;+ int status = costatus(L, co); if (!lua_checkstack(co, narg)) luaL_error(L, "too many arguments to resume");- if (lua_status(co) == 0 && lua_gettop(co) == 0) {- lua_pushliteral(L, "cannot resume dead coroutine");+ if (status != CO_SUS) {+ lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]); return -1; /* error flag */ } lua_xmove(L, co, narg);+ lua_setlevel(L, co); status = lua_resume(co, narg); if (status == 0 || status == LUA_YIELD) { int nres = lua_gettop(co);- if (!lua_checkstack(L, nres))+ if (!lua_checkstack(L, nres + 1)) luaL_error(L, "too many results to resume"); lua_xmove(co, L, nres); /* move yielded values */ return nres;@@ -556,39 +595,10 @@ } -static int luaB_costatus (lua_State *L) {- lua_State *co = lua_tothread(L, 1);- luaL_argcheck(L, co, 1, "coroutine expected");- if (L == co) lua_pushliteral(L, "running");- else {- switch (lua_status(co)) {- case LUA_YIELD:- lua_pushliteral(L, "suspended");- break;- case 0: {- lua_Debug ar;- if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */- lua_pushliteral(L, "normal"); /* it is running */- else if (lua_gettop(co) == 0)- lua_pushliteral(L, "dead");- else- lua_pushliteral(L, "suspended"); /* initial state */- break;- }- default: /* some error occured */- lua_pushliteral(L, "dead");- break;- }- }- return 1;-}-- static int luaB_corunning (lua_State *L) { if (lua_pushthread(L))- return 0; /* main thread is not a coroutine */- else- return 1;+ lua_pushnil(L); /* main thread is not a coroutine */+ return 1; }
src/lcode.c view
@@ -1,5 +1,5 @@ /*-** $Id: lcode.c,v 2.25a 2006/03/21 19:28:49 roberto Exp $+** $Id: lcode.c,v 2.25.1.3 2007/12/28 15:32:23 roberto Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */@@ -699,7 +699,7 @@ e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; switch (op) { case OPR_MINUS: {- if (e->k == VK)+ if (!isnumeral(e)) luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */ codearith(fs, OP_UNM, e, &e2); break;
src/lcode.h view
@@ -1,5 +1,5 @@ /*-** $Id: lcode.h,v 1.48 2006/03/21 19:28:03 roberto Exp $+** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $ ** Code generator for Lua ** See Copyright Notice in lua.h */
src/ldblib.c view
@@ -1,5 +1,5 @@ /*-** $Id: ldblib.c,v 1.104 2005/12/29 15:32:11 roberto Exp $+** $Id: ldblib.c,v 1.104.1.3 2008/01/21 13:11:21 roberto Exp $ ** Interface from Lua to its debug API ** See Copyright Notice in lua.h */@@ -255,24 +255,25 @@ static int db_sethook (lua_State *L) {- int arg;+ int arg, mask, count;+ lua_Hook func; lua_State *L1 = getthread(L, &arg); if (lua_isnoneornil(L, arg+1)) { lua_settop(L, arg+1);- lua_sethook(L1, NULL, 0, 0); /* turn off hooks */+ func = NULL; mask = 0; count = 0; /* turn off hooks */ } else { const char *smask = luaL_checkstring(L, arg+2);- int count = luaL_optint(L, arg+3, 0); luaL_checktype(L, arg+1, LUA_TFUNCTION);- lua_sethook(L1, hookf, makemask(smask, count), count);+ count = luaL_optint(L, arg+3, 0);+ func = hookf; mask = makemask(smask, count); }- gethooktable(L1);- lua_pushlightuserdata(L1, L1);+ gethooktable(L);+ lua_pushlightuserdata(L, L1); lua_pushvalue(L, arg+1);- lua_xmove(L, L1, 1);- lua_rawset(L1, -3); /* set new hook */- lua_pop(L1, 1); /* remove hook table */+ lua_rawset(L, -3); /* set new hook */+ lua_pop(L, 1); /* remove hook table */+ lua_sethook(L1, func, mask, count); /* set hooks */ return 0; } @@ -286,11 +287,10 @@ if (hook != NULL && hook != hookf) /* external hook? */ lua_pushliteral(L, "external hook"); else {- gethooktable(L1);- lua_pushlightuserdata(L1, L1);- lua_rawget(L1, -2); /* get hook */- lua_remove(L1, -2); /* remove hook table */- lua_xmove(L1, L, 1);+ gethooktable(L);+ lua_pushlightuserdata(L, L1);+ lua_rawget(L, -2); /* get hook */+ lua_remove(L, -2); /* remove hook table */ } lua_pushstring(L, unmakemask(mask, buff)); lua_pushinteger(L, lua_gethookcount(L1));
src/ldebug.c view
@@ -1,5 +1,5 @@ /*-** $Id: ldebug.c,v 2.29a 2005/12/22 16:19:56 roberto Exp $+** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $ ** Debug Interface ** See Copyright Notice in lua.h */@@ -275,12 +275,12 @@ static int precheck (const Proto *pt) { check(pt->maxstacksize <= MAXSTACK);- lua_assert(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);- lua_assert(!(pt->is_vararg & VARARG_NEEDSARG) ||+ check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);+ check(!(pt->is_vararg & VARARG_NEEDSARG) || (pt->is_vararg & VARARG_HASARG)); check(pt->sizeupvalues <= pt->nups); check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);- check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);+ check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); return 1; } @@ -346,9 +346,18 @@ int dest = pc+1+b; check(0 <= dest && dest < pt->sizecode); if (dest > 0) {- /* cannot jump to a setlist count */- Instruction d = pt->code[dest-1];- check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0));+ int j;+ /* check that it does not jump to a setlist count; this+ is tricky, because the count from a previous setlist may+ have the same value of an invalid setlist; so, we must+ go all the way back to the first of them (if any) */+ for (j = 0; j < dest; j++) {+ Instruction d = pt->code[dest-1-j];+ if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break;+ }+ /* if 'j' is even, previous value is not a setlist (even if+ it looks like one) */+ check((j&1) == 0); } } break;@@ -363,7 +372,11 @@ } switch (op) { case OP_LOADBOOL: {- check(c == 0 || pc+2 < pt->sizecode); /* check its jump */+ if (c == 1) { /* does it jump? */+ check(pc+2 < pt->sizecode); /* check its jump */+ check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST ||+ GETARG_C(pt->code[pc+1]) != 0);+ } break; } case OP_LOADNIL: {@@ -428,7 +441,10 @@ } case OP_SETLIST: { if (b > 0) checkreg(pt, a + b);- if (c == 0) pc++;+ if (c == 0) {+ pc++;+ check(pc < pt->sizecode - 1);+ } break; } case OP_CLOSURE: {@@ -563,8 +579,8 @@ void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {- if (ttisstring(p1)) p1 = p2;- lua_assert(!ttisstring(p1));+ if (ttisstring(p1) || ttisnumber(p1)) p1 = p2;+ lua_assert(!ttisstring(p1) && !ttisnumber(p1)); luaG_typeerror(L, p1, "concatenate"); }
src/ldebug.h view
@@ -1,5 +1,5 @@ /*-** $Id: ldebug.h,v 2.3 2005/04/25 19:24:10 roberto Exp $+** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions from Debug Interface module ** See Copyright Notice in lua.h */
src/ldo.c view
@@ -1,5 +1,5 @@ /*-** $Id: ldo.c,v 2.38 2006/06/05 19:36:14 roberto Exp $+** $Id: ldo.c,v 2.38.1.3 2008/01/18 22:31:22 roberto Exp $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */@@ -83,7 +83,7 @@ L->base = L->ci->base; luaF_close(L, L->base); /* close eventual pending closures */ luaD_seterrorobj(L, status, L->base);- L->nCcalls = 0;+ L->nCcalls = L->baseCcalls; L->allowhook = 1; restore_stack_limit(L); L->errfunc = 0;@@ -332,7 +332,7 @@ ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ luaD_callhook(L, LUA_HOOKRET, -1); if (f_isLua(L->ci)) { /* Lua function? */- while (L->ci->tailcalls--) /* call hook for eventual tail calls */+ while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */ luaD_callhook(L, LUA_HOOKTAILRET, -1); } return restorestack(L, fr);@@ -417,22 +417,24 @@ LUA_API int lua_resume (lua_State *L, int nargs) { int status; lua_lock(L);- if (L->status != LUA_YIELD) {- if (L->status != 0)- return resume_error(L, "cannot resume dead coroutine");- else if (L->ci != L->base_ci)+ if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci)) return resume_error(L, "cannot resume non-suspended coroutine");- }+ if (L->nCcalls >= LUAI_MAXCCALLS)+ return resume_error(L, "C stack overflow"); luai_userstateresume(L, nargs);- lua_assert(L->errfunc == 0 && L->nCcalls == 0);+ lua_assert(L->errfunc == 0);+ L->baseCcalls = ++L->nCcalls; status = luaD_rawrunprotected(L, resume, L->top - nargs); if (status != 0) { /* error? */ L->status = cast_byte(status); /* mark thread as `dead' */ luaD_seterrorobj(L, status, L->top); L->ci->top = L->top; }- else+ else {+ lua_assert(L->nCcalls == L->baseCcalls); status = L->status;+ }+ --L->nCcalls; lua_unlock(L); return status; }@@ -441,7 +443,7 @@ LUA_API int lua_yield (lua_State *L, int nresults) { luai_userstateyield(L, nresults); lua_lock(L);- if (L->nCcalls > 0)+ if (L->nCcalls > L->baseCcalls) luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); L->base = L->top - nresults; /* protect stack slots below */ L->status = LUA_YIELD;
src/ldo.h view
@@ -1,5 +1,5 @@ /*-** $Id: ldo.h,v 2.7 2005/08/24 16:15:49 roberto Exp $+** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $ ** Stack and Call structure of Lua ** See Copyright Notice in lua.h */
src/ldump.c view
@@ -1,5 +1,5 @@ /*-** $Id: ldump.c,v 1.15 2006/02/16 15:53:49 lhf Exp $+** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ ** save precompiled Lua chunks ** See Copyright Notice in lua.h */
src/lfunc.c view
@@ -1,5 +1,5 @@ /*-** $Id: lfunc.c,v 2.12a 2005/12/22 16:19:56 roberto Exp $+** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */
src/lfunc.h view
@@ -1,5 +1,5 @@ /*-** $Id: lfunc.h,v 2.4 2005/04/25 19:24:10 roberto Exp $+** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions to manipulate prototypes and closures ** See Copyright Notice in lua.h */
src/lgc.c view
@@ -1,5 +1,5 @@ /*-** $Id: lgc.c,v 2.38 2006/05/24 14:34:06 roberto Exp $+** $Id: lgc.c,v 2.38.1.1 2007/12/27 13:02:25 roberto Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */
src/lgc.h view
@@ -1,5 +1,5 @@ /*-** $Id: lgc.h,v 2.15 2005/08/24 16:15:49 roberto Exp $+** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $ ** Garbage Collector ** See Copyright Notice in lua.h */
src/linit.c view
@@ -1,5 +1,5 @@ /*-** $Id: linit.c,v 1.14 2005/12/29 15:32:11 roberto Exp $+** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $ ** Initialization of libraries for lua.c ** See Copyright Notice in lua.h */
src/liolib.c view
@@ -1,5 +1,5 @@ /*-** $Id: liolib.c,v 2.73 2006/05/08 20:14:16 roberto Exp $+** $Id: liolib.c,v 2.73.1.3 2008/01/18 17:47:43 roberto Exp $ ** Standard I/O (and system) library ** See Copyright Notice in lua.h */@@ -51,7 +51,7 @@ } -#define topfile(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))+#define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) static int io_type (lua_State *L) {@@ -70,7 +70,7 @@ static FILE *tofile (lua_State *L) {- FILE **f = topfile(L);+ FILE **f = tofilep(L); if (*f == NULL) luaL_error(L, "attempt to use a closed file"); return *f;@@ -93,19 +93,31 @@ /*-** this function has a separated environment, which defines the-** correct __close for 'popen' files+** function to (not) close the standard files stdin, stdout, and stderr */+static int io_noclose (lua_State *L) {+ lua_pushnil(L);+ lua_pushliteral(L, "cannot close standard file");+ return 2;+}+++/*+** function to close 'popen' files+*/ static int io_pclose (lua_State *L) {- FILE **p = topfile(L);+ FILE **p = tofilep(L); int ok = lua_pclose(L, *p); *p = NULL; return pushresult(L, ok, NULL); } +/*+** function to close regular files+*/ static int io_fclose (lua_State *L) {- FILE **p = topfile(L);+ FILE **p = tofilep(L); int ok = (fclose(*p) == 0); *p = NULL; return pushresult(L, ok, NULL);@@ -128,18 +140,18 @@ static int io_gc (lua_State *L) {- FILE *f = *topfile(L);- /* ignore closed files and standard files */- if (f != NULL && f != stdin && f != stdout && f != stderr)+ FILE *f = *tofilep(L);+ /* ignore closed files */+ if (f != NULL) aux_close(L); return 0; } static int io_tostring (lua_State *L) {- FILE *f = *topfile(L);+ FILE *f = *tofilep(L); if (f == NULL)- lua_pushstring(L, "file (closed)");+ lua_pushliteral(L, "file (closed)"); else lua_pushfstring(L, "file (%p)", f); return 1;@@ -155,6 +167,10 @@ } +/*+** this function has a separated environment, which defines the+** correct __close for 'popen' files+*/ static int io_popen (lua_State *L) { const char *filename = luaL_checkstring(L, 1); const char *mode = luaL_optstring(L, 2, "r");@@ -280,7 +296,7 @@ char *p = luaL_prepbuffer(&b); if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ luaL_pushresult(&b); /* close buffer */- return (lua_strlen(L, -1) > 0); /* check whether read something */+ return (lua_objlen(L, -1) > 0); /* check whether read something */ } l = strlen(p); if (l == 0 || p[l-1] != '\n')@@ -308,7 +324,7 @@ n -= nr; /* still have to read `n' chars */ } while (n > 0 && nr == rlen); /* until end of count or eof */ luaL_pushresult(&b); /* close buffer */- return (n == 0 || lua_strlen(L, -1) > 0);+ return (n == 0 || lua_objlen(L, -1) > 0); } @@ -502,31 +518,36 @@ lua_pushvalue(L, -1); lua_rawseti(L, LUA_ENVIRONINDEX, k); }- lua_setfield(L, -2, fname);+ lua_pushvalue(L, -2); /* copy environment */+ lua_setfenv(L, -2); /* set it */+ lua_setfield(L, -3, fname); } +static void newfenv (lua_State *L, lua_CFunction cls) {+ lua_createtable(L, 0, 1);+ lua_pushcfunction(L, cls);+ lua_setfield(L, -2, "__close");+}++ LUALIB_API int luaopen_io (lua_State *L) { createmeta(L); /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */- lua_createtable(L, 2, 1);+ newfenv(L, io_fclose); lua_replace(L, LUA_ENVIRONINDEX); /* open library */ luaL_register(L, LUA_IOLIBNAME, iolib); /* create (and set) default files */+ newfenv(L, io_noclose); /* close function for default files */ createstdfile(L, stdin, IO_INPUT, "stdin"); createstdfile(L, stdout, IO_OUTPUT, "stdout"); createstdfile(L, stderr, 0, "stderr");- /* create environment for 'popen' */+ lua_pop(L, 1); /* pop environment for default files */ lua_getfield(L, -1, "popen");- lua_createtable(L, 0, 1);- lua_pushcfunction(L, io_pclose);- lua_setfield(L, -2, "__close");- lua_setfenv(L, -2);+ newfenv(L, io_pclose); /* create environment for 'popen' */+ lua_setfenv(L, -2); /* set fenv for 'popen' */ lua_pop(L, 1); /* pop 'popen' */- /* set default close function */- lua_pushcfunction(L, io_fclose);- lua_setfield(L, LUA_ENVIRONINDEX, "__close"); return 1; }
src/llex.c view
@@ -1,5 +1,5 @@ /*-** $Id: llex.c,v 2.20 2006/03/09 18:14:31 roberto Exp $+** $Id: llex.c,v 2.20.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lexical Analyzer ** See Copyright Notice in lua.h */
src/llex.h view
@@ -1,5 +1,5 @@ /*-** $Id: llex.h,v 1.58 2006/03/23 18:23:32 roberto Exp $+** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lexical Analyzer ** See Copyright Notice in lua.h */
src/llimits.h view
@@ -1,5 +1,5 @@ /*-** $Id: llimits.h,v 1.69 2005/12/27 17:12:00 roberto Exp $+** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $ ** Limits, basic types, and some other `installation-dependent' definitions ** See Copyright Notice in lua.h */
src/lmathlib.c view
@@ -1,5 +1,5 @@ /*-** $Id: lmathlib.c,v 1.67 2005/08/26 17:36:32 roberto Exp $+** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $ ** Standard mathematical library ** See Copyright Notice in lua.h */
src/lmem.c view
@@ -1,5 +1,5 @@ /*-** $Id: lmem.c,v 1.70 2005/12/26 13:35:47 roberto Exp $+** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $ ** Interface to Memory Manager ** See Copyright Notice in lua.h */
src/lmem.h view
@@ -1,5 +1,5 @@ /*-** $Id: lmem.h,v 1.31 2005/04/25 19:24:10 roberto Exp $+** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $ ** Interface to Memory Manager ** See Copyright Notice in lua.h */
src/loadlib.c view
@@ -1,5 +1,5 @@ /*-** $Id: loadlib.c,v 1.54a 2006/07/03 20:16:49 roberto Exp $+** $Id: loadlib.c,v 1.52.1.3 2008/08/06 13:29:28 roberto Exp $ ** Dynamic library loader for Lua ** See Copyright Notice in lua.h **@@ -506,8 +506,10 @@ static void setfenv (lua_State *L) { lua_Debug ar;- lua_getstack(L, 1, &ar);- lua_getinfo(L, "f", &ar);+ if (lua_getstack(L, 1, &ar) == 0 ||+ lua_getinfo(L, "f", &ar) == 0 || /* get calling function */+ lua_iscfunction(L, -1))+ luaL_error(L, LUA_QL("module") " not called from a Lua function"); lua_pushvalue(L, -2); lua_setfenv(L, -2); lua_pop(L, 1);
src/lobject.c view
@@ -1,5 +1,5 @@ /*-** $Id: lobject.c,v 2.22 2006/02/10 17:43:52 roberto Exp $+** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $ ** Some generic functions over Lua objects ** See Copyright Notice in lua.h */
src/lobject.h view
@@ -1,5 +1,5 @@ /*-** $Id: lobject.h,v 2.20 2006/01/18 11:37:34 roberto Exp $+** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $ ** Type definitions for Lua objects ** See Copyright Notice in lua.h */@@ -208,7 +208,7 @@ #define getstr(ts) cast(const char *, (ts) + 1)-#define svalue(o) getstr(tsvalue(o))+#define svalue(o) getstr(rawtsvalue(o))
src/lopcodes.c view
@@ -1,5 +1,5 @@ /*-** $Id: lopcodes.c,v 1.37 2005/11/08 19:45:36 roberto Exp $+** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $ ** See Copyright Notice in lua.h */
src/lopcodes.h view
@@ -1,5 +1,5 @@ /*-** $Id: lopcodes.h,v 1.125 2006/03/14 19:04:44 roberto Exp $+** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $ ** Opcodes for Lua virtual machine ** See Copyright Notice in lua.h */
src/loslib.c view
@@ -1,5 +1,5 @@ /*-** $Id: loslib.c,v 1.20 2006/09/19 13:57:08 roberto Exp $+** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $ ** Standard Operating System library ** See Copyright Notice in lua.h */@@ -215,7 +215,6 @@ static int os_exit (lua_State *L) { exit(luaL_optint(L, 1, EXIT_SUCCESS));- return 0; /* to avoid warnings */ } static const luaL_Reg syslib[] = {
src/lparser.c view
@@ -1,5 +1,5 @@ /*-** $Id: lparser.c,v 2.42a 2006/06/05 15:57:59 roberto Exp $+** $Id: lparser.c,v 2.42.1.3 2007/12/28 15:32:23 roberto Exp $ ** Lua Parser ** See Copyright Notice in lua.h */@@ -938,6 +938,8 @@ primaryexp(ls, &nv.v); if (nv.v.k == VLOCAL) check_conflict(ls, lh, &nv.v);+ luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls,+ "variables in assignment"); assignment(ls, &nv, nvars+1); } else { /* assignment -> `=' explist1 */
src/lparser.h view
@@ -1,5 +1,5 @@ /*-** $Id: lparser.h,v 1.57 2006/03/09 18:14:31 roberto Exp $+** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua Parser ** See Copyright Notice in lua.h */
src/lstate.c view
@@ -1,5 +1,5 @@ /*-** $Id: lstate.c,v 2.36 2006/05/24 14:15:50 roberto Exp $+** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $ ** Global State ** See Copyright Notice in lua.h */@@ -93,7 +93,7 @@ resethookcount(L); L->openupval = NULL; L->size_ci = 0;- L->nCcalls = 0;+ L->nCcalls = L->baseCcalls = 0; L->status = 0; L->base_ci = L->ci = NULL; L->savedpc = NULL;@@ -205,7 +205,7 @@ do { /* repeat until no more errors */ L->ci = L->base_ci; L->base = L->top = L->ci->base;- L->nCcalls = 0;+ L->nCcalls = L->baseCcalls = 0; } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); lua_assert(G(L)->tmudata == NULL); luai_userstateclose(L);
src/lstate.h view
@@ -1,5 +1,5 @@ /*-** $Id: lstate.h,v 2.24 2006/02/06 18:27:59 roberto Exp $+** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $ ** Global State ** See Copyright Notice in lua.h */@@ -112,6 +112,7 @@ int stacksize; int size_ci; /* size of array `base_ci' */ unsigned short nCcalls; /* number of nested C calls */+ unsigned short baseCcalls; /* nested C calls when resuming coroutine */ lu_byte hookmask; lu_byte allowhook; int basehookcount;
src/lstring.c view
@@ -1,5 +1,5 @@ /*-** $Id: lstring.c,v 2.8 2005/12/22 16:19:56 roberto Exp $+** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ ** String table (keeps all strings handled by Lua) ** See Copyright Notice in lua.h */
src/lstring.h view
@@ -1,5 +1,5 @@ /*-** $Id: lstring.h,v 1.43 2005/04/25 19:24:10 roberto Exp $+** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $ ** String table (keep all strings handled by Lua) ** See Copyright Notice in lua.h */
src/lstrlib.c view
@@ -1,5 +1,5 @@ /*-** $Id: lstrlib.c,v 1.132a 2006/04/26 20:41:19 roberto Exp $+** $Id: lstrlib.c,v 1.132.1.4 2008/07/11 17:27:21 roberto Exp $ ** Standard library for string operations and pattern-matching ** See Copyright Notice in lua.h */@@ -35,7 +35,8 @@ static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) { /* relative string position: negative means back from end */- return (pos>=0) ? pos : (ptrdiff_t)len+pos+1;+ if (pos < 0) pos += (ptrdiff_t)len + 1;+ return (pos >= 0) ? pos : 0; } @@ -629,10 +630,6 @@ lua_gettable(L, 3); break; }- default: {- luaL_argerror(L, 3, "string/function/table expected"); - return;- } } if (!lua_toboolean(L, -1)) { /* nil or false? */ lua_pop(L, 1);@@ -648,11 +645,15 @@ size_t srcl; const char *src = luaL_checklstring(L, 1, &srcl); const char *p = luaL_checkstring(L, 2);+ int tr = lua_type(L, 3); int max_s = luaL_optint(L, 4, srcl+1); int anchor = (*p == '^') ? (p++, 1) : 0; int n = 0; MatchState ms; luaL_Buffer b;+ luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||+ tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,+ "string/function/table expected"); luaL_buffinit(L, &b); ms.L = L; ms.src_init = src;
src/ltable.c view
@@ -1,5 +1,5 @@ /*-** $Id: ltable.c,v 2.32 2006/01/18 11:49:02 roberto Exp $+** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $ ** Lua tables (hash) ** See Copyright Notice in lua.h */@@ -84,8 +84,8 @@ static Node *hashnum (const Table *t, lua_Number n) { unsigned int a[numints]; int i;- n += 1; /* normalize number (avoid -0) */- lua_assert(sizeof(a) <= sizeof(n));+ if (luai_numeq(n, 0)) /* avoid problems with -0 */+ return gnode(t, 0); memcpy(a, &n, sizeof(a)); for (i = 1; i < numints; i++) a[0] += a[i]; return hashmod(t, a[0]);
src/ltable.h view
@@ -1,5 +1,5 @@ /*-** $Id: ltable.h,v 2.10 2006/01/10 13:13:06 roberto Exp $+** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua tables (hash) ** See Copyright Notice in lua.h */
src/ltablib.c view
@@ -1,5 +1,5 @@ /*-** $Id: ltablib.c,v 1.38 2005/10/23 17:38:15 roberto Exp $+** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $ ** Library for Table Manipulation ** See Copyright Notice in lua.h */@@ -118,7 +118,8 @@ static int tremove (lua_State *L) { int e = aux_getn(L, 1); int pos = luaL_optint(L, 2, e);- if (e == 0) return 0; /* table is `empty' */+ if (!(1 <= pos && pos <= e)) /* position is outside bounds? */+ return 0; /* nothing to remove */ luaL_setn(L, 1, e - 1); /* t.n = n-1 */ lua_rawgeti(L, 1, pos); /* result = t[pos] */ for ( ;pos<e; pos++) {@@ -131,6 +132,15 @@ } +static void addfield (lua_State *L, luaL_Buffer *b, int i) {+ lua_rawgeti(L, 1, i);+ if (!lua_isstring(L, -1))+ luaL_error(L, "invalid value (%s) at index %d in table for "+ LUA_QL("concat"), luaL_typename(L, -1), i);+ luaL_addvalue(b);+}++ static int tconcat (lua_State *L) { luaL_Buffer b; size_t lsep;@@ -140,13 +150,12 @@ i = luaL_optint(L, 3, 1); last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1)); luaL_buffinit(L, &b);- for (; i <= last; i++) {- lua_rawgeti(L, 1, i);- luaL_argcheck(L, lua_isstring(L, -1), 1, "table contains non-strings");- luaL_addvalue(&b);- if (i != last)- luaL_addlstring(&b, sep, lsep);+ for (; i < last; i++) {+ addfield(L, &b, i);+ luaL_addlstring(&b, sep, lsep); }+ if (i == last) /* add last value (if interval was not empty) */+ addfield(L, &b, i); luaL_pushresult(&b); return 1; }
src/ltm.c view
@@ -1,5 +1,5 @@ /*-** $Id: ltm.c,v 2.8 2006/01/10 12:50:00 roberto Exp $+** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ ** Tag methods ** See Copyright Notice in lua.h */
src/ltm.h view
@@ -1,5 +1,5 @@ /*-** $Id: ltm.h,v 2.6 2005/06/06 13:30:25 roberto Exp $+** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $ ** Tag methods ** See Copyright Notice in lua.h */
src/lua.h view
@@ -1,5 +1,5 @@ /*-** $Id: lua.h,v 1.218a 2006/06/02 15:34:00 roberto Exp $+** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $ ** Lua - An Extensible Extension Language ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) ** See Copyright Notice at the end of this file@@ -17,9 +17,9 @@ #define LUA_VERSION "Lua 5.1"-#define LUA_RELEASE "Lua 5.1.2"+#define LUA_RELEASE "Lua 5.1.4" #define LUA_VERSION_NUM 501-#define LUA_COPYRIGHT "Copyright (C) 1994-2007 Lua.org, PUC-Rio"+#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" #define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" @@ -294,7 +294,10 @@ #define lua_Chunkwriter lua_Writer +/* hack */+LUA_API void lua_setlevel (lua_State *from, lua_State *to); + /* ** {====================================================================== ** Debug API@@ -359,7 +362,7 @@ /******************************************************************************-* Copyright (C) 1994-2007 Lua.org, PUC-Rio. All rights reserved.+* Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the
src/luaconf.h view
@@ -1,5 +1,5 @@ /*-** $Id: luaconf.h,v 1.82a 2006/04/10 18:27:23 roberto Exp $+** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $ ** Configuration file for Lua ** See Copyright Notice in lua.h */@@ -440,9 +440,10 @@ @* can use. ** CHANGE it if you need lots of (Lua) stack space for your C ** functions. This limit is arbitrary; its only purpose is to stop C-** functions to consume unlimited stack space.+** functions to consume unlimited stack space. (must be smaller than+** -LUA_REGISTRYINDEX) */-#define LUAI_MAXCSTACK 2048+#define LUAI_MAXCSTACK 8000 @@ -666,7 +667,7 @@ */ #if defined(LUA_USE_POPEN) -#define lua_popen(L,c,m) ((void)L, popen(c,m))+#define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) #define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) #elif defined(LUA_WIN)
src/lualib.h view
@@ -1,5 +1,5 @@ /*-** $Id: lualib.h,v 1.36 2005/12/27 17:12:00 roberto Exp $+** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua standard libraries ** See Copyright Notice in lua.h */
src/lundump.c view
@@ -1,5 +1,5 @@ /*-** $Id: lundump.c,v 1.60 2006/02/16 15:53:49 lhf Exp $+** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $ ** load precompiled Lua chunks ** See Copyright Notice in lua.h */@@ -29,6 +29,7 @@ #ifdef LUAC_TRUST_BINARIES #define IF(c,s)+#define error(S,s) #else #define IF(c,s) if (c) error(S,s) @@ -113,7 +114,7 @@ setnilvalue(o); break; case LUA_TBOOLEAN:- setbvalue(o,LoadChar(S));+ setbvalue(o,LoadChar(S)!=0); break; case LUA_TNUMBER: setnvalue(o,LoadNumber(S));@@ -122,7 +123,7 @@ setsvalue2n(S->L,o,LoadString(S)); break; default:- IF (1, "bad constant");+ error(S,"bad constant"); break; } }@@ -159,7 +160,9 @@ static Proto* LoadFunction(LoadState* S, TString* p) {- Proto* f=luaF_newproto(S->L);+ Proto* f;+ if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep");+ f=luaF_newproto(S->L); setptvalue2s(S->L,S->L->top,f); incr_top(S->L); f->source=LoadString(S); if (f->source==NULL) f->source=p; f->linedefined=LoadInt(S);@@ -173,6 +176,7 @@ LoadDebug(S,f); IF (!luaG_checkcode(f), "bad code"); S->L->top--;+ S->L->nCcalls--; return f; }
src/lundump.h view
@@ -1,5 +1,5 @@ /*-** $Id: lundump.h,v 1.40 2005/11/11 14:03:13 lhf Exp $+** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $ ** load precompiled Lua chunks ** See Copyright Notice in lua.h */
src/lvm.c view
@@ -1,5 +1,5 @@ /*-** $Id: lvm.c,v 2.63a 2006/06/05 15:58:59 roberto Exp $+** $Id: lvm.c,v 2.63.1.3 2007/12/28 15:32:23 roberto Exp $ ** Lua virtual machine ** See Copyright Notice in lua.h */@@ -61,11 +61,9 @@ lu_byte mask = L->hookmask; const Instruction *oldpc = L->savedpc; L->savedpc = pc;- if (mask > LUA_MASKLINE) { /* instruction-hook set? */- if (L->hookcount == 0) {- resethookcount(L);- luaD_callhook(L, LUA_HOOKCOUNT, -1);- }+ if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {+ resethookcount(L);+ luaD_callhook(L, LUA_HOOKCOUNT, -1); } if (mask & LUA_MASKLINE) { Proto *p = ci_func(L->ci)->l.p;
src/lvm.h view
@@ -1,5 +1,5 @@ /*-** $Id: lvm.h,v 2.5 2005/08/22 18:54:49 roberto Exp $+** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua virtual machine ** See Copyright Notice in lua.h */
src/lzio.c view
@@ -1,5 +1,5 @@ /*-** $Id: lzio.c,v 1.31 2005/06/03 20:15:29 roberto Exp $+** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $ ** a generic input stream interface ** See Copyright Notice in lua.h */
src/lzio.h view
@@ -1,5 +1,5 @@ /*-** $Id: lzio.h,v 1.21 2005/05/17 19:49:15 roberto Exp $+** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $ ** Buffered streams ** See Copyright Notice in lua.h */
− src/print.c
@@ -1,227 +0,0 @@-/*-** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $-** print bytecodes-** See Copyright Notice in lua.h-*/--#include <ctype.h>-#include <stdio.h>--#define luac_c-#define LUA_CORE--#include "ldebug.h"-#include "lobject.h"-#include "lopcodes.h"-#include "lundump.h"--#define PrintFunction luaU_print--#define Sizeof(x) ((int)sizeof(x))-#define VOID(p) ((const void*)(p))--static void PrintString(const TString* ts)-{- const char* s=getstr(ts);- size_t i,n=ts->tsv.len;- putchar('"');- for (i=0; i<n; i++)- {- int c=s[i];- switch (c)- {- case '"': printf("\\\""); break;- case '\\': printf("\\\\"); break;- case '\a': printf("\\a"); break;- case '\b': printf("\\b"); break;- case '\f': printf("\\f"); break;- case '\n': printf("\\n"); break;- case '\r': printf("\\r"); break;- case '\t': printf("\\t"); break;- case '\v': printf("\\v"); break;- default: if (isprint((unsigned char)c))- putchar(c);- else- printf("\\%03u",(unsigned char)c);- }- }- putchar('"');-}--static void PrintConstant(const Proto* f, int i)-{- const TValue* o=&f->k[i];- switch (ttype(o))- {- case LUA_TNIL:- printf("nil");- break;- case LUA_TBOOLEAN:- printf(bvalue(o) ? "true" : "false");- break;- case LUA_TNUMBER:- printf(LUA_NUMBER_FMT,nvalue(o));- break;- case LUA_TSTRING:- PrintString(rawtsvalue(o));- break;- default: /* cannot happen */- printf("? type=%d",ttype(o));- break;- }-}--static void PrintCode(const Proto* f)-{- const Instruction* code=f->code;- int pc,n=f->sizecode;- for (pc=0; pc<n; pc++)- {- Instruction i=code[pc];- OpCode o=GET_OPCODE(i);- int a=GETARG_A(i);- int b=GETARG_B(i);- int c=GETARG_C(i);- int bx=GETARG_Bx(i);- int sbx=GETARG_sBx(i);- int line=getline(f,pc);- printf("\t%d\t",pc+1);- if (line>0) printf("[%d]\t",line); else printf("[-]\t");- printf("%-9s\t",luaP_opnames[o]);- switch (getOpMode(o))- {- case iABC:- printf("%d",a);- if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b);- if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c);- break;- case iABx:- if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx);- break;- case iAsBx:- if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx);- break;- }- switch (o)- {- case OP_LOADK:- printf("\t; "); PrintConstant(f,bx);- break;- case OP_GETUPVAL:- case OP_SETUPVAL:- printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-");- break;- case OP_GETGLOBAL:- case OP_SETGLOBAL:- printf("\t; %s",svalue(&f->k[bx]));- break;- case OP_GETTABLE:- case OP_SELF:- if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); }- break;- case OP_SETTABLE:- case OP_ADD:- case OP_SUB:- case OP_MUL:- case OP_DIV:- case OP_POW:- case OP_EQ:- case OP_LT:- case OP_LE:- if (ISK(b) || ISK(c))- {- printf("\t; ");- if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-");- printf(" ");- if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-");- }- break;- case OP_JMP:- case OP_FORLOOP:- case OP_FORPREP:- printf("\t; to %d",sbx+pc+2);- break;- case OP_CLOSURE:- printf("\t; %p",VOID(f->p[bx]));- break;- case OP_SETLIST:- if (c==0) printf("\t; %d",(int)code[++pc]);- else printf("\t; %d",c);- break;- default:- break;- }- printf("\n");- }-}--#define SS(x) (x==1)?"":"s"-#define S(x) x,SS(x)--static void PrintHeader(const Proto* f)-{- const char* s=getstr(f->source);- if (*s=='@' || *s=='=')- s++;- else if (*s==LUA_SIGNATURE[0])- s="(bstring)";- else- s="(string)";- printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n",- (f->linedefined==0)?"main":"function",s,- f->linedefined,f->lastlinedefined,- S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f));- printf("%d%s param%s, %d slot%s, %d upvalue%s, ",- f->numparams,f->is_vararg?"+":"",SS(f->numparams),- S(f->maxstacksize),S(f->nups));- printf("%d local%s, %d constant%s, %d function%s\n",- S(f->sizelocvars),S(f->sizek),S(f->sizep));-}--static void PrintConstants(const Proto* f)-{- int i,n=f->sizek;- printf("constants (%d) for %p:\n",n,VOID(f));- for (i=0; i<n; i++)- {- printf("\t%d\t",i+1);- PrintConstant(f,i);- printf("\n");- }-}--static void PrintLocals(const Proto* f)-{- int i,n=f->sizelocvars;- printf("locals (%d) for %p:\n",n,VOID(f));- for (i=0; i<n; i++)- {- printf("\t%d\t%s\t%d\t%d\n",- i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);- }-}--static void PrintUpvalues(const Proto* f)-{- int i,n=f->sizeupvalues;- printf("upvalues (%d) for %p:\n",n,VOID(f));- if (f->upvalues==NULL) return;- for (i=0; i<n; i++)- {- printf("\t%d\t%s\n",i,getstr(f->upvalues[i]));- }-}--void PrintFunction(const Proto* f, int full)-{- int i,n=f->sizep;- PrintHeader(f);- PrintCode(f);- if (full)- {- PrintConstants(f);- PrintLocals(f);- PrintUpvalues(f);- }- for (i=0; i<n; i++) PrintFunction(f->p[i],full);-}
− tests/HsLuaMain.hs
@@ -1,128 +0,0 @@- -{-# OPTIONS_GHC -fglasgow-exts #-} - -module Main where -import qualified Scripting.Lua as Lua -import Foreign.C.Types -import Foreign.Storable -import Foreign.StablePtr -import Foreign.Ptr -import Data.List -import Control.Monad - -foreign export ccall hs_lua_c_func :: Lua.LuaState -> IO CInt -foreign import ccall "&hs_lua_c_func" hs_lua_c_func_addr :: FunPtr Lua.LuaCFunction - -hs_lua_c_func l = do - putStrLn "from haskell" - return 0 - -test1 :: Int -> String -> IO Int -test1 a b = do - putStrLn ("Got " ++ show a ++ " " ++ b) - return 15 - -test2 :: IO Int -test2 = do - fail "expected error" - return 15 - - -main = do - l <- Lua.newstate - Lua.openlibs l - Lua.getglobal l "print" - Lua.pushstring l "from print" - putStrLn "NEXT: from print" - Lua.call l 1 0 - Lua.register l "kill" hs_lua_c_func_addr - Lua.getglobal l "kill" - putStrLn "NEXT: from haskell" - Lua.call l 0 0 - c <- Lua.loadstring l "print \"preparation\"; function f () print \"in lua def fun\"; end" "inline code" - putStrLn "NEXT: result 0" - putStrLn ("result " ++ show c) - putStrLn "NEXT: preparation" - Lua.call l 0 Lua.multret - Lua.getglobal l "f" - putStrLn "NEXT: in lua def fun" - Lua.call l 0 0 - Lua.getglobal l "print" - Lua.push l (42::Int) - putStrLn "NEXT: 42" - Lua.call l 1 0 - Lua.push l (42::Int) - putStrLn "NEXT: number 42" - Just (x::Int) <- Lua.peek l (-1) - putStrLn ("number " ++ show x) - putStrLn "NEXT: string 42" - Just (x::String) <- Lua.peek l (-1) - putStrLn ("string " ++ x) - Lua.pop l 1 - - putStrLn "NEXT: " - Lua.callproc l "print" - putStrLn "NEXT: arg1" - Lua.callproc l "print" "arg1" - putStrLn "NEXT: arg1 arg2" - Lua.callproc l "print" "arg1" "arg2" - - putStrLn $ "NEXT: " ++ show (sin 2) - Lua.getglobal l "math" - Lua.getfield l (-1) "sin" - Lua.gettop l >>= \n -> Lua.remove l (n-1) - Lua.push l (2.0::Double) - Lua.call l 1 1 - Just (x::Double) <- Lua.peek l (-1) - print x - Lua.pop l 1 - - putStrLn $ "NEXT: " ++ show (sin 3) - Lua.getglobal2 l "math.sin" - Lua.push l (3.0::Double) - Lua.call l 1 1 - Just (x::Double) <- Lua.peek l (-1) - print x - Lua.pop l 1 - - putStrLn $ "NEXT: " ++ show (sin 1) - (x::Double) <- Lua.callfunc l "math.sin" (1.0::Double) - print x - - putStrLn $ "NEXT: " ++ show (sin 5) - (x::Double) <- Lua.callfunc l "math.sin" (5.0::Double) (6.0::Double) (7.0::Double) - print x - - v <- Lua.newcfunction test1 - Lua.push l v - Lua.setglobal l "test1" - - putStrLn "NEXT: Got 1 test1" - Lua.callproc l "test1" (1.0::Double) "test1" - - Lua.freecfunction v - - Lua.pushhsfunction l test1 - Lua.setglobal l "test2" - - putStrLn "NEXT: Got 2 test2 ex" - (m :: Int) <- Lua.callfunc l "test2" (2.0::Double) "test2 ex" - putStrLn "NEXT: 15" - print m - - putStrLn "NEXT: Error ignored" - Lua.callproc l "math.sin" "notanumber" `catch` (\e -> putStrLn ("Error caught " ++ show e)) - - putStrLn "NEXT: Error ignored 2" - Lua.callproc l "test2" "notanumber" "notanumber" `catch` (\e -> putStrLn ("Error caught 2 " ++ show e)) - - Lua.pushhsfunction l test2 - Lua.setglobal l "testexception" - putStrLn "NEXT: user error (user error (expected error))" - Lua.callproc l "testexception" `catch` (\e -> print e) - - putStrLn "NEXT: 0" - k <- Lua.gettop l - print k - Lua.close l -