packages feed

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 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
-