History

Lua 5.1-work3

Lua Team committed 21 years ago

Commit ec3e02b1 parent cdf85b646 files · +1107 −738Browse files

Unified · Split

46 files
  1. INSTALL +1 −1
  2. MANIFEST +114 −113
  3. Makefile +2 −25
  4. README +3 −2
  5. config +3 −3
  6. etc/all.c +0 −1
  7. etc/lua.hpp +8 −0
  8. etc/min.c +1 −0
  9. include/lauxlib.h +14 −8
  10. include/lua.h +26 −20
  11. include/luaconf.h +77 −33
  12. src/lapi.c +52 −42
  13. src/lcode.c +50 −27
  14. src/lcode.h +2 −1
  15. src/ldebug.c +15 −8
  16. src/ldo.c +5 −7
  17. src/ldump.c +6 −3
  18. src/lfunc.c +4 −4
  19. src/lgc.c +25 −25
  20. src/lib/lauxlib.c +68 −10
  21. src/lib/lbaselib.c +13 −63
  22. src/lib/ldblib.c +5 −4
  23. src/lib/loadlib.c +319 −78
  24. src/lib/loslib.c +4 −4
  25. src/lib/lstrlib.c +24 −26
  26. src/llex.c +41 −35
  27. src/llex.h +7 −3
  28. src/llimits.h +6 −17
  29. src/lmem.c +14 −11
  30. src/lmem.h +22 −16
  31. src/lobject.c +16 −7
  32. src/lobject.h +15 −7
  33. src/lopcodes.c +5 −6
  34. src/lopcodes.h +10 −8
  35. src/lparser.c +16 −19
  36. src/lstate.c +6 −4
  37. src/lstate.h +3 −1
  38. src/lstring.c +9 −4
  39. src/lstring.h +3 −4
  40. src/ltable.c +45 −40
  41. src/ltable.h +4 −1
  42. src/lua/lua.c +4 −4
  43. src/luac/print.c +8 −5
  44. src/lundump.c +10 −11
  45. src/lundump.h +5 −7
  46. src/lvm.c +17 −20
INSTALL+1−1
@@ -32,7 +32,7 @@ This is Lua 5.1 (work). · 31 unmodified lines
32 32
33* If you have problems (and solutions!)33* If you have problems (and solutions!)
34 -------------------------------------34 -------------------------------------
35 If "make" fails, please let us know (lua@tecgraf.puc-rio.br).35 If "make" fails, please let us know.
36 If you make changes to "config" or to the Makefiles, please send them to us.36 If you make changes to "config" or to the Makefiles, please send them to us.
37 37
38* Shared libraries38* Shared libraries
MANIFEST+114−113
@@ -1,114 +1,115 @@
1MANIFEST contents of Lua 5.1 (work2) distribution on Mon Sep 20 21:28:06 BRT 20041MANIFEST contents of Lua 5.1 (work3) distribution on Mon Dec 6 23:00:22 BRST 2004
2lua-5.1-work22lua-5.1-work3
3lua-5.1-work2/COPYRIGHT3lua-5.1-work3/COPYRIGHT
4lua-5.1-work2/HISTORY4lua-5.1-work3/HISTORY
5lua-5.1-work2/INSTALL5lua-5.1-work3/INSTALL
6lua-5.1-work2/MANIFEST6lua-5.1-work3/MANIFEST
7lua-5.1-work2/Makefile7lua-5.1-work3/Makefile
8lua-5.1-work2/README8lua-5.1-work3/README
9lua-5.1-work2/bin9lua-5.1-work3/bin
10lua-5.1-work2/build10lua-5.1-work3/build
11lua-5.1-work2/config11lua-5.1-work3/config
12lua-5.1-work2/etc12lua-5.1-work3/etc
13lua-5.1-work2/etc/Makefile13lua-5.1-work3/etc/Makefile
14lua-5.1-work2/etc/README14lua-5.1-work3/etc/README
15lua-5.1-work2/etc/all.c15lua-5.1-work3/etc/all.c
16lua-5.1-work2/etc/lua.ico16lua-5.1-work3/etc/lua.hpp
17lua-5.1-work2/etc/min.c17lua-5.1-work3/etc/lua.ico
18lua-5.1-work2/etc/noparser.c18lua-5.1-work3/etc/min.c
19lua-5.1-work2/etc/saconfig.c19lua-5.1-work3/etc/noparser.c
20lua-5.1-work2/include20lua-5.1-work3/etc/saconfig.c
21lua-5.1-work2/include/Makefile21lua-5.1-work3/include
22lua-5.1-work2/include/lauxlib.h22lua-5.1-work3/include/Makefile
23lua-5.1-work2/include/lua.h23lua-5.1-work3/include/lauxlib.h
24lua-5.1-work2/include/luaconf.h24lua-5.1-work3/include/lua.h
25lua-5.1-work2/include/lualib.h25lua-5.1-work3/include/luaconf.h
26lua-5.1-work2/lib26lua-5.1-work3/include/lualib.h
27lua-5.1-work2/src27lua-5.1-work3/lib
28lua-5.1-work2/src/Makefile28lua-5.1-work3/src
29lua-5.1-work2/src/README29lua-5.1-work3/src/Makefile
30lua-5.1-work2/src/lapi.c30lua-5.1-work3/src/README
31lua-5.1-work2/src/lapi.h31lua-5.1-work3/src/lapi.c
32lua-5.1-work2/src/lcode.c32lua-5.1-work3/src/lapi.h
33lua-5.1-work2/src/lcode.h33lua-5.1-work3/src/lcode.c
34lua-5.1-work2/src/ldebug.c34lua-5.1-work3/src/lcode.h
35lua-5.1-work2/src/ldebug.h35lua-5.1-work3/src/ldebug.c
36lua-5.1-work2/src/ldo.c36lua-5.1-work3/src/ldebug.h
37lua-5.1-work2/src/ldo.h37lua-5.1-work3/src/ldo.c
38lua-5.1-work2/src/ldump.c38lua-5.1-work3/src/ldo.h
39lua-5.1-work2/src/lfunc.c39lua-5.1-work3/src/ldump.c
40lua-5.1-work2/src/lfunc.h40lua-5.1-work3/src/lfunc.c
41lua-5.1-work2/src/lgc.c41lua-5.1-work3/src/lfunc.h
42lua-5.1-work2/src/lgc.h42lua-5.1-work3/src/lgc.c
43lua-5.1-work2/src/lib43lua-5.1-work3/src/lgc.h
44lua-5.1-work2/src/lib/Makefile44lua-5.1-work3/src/lib
45lua-5.1-work2/src/lib/README45lua-5.1-work3/src/lib/Makefile
46lua-5.1-work2/src/lib/lauxlib.c46lua-5.1-work3/src/lib/README
47lua-5.1-work2/src/lib/lbaselib.c47lua-5.1-work3/src/lib/lauxlib.c
48lua-5.1-work2/src/lib/ldblib.c48lua-5.1-work3/src/lib/lbaselib.c
49lua-5.1-work2/src/lib/linit.c49lua-5.1-work3/src/lib/ldblib.c
50lua-5.1-work2/src/lib/liolib.c50lua-5.1-work3/src/lib/linit.c
51lua-5.1-work2/src/lib/lmathlib.c51lua-5.1-work3/src/lib/liolib.c
52lua-5.1-work2/src/lib/loadlib.c52lua-5.1-work3/src/lib/lmathlib.c
53lua-5.1-work2/src/lib/loslib.c53lua-5.1-work3/src/lib/loadlib.c
54lua-5.1-work2/src/lib/lstrlib.c54lua-5.1-work3/src/lib/loslib.c
55lua-5.1-work2/src/lib/ltablib.c55lua-5.1-work3/src/lib/lstrlib.c
56lua-5.1-work2/src/llex.c56lua-5.1-work3/src/lib/ltablib.c
57lua-5.1-work2/src/llex.h57lua-5.1-work3/src/llex.c
58lua-5.1-work2/src/llimits.h58lua-5.1-work3/src/llex.h
59lua-5.1-work2/src/lmem.c59lua-5.1-work3/src/llimits.h
60lua-5.1-work2/src/lmem.h60lua-5.1-work3/src/lmem.c
61lua-5.1-work2/src/lobject.c61lua-5.1-work3/src/lmem.h
62lua-5.1-work2/src/lobject.h62lua-5.1-work3/src/lobject.c
63lua-5.1-work2/src/lopcodes.c63lua-5.1-work3/src/lobject.h
64lua-5.1-work2/src/lopcodes.h64lua-5.1-work3/src/lopcodes.c
65lua-5.1-work2/src/lparser.c65lua-5.1-work3/src/lopcodes.h
66lua-5.1-work2/src/lparser.h66lua-5.1-work3/src/lparser.c
67lua-5.1-work2/src/lstate.c67lua-5.1-work3/src/lparser.h
68lua-5.1-work2/src/lstate.h68lua-5.1-work3/src/lstate.c
69lua-5.1-work2/src/lstring.c69lua-5.1-work3/src/lstate.h
70lua-5.1-work2/src/lstring.h70lua-5.1-work3/src/lstring.c
71lua-5.1-work2/src/ltable.c71lua-5.1-work3/src/lstring.h
72lua-5.1-work2/src/ltable.h72lua-5.1-work3/src/ltable.c
73lua-5.1-work2/src/ltm.c73lua-5.1-work3/src/ltable.h
74lua-5.1-work2/src/ltm.h74lua-5.1-work3/src/ltm.c
75lua-5.1-work2/src/lua75lua-5.1-work3/src/ltm.h
76lua-5.1-work2/src/lua/Makefile76lua-5.1-work3/src/lua
77lua-5.1-work2/src/lua/README77lua-5.1-work3/src/lua/Makefile
78lua-5.1-work2/src/lua/lua.c78lua-5.1-work3/src/lua/README
79lua-5.1-work2/src/luac79lua-5.1-work3/src/lua/lua.c
80lua-5.1-work2/src/luac/Makefile80lua-5.1-work3/src/luac
81lua-5.1-work2/src/luac/README81lua-5.1-work3/src/luac/Makefile
82lua-5.1-work2/src/luac/luac.c82lua-5.1-work3/src/luac/README
83lua-5.1-work2/src/luac/print.c83lua-5.1-work3/src/luac/luac.c
84lua-5.1-work2/src/lundump.c84lua-5.1-work3/src/luac/print.c
85lua-5.1-work2/src/lundump.h85lua-5.1-work3/src/lundump.c
86lua-5.1-work2/src/lvm.c86lua-5.1-work3/src/lundump.h
87lua-5.1-work2/src/lvm.h87lua-5.1-work3/src/lvm.c
88lua-5.1-work2/src/lzio.c88lua-5.1-work3/src/lvm.h
89lua-5.1-work2/src/lzio.h89lua-5.1-work3/src/lzio.c
90lua-5.1-work2/test90lua-5.1-work3/src/lzio.h
91lua-5.1-work2/test/README91lua-5.1-work3/test
92lua-5.1-work2/test/bisect.lua92lua-5.1-work3/test/README
93lua-5.1-work2/test/cf.lua93lua-5.1-work3/test/bisect.lua
94lua-5.1-work2/test/echo.lua94lua-5.1-work3/test/cf.lua
95lua-5.1-work2/test/env.lua95lua-5.1-work3/test/echo.lua
96lua-5.1-work2/test/factorial.lua96lua-5.1-work3/test/env.lua
97lua-5.1-work2/test/fib.lua97lua-5.1-work3/test/factorial.lua
98lua-5.1-work2/test/fibfor.lua98lua-5.1-work3/test/fib.lua
99lua-5.1-work2/test/globals.lua99lua-5.1-work3/test/fibfor.lua
100lua-5.1-work2/test/hello.lua100lua-5.1-work3/test/globals.lua
101lua-5.1-work2/test/life.lua101lua-5.1-work3/test/hello.lua
102lua-5.1-work2/test/lua102lua-5.1-work3/test/life.lua
103lua-5.1-work2/test/luac103lua-5.1-work3/test/lua
104lua-5.1-work2/test/luac.lua104lua-5.1-work3/test/luac
105lua-5.1-work2/test/printf.lua105lua-5.1-work3/test/luac.lua
106lua-5.1-work2/test/readonly.lua106lua-5.1-work3/test/printf.lua
107lua-5.1-work2/test/sieve.lua107lua-5.1-work3/test/readonly.lua
108lua-5.1-work2/test/sort.lua108lua-5.1-work3/test/sieve.lua
109lua-5.1-work2/test/table.lua109lua-5.1-work3/test/sort.lua
110lua-5.1-work2/test/trace-calls.lua110lua-5.1-work3/test/table.lua
111lua-5.1-work2/test/trace-globals.lua111lua-5.1-work3/test/trace-calls.lua
112lua-5.1-work2/test/undefined.lua112lua-5.1-work3/test/trace-globals.lua
113lua-5.1-work2/test/xd.lua113lua-5.1-work3/test/undefined.lua
114lua-5.1-work3/test/xd.lua
114END OF MANIFEST115END OF MANIFEST
Makefile+2−25
@@ -14,8 +14,6 @@ all clean co klean: · 13 unmodified lines
14 cd src/luac; $(MAKE) $@14 cd src/luac; $(MAKE) $@
15 cd src/lua; $(MAKE) $@15 cd src/lua; $(MAKE) $@
16 16
17clean klean: soclean
18
19# in case they were not created during unpacking17# in case they were not created during unpacking
20all: bin lib18all: bin lib
21 19
@@ -38,27 +36,6 @@ install: all strip · 16 unmodified lines
38 $(INSTALL_DATA) lib/*.a $(INSTALL_LIB)36 $(INSTALL_DATA) lib/*.a $(INSTALL_LIB)
39 $(INSTALL_DATA) doc/*.1 $(INSTALL_MAN)37 $(INSTALL_DATA) doc/*.1 $(INSTALL_MAN)
40 38
41# shared libraries (for Linux)
42so:
43 ld -o lib/liblua.so.$V -shared src/*.o
44 ld -o lib/liblualib.so.$V -shared src/lib/*.o
45 cd lib; ln -fs liblua.so.$V liblua.so; ln -fs liblualib.so.$V liblualib.so
46
47# binaries using shared libraries
48sobin:
49 rm -f bin/lua*
50 cd src/lua; $(MAKE)
51 cd src/luac; $(MAKE)
52
53# install shared libraries
54soinstall:
55 $(INSTALL_EXEC) lib/*.so.* $(INSTALL_LIB)
56 cd $(INSTALL_LIB); ln -fs liblua.so.$V liblua.so; ln -fs liblualib.so.$V liblualib.so
57
58# clean shared libraries
59soclean:
60 rm -f lib/*.so* bin/lua*
61
62# echo config parameters39# echo config parameters
63echo:40echo:
64 @echo ""41 @echo ""
@@ -98,7 +75,7 @@ lecho: · 33 unmodified lines
98 @make echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/'75 @make echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/'
99 @echo "-- EOF"76 @echo "-- EOF"
100 77
101# (end of Makefile)
102
103newer:78newer:
104 @find . -newer MANIFEST -type f79 @find . -newer MANIFEST -type f
80
81# (end of Makefile)
README+3−2
@@ -29,9 +29,10 @@ See HISTORY for a summary of changes since the last released version. · 28 unmodified lines
29 29
30* Contacting the authors30* Contacting the authors
31 ----------------------31 ----------------------
32 Send your comments, questions, and bug reports to lua@tecgraf.puc-rio.br.32 Send your comments, questions, and bug reports to
33 lua-team AT tecgraf.puc-rio.br.
33 For more information about the authors, see http://www.lua.org/authors.html .34 For more information about the authors, see http://www.lua.org/authors.html .
34 For reporting bugs, try also the mailing list: lua-l@tecgraf.puc-rio.br.35 For reporting bugs, try also the mailing list: lua@bazar2.conectiva.com.br .
35 For more information about this list, including instructions on how to36 For more information about this list, including instructions on how to
36 subscribe and access the archives, see http://www.lua.org/lua-l.html .37 subscribe and access the archives, see http://www.lua.org/lua-l.html .
37 38
config+3−3
@@ -21,15 +21,15 @@ USERCONF= · 20 unmodified lines
21# interface (e.g., Linux, Solaris, IRIX, BSD, AIX, HPUX, and probably others),21# interface (e.g., Linux, Solaris, IRIX, BSD, AIX, HPUX, and probably others),
22# uncomment the next two lines. Also read the next paragraph.22# uncomment the next two lines. Also read the next paragraph.
23#23#
24#LOADLIB= -DUSE_DLOPEN=124LOADLIB= -DUSE_DLOPEN=1
25#DLLIB= -ldl25DLLIB= -ldl
26#26#
27# In Linux with gcc, you should also uncomment the next definition for27# In Linux with gcc, you should also uncomment the next definition for
28# MYLDFLAGS, which passes -E (= -export-dynamic) to the linker. This option28# MYLDFLAGS, which passes -E (= -export-dynamic) to the linker. This option
29# allows dynamic libraries to link back to the `lua' program, so that they do29# allows dynamic libraries to link back to the `lua' program, so that they do
30# not need the Lua libraries. (Other systems may have an equivalent facility.)30# not need the Lua libraries. (Other systems may have an equivalent facility.)
31#31#
32#MYLDFLAGS= -Wl,-E32MYLDFLAGS= -Wl,-E
33#33#
34# On Windows systems. support for dynamic loading is enabled by default.34# On Windows systems. support for dynamic loading is enabled by default.
35# To disable this support, uncomment the next line.35# To disable this support, uncomment the next line.
etc/all.c+0−1
@@ -33,7 +33,6 @@ · 32 unmodified lines
33#include "linit.c"33#include "linit.c"
34#include "lmathlib.c"34#include "lmathlib.c"
35#include "loadlib.c"35#include "loadlib.c"
36#define pushresult pushresult2
37#include "loslib.c"36#include "loslib.c"
38#include "lstrlib.c"37#include "lstrlib.c"
39#include "ltablib.c"38#include "ltablib.c"
etc/lua.hpp+8−0
@@ -0,0 +1,8 @@
1// lua.hpp
2// Lua header files for C++
3
4extern "C" {
5#include "lua.h"
6#include "lualib.h"
7#include "lauxlib.h"
8}
etc/min.c+1−0
@@ -43,5 +43,6 @@ int main(void) · 42 unmodified lines
43 lua_register(L,"print",print);43 lua_register(L,"print",print);
44 if (lua_load(L,getF,stdin,"=stdin") || lua_pcall(L,0,0,0))44 if (lua_load(L,getF,stdin,"=stdin") || lua_pcall(L,0,0,0))
45 fprintf(stderr,"%s\n",lua_tostring(L,-1));45 fprintf(stderr,"%s\n",lua_tostring(L,-1));
46 lua_close(L);
46 return 0;47 return 0;
47}48}
include/lauxlib.h+14−8
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lauxlib.h,v 1.70 2004/07/09 18:23:17 roberto Exp $2** $Id: lauxlib.h,v 1.73 2004/10/18 12:51:44 roberto Exp $
3** Auxiliary functions for building Lua libraries3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -70,6 +70,12 @@ LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t sz, · 64 unmodified lines
70LUALIB_API lua_State *(luaL_newstate) (void);70LUALIB_API lua_State *(luaL_newstate) (void);
71 71
72 72
73LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,
74 const char *r);
75LUALIB_API const char *luaL_getfield (lua_State *L, int idx, const char *fname);
76LUALIB_API const char *luaL_setfield (lua_State *L, int idx, const char *fname);
77
78
73 79
74/*80/*
75** ===============================================================81** ===============================================================
@@ -78,15 +84,15 @@ LUALIB_API lua_State *(luaL_newstate) (void); · 2 unmodified lines
78*/84*/
79 85
80#define luaL_argcheck(L, cond,numarg,extramsg) \86#define luaL_argcheck(L, cond,numarg,extramsg) \
81 ((void)((cond) || luaL_argerror(L, numarg,extramsg)))87 ((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
82#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))88#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
83#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))89#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
84#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, n))90#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n)))
85#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, n,d))91#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d)))
86#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, n))92#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n)))
87#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, n,d))93#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d)))
88 94
89#define luaL_typename(L,i) lua_typename(L,lua_type(L,(i)))95#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i)))
90 96
91/*97/*
92** {======================================================98** {======================================================
@@ -131,7 +137,7 @@ LUALIB_API void luaL_pushresult (luaL_Buffer *B); · 38 unmodified lines
131 137
132#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref))138#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref))
133 139
134#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, ref)140#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref))
135 141
136 142
137#endif143#endif
include/lua.h+26−20
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lua.h,v 1.193 2004/09/15 20:39:42 roberto Exp $2** $Id: lua.h,v 1.196 2004/12/06 17:53:42 roberto Exp $
3** Lua - An Extensible Extension Language3** Lua - An Extensible Extension Language
4** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil4** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil
5** http://www.lua.org mailto:info@lua.org5** http://www.lua.org mailto:info@lua.org
@@ -17,7 +17,7 @@ · 11 unmodified lines
17#include "luaconf.h"17#include "luaconf.h"
18 18
19 19
20#define LUA_VERSION "Lua 5.1 (work2)"20#define LUA_VERSION "Lua 5.1 (work3)"
21#define LUA_COPYRIGHT "Copyright (C) 1994-2004 Tecgraf, PUC-Rio"21#define LUA_COPYRIGHT "Copyright (C) 1994-2004 Tecgraf, PUC-Rio"
22#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"22#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
23 23
@@ -81,6 +81,10 @@ typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); · 57 unmodified lines
81#define LUA_TTHREAD 881#define LUA_TTHREAD 8
82 82
83 83
84/* first index for arrays */
85#define LUA_FIRSTINDEX 1
86
87
84/* minimum Lua stack available to a C function */88/* minimum Lua stack available to a C function */
85#define LUA_MINSTACK 2089#define LUA_MINSTACK 20
86 90
@@ -216,11 +220,13 @@ LUA_API int lua_threadstatus (lua_State *L); · 129 unmodified lines
216** garbage-collection function and options220** garbage-collection function and options
217*/221*/
218 222
219#define LUA_GCSTOP 0223#define LUA_GCSTOP 0
220#define LUA_GCRESTART 1224#define LUA_GCRESTART 1
221#define LUA_GCCOLLECT 2225#define LUA_GCCOLLECT 2
222#define LUA_GCCOUNT 3226#define LUA_GCCOUNT 3
223#define LUA_GCSTEP 4227#define LUA_GCSTEP 4
228#define LUA_GCSETSTEPMUL 5
229#define LUA_GCSETINCMODE 6
224 230
225LUA_API int lua_gc (lua_State *L, int what, int data);231LUA_API int lua_gc (lua_State *L, int what, int data);
226 232
@@ -251,26 +257,26 @@ LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud); · 24 unmodified lines
251 257
252#define lua_newtable(L) lua_createtable(L, 0, 0)258#define lua_newtable(L) lua_createtable(L, 0, 0)
253 259
254#define lua_register(L,n,f) (lua_pushcfunction(L,f), lua_setglobal(L,n))260#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
255 261
256#define lua_pushcfunction(L,f) lua_pushcclosure(L, f, 0)262#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
257 263
258#define lua_strlen(L,i) lua_objsize(L,i)264#define lua_strlen(L,i) lua_objsize(L, (i))
259 265
260#define lua_isfunction(L,n) (lua_type(L,n) == LUA_TFUNCTION)266#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION)
261#define lua_istable(L,n) (lua_type(L,n) == LUA_TTABLE)267#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE)
262#define lua_islightuserdata(L,n) (lua_type(L,n) == LUA_TLIGHTUSERDATA)268#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA)
263#define lua_isnil(L,n) (lua_type(L,n) == LUA_TNIL)269#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL)
264#define lua_isboolean(L,n) (lua_type(L,n) == LUA_TBOOLEAN)270#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN)
265#define lua_isthread(L,n) (lua_type(L,n) == LUA_TTHREAD)271#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD)
266#define lua_isnone(L,n) (lua_type(L,n) == LUA_TNONE)272#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE)
267#define lua_isnoneornil(L, n) (lua_type(L,n) <= 0)273#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0)
268 274
269#define lua_pushliteral(L, s) \275#define lua_pushliteral(L, s) \
270 lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)276 lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1)
271 277
272#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, s)278#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s))
273#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)279#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s))
274 280
275 281
276 282
include/luaconf.h+77−33
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: luaconf.h,v 1.12 2004/09/10 17:30:46 roberto Exp $2** $Id: luaconf.h,v 1.20 2004/12/06 17:53:42 roberto Exp $
3** Configuration file for Lua3** Configuration file for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -31,7 +31,11 @@ · 25 unmodified lines
31*/31*/
32 32
33/* default path */33/* default path */
34#define LUA_PATH_DEFAULT "?;?.lua"34#define LUA_PATH_DEFAULT \
35 "./?.lua;/usr/local/share/lua/5.0/?.lua;/usr/local/share/lua/5.0/?/init.lua"
36#define LUA_CPATH_DEFAULT \
37 "./?.so;/usr/local/lib/lua/5.0/?.so;/usr/local/lib/lua/5.0/lib?.so"
38
35 39
36 40
37/* type of numbers in Lua */41/* type of numbers in Lua */
@@ -42,8 +46,11 @@ · 4 unmodified lines
42#define LUA_NUMBER_FMT "%.14g"46#define LUA_NUMBER_FMT "%.14g"
43 47
44 48
45/* type for integer functions */49/*
46#define LUA_INTEGER long50** type for integer functions
51** on most machines, `ptrdiff_t' gives a reasonable size for integers
52*/
53#define LUA_INTEGER ptrdiff_t
47 54
48 55
49/* mark for all API functions */56/* mark for all API functions */
@@ -56,9 +63,6 @@ · 6 unmodified lines
56#define LUAL_BUFFERSIZE BUFSIZ63#define LUAL_BUFFERSIZE BUFSIZ
57 64
58 65
59/* first index for arrays */
60#define LUA_FIRSTINDEX 1
61
62/* assertions in Lua (mainly for internal debugging) */66/* assertions in Lua (mainly for internal debugging) */
63#define lua_assert(c) ((void)0)67#define lua_assert(c) ((void)0)
64 68
@@ -123,19 +127,45 @@ · 58 unmodified lines
123#ifdef LUA_CORE127#ifdef LUA_CORE
124 128
125/* LUA-C API assertions */129/* LUA-C API assertions */
126#define api_check(L, o) lua_assert(o)130#define api_check(L,o) lua_assert(o)
127 131
128 132
129/* an unsigned integer with at least 32 bits */133/* number of bits in an `int' */
130#define LUA_UINT32 unsigned long134/* avoid overflows in comparison */
135#if INT_MAX-20 < 32760
136#define LUA_BITSINT 16
137#elif INT_MAX > 2147483640L
138/* `int' has at least 32 bits */
139#define LUA_BITSINT 32
140#else
141#error "you must define LUA_BITSINT with number of bits in an integer"
142#endif
143
131 144
132/* a signed integer with at least 32 bits */145/*
146** L_UINT32: unsigned integer with at least 32 bits
147** L_INT32: signed integer with at least 32 bits
148** LU_MEM: an unsigned integer big enough to count the total memory used by Lua
149** L_MEM: a signed integer big enough to count the total memory used by Lua
150*/
151#if LUA_BITSINT >= 32
152#define LUA_UINT32 unsigned int
153#define LUA_INT32 int
154#define LUA_MAXINT32 INT_MAX
155#define LU_MEM size_t
156#define L_MEM ptrdiff_t
157#else
158/* 16-bit ints */
159#define LUA_UINT32 unsigned long
133#define LUA_INT32 long160#define LUA_INT32 long
134#define LUA_MAXINT32 LONG_MAX161#define LUA_MAXINT32 LONG_MAX
162#define LU_MEM LUA_UINT32
163#define L_MEM ptrdiff_t
164#endif
135 165
136 166
137/* maximum depth for calls (unsigned short) */167/* maximum depth for calls (unsigned short) */
138#define LUA_MAXCALLS 4096168#define LUA_MAXCALLS 10000
139 169
140/*170/*
141** maximum depth for C calls (unsigned short): Not too big, or may171** maximum depth for C calls (unsigned short): Not too big, or may
@@ -160,7 +190,7 @@ · 18 unmodified lines
160 190
161 191
162/* maximum number of upvalues per function */192/* maximum number of upvalues per function */
163#define MAXUPVALUES 32 /* <MAXSTACK */193#define MAXUPVALUES 60 /* <MAXSTACK */
164 194
165 195
166/* maximum size of expressions for optimizing `while' code */196/* maximum size of expressions for optimizing `while' code */
@@ -170,7 +200,7 @@ · 3 unmodified lines
170/* function to convert a lua_Number to int (with any rounding method) */200/* function to convert a lua_Number to int (with any rounding method) */
171#if defined(__GNUC__) && defined(__i386)201#if defined(__GNUC__) && defined(__i386)
172#define lua_number2int(i,d) __asm__ ("fistpl %0":"=m"(i):"t"(d):"st")202#define lua_number2int(i,d) __asm__ ("fistpl %0":"=m"(i):"t"(d):"st")
173#elif 0203#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199900L)
174/* on machines compliant with C99, you can try `lrint' */204/* on machines compliant with C99, you can try `lrint' */
175#include <math.h>205#include <math.h>
176#define lua_number2int(i,d) ((i)=lrint(d))206#define lua_number2int(i,d) ((i)=lrint(d))
@@ -179,7 +209,7 @@ · 2 unmodified lines
179#endif209#endif
180 210
181/* function to convert a lua_Number to lua_Integer (with any rounding method) */211/* function to convert a lua_Number to lua_Integer (with any rounding method) */
182#define lua_number2integer(i,n) lua_number2int(i,n)212#define lua_number2integer(i,n) lua_number2int((i), (n))
183 213
184 214
185/* function to convert a lua_Number to a string */215/* function to convert a lua_Number to a string */
@@ -195,17 +225,6 @@ · 9 unmodified lines
195#define LUA_UACNUMBER double225#define LUA_UACNUMBER double
196 226
197 227
198/* number of bits in an `int' */
199/* avoid overflows in comparison */
200#if INT_MAX-20 < 32760
201#define LUA_BITSINT 16
202#elif INT_MAX > 2147483640L
203/* machine has at least 32 bits */
204#define LUA_BITSINT 32
205#else
206#error "you must define LUA_BITSINT with number of bits in an integer"
207#endif
208
209 228
210/* type to ensure maximum alignment */229/* type to ensure maximum alignment */
211#define LUSER_ALIGNMENT_T union { double u; void *s; long l; }230#define LUSER_ALIGNMENT_T union { double u; void *s; long l; }
@@ -215,14 +234,14 @@ · 3 unmodified lines
215#ifndef __cplusplus234#ifndef __cplusplus
216/* default handling with long jumps */235/* default handling with long jumps */
217#include <setjmp.h>236#include <setjmp.h>
218#define L_THROW(c) longjmp((c)->b, 1)237#define L_THROW(L,c) longjmp((c)->b, 1)
219#define L_TRY(c,a) if (setjmp((c)->b) == 0) { a }238#define L_TRY(L,c,a) if (setjmp((c)->b) == 0) { a }
220#define l_jmpbuf jmp_buf239#define l_jmpbuf jmp_buf
221 240
222#else241#else
223/* C++ exceptions */242/* C++ exceptions */
224#define L_THROW(c) throw(c)243#define L_THROW(L,c) throw(c)
225#define L_TRY(c,a) try { a } catch(...) \244#define L_TRY(L,c,a) try { a } catch(...) \
226 { if ((c)->status == 0) (c)->status = -1; }245 { if ((c)->status == 0) (c)->status = -1; }
227#define l_jmpbuf int /* dummy variable */246#define l_jmpbuf int /* dummy variable */
228#endif247#endif
@@ -251,9 +270,12 @@ · 22 unmodified lines
251 270
252 271
253/* allows user-specific initialization on new threads */272/* allows user-specific initialization on new threads */
254#define lua_userstateopen(l) /* empty */273#define lua_userstateopen(L) /* empty */
255 274
256 275
276/* initial GC parameters */
277#define STEPMUL 4
278
257#endif279#endif
258 280
259/* }====================================================== */281/* }====================================================== */
@@ -272,8 +294,19 @@ · 12 unmodified lines
272 294
273/* `assert' options */295/* `assert' options */
274 296
275/* environment variable that holds the search path for packages */297/* environment variables that hold the search path for packages */
276#define LUA_PATH "LUA_PATH"298#define LUA_PATH "LUA_PATH"
299#define LUA_CPATH "LUA_CPATH"
300
301/* prefix for open functions in C libraries */
302#if defined(__APPLE__) && defined(__MACH__)
303#define LUA_POF "_luaopen_"
304#else
305#define LUA_POF "luaopen_"
306#endif
307
308/* directory separator (for submodules) */
309#define LUA_DIRSEP "/"
277 310
278/* separator of templates in a path */311/* separator of templates in a path */
279#define LUA_PATH_SEP ';'312#define LUA_PATH_SEP ';'
@@ -288,7 +321,7 @@ · 8 unmodified lines
288 321
289/*322/*
290** by default, gcc does not get `tmpname'323** by default, gcc does not get `tmpname'
291*/ 324*/
292#ifdef __GNUC__325#ifdef __GNUC__
293#define USE_TMPNAME 0326#define USE_TMPNAME 0
294#else327#else
@@ -296,6 +329,17 @@ · 1 unmodified line
296#endif329#endif
297 330
298 331
332/*
333** Configuration for loadlib
334*/
335#if defined(__linux) || defined(sun) || defined(sgi) || defined(BSD)
336#define USE_DLOPEN
337#elif defined(_WIN32)
338#define USE_DLL
339#elif defined(__APPLE__) && defined(__MACH__)
340#define USE_DYLD
341#endif
342
299 343
300#endif344#endif
301 345
src/lapi.c+52−42
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lapi.c,v 2.19 2004/09/15 20:39:42 roberto Exp $2** $Id: lapi.c,v 2.22 2004/12/06 17:53:42 roberto Exp $
3** Lua API3** Lua API
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -45,7 +45,7 @@ const char lua_ident[] = · 39 unmodified lines
45 45
46 46
47 47
48static TValue *luaA_index (lua_State *L, int idx) {48static TValue *index2adr (lua_State *L, int idx) {
49 if (idx > 0) {49 if (idx > 0) {
50 TValue *o = L->base + (idx - 1);50 TValue *o = L->base + (idx - 1);
51 api_check(L, idx <= L->ci->top - L->base);51 api_check(L, idx <= L->ci->top - L->base);
@@ -160,7 +160,7 @@ LUA_API void lua_settop (lua_State *L, int idx) { · 108 unmodified lines
160LUA_API void lua_remove (lua_State *L, int idx) {160LUA_API void lua_remove (lua_State *L, int idx) {
161 StkId p;161 StkId p;
162 lua_lock(L);162 lua_lock(L);
163 p = luaA_index(L, idx);163 p = index2adr(L, idx);
164 api_checkvalidindex(L, p);164 api_checkvalidindex(L, p);
165 while (++p < L->top) setobjs2s(L, p-1, p);165 while (++p < L->top) setobjs2s(L, p-1, p);
166 L->top--;166 L->top--;
@@ -172,7 +172,7 @@ LUA_API void lua_insert (lua_State *L, int idx) { · 5 unmodified lines
172 StkId p;172 StkId p;
173 StkId q;173 StkId q;
174 lua_lock(L);174 lua_lock(L);
175 p = luaA_index(L, idx);175 p = index2adr(L, idx);
176 api_checkvalidindex(L, p);176 api_checkvalidindex(L, p);
177 for (q = L->top; q>p; q--) setobjs2s(L, q, q-1);177 for (q = L->top; q>p; q--) setobjs2s(L, q, q-1);
178 setobjs2s(L, p, L->top);178 setobjs2s(L, p, L->top);
@@ -184,7 +184,7 @@ LUA_API void lua_replace (lua_State *L, int idx) { · 5 unmodified lines
184 StkId o;184 StkId o;
185 lua_lock(L);185 lua_lock(L);
186 api_checknelems(L, 1);186 api_checknelems(L, 1);
187 o = luaA_index(L, idx);187 o = index2adr(L, idx);
188 api_checkvalidindex(L, o);188 api_checkvalidindex(L, o);
189 setobj(L, o, L->top - 1);189 setobj(L, o, L->top - 1);
190 if (idx < LUA_GLOBALSINDEX) /* function upvalue? */190 if (idx < LUA_GLOBALSINDEX) /* function upvalue? */
@@ -196,7 +196,7 @@ LUA_API void lua_replace (lua_State *L, int idx) { · 5 unmodified lines
196 196
197LUA_API void lua_pushvalue (lua_State *L, int idx) {197LUA_API void lua_pushvalue (lua_State *L, int idx) {
198 lua_lock(L);198 lua_lock(L);
199 setobj2s(L, L->top, luaA_index(L, idx));199 setobj2s(L, L->top, index2adr(L, idx));
200 api_incr_top(L);200 api_incr_top(L);
201 lua_unlock(L);201 lua_unlock(L);
202}202}
@@ -209,7 +209,7 @@ LUA_API void lua_pushvalue (lua_State *L, int idx) { · 6 unmodified lines
209 209
210 210
211LUA_API int lua_type (lua_State *L, int idx) {211LUA_API int lua_type (lua_State *L, int idx) {
212 StkId o = luaA_index(L, idx);212 StkId o = index2adr(L, idx);
213 return (o == &luaO_nilobject) ? LUA_TNONE : ttype(o);213 return (o == &luaO_nilobject) ? LUA_TNONE : ttype(o);
214}214}
215 215
@@ -221,14 +221,14 @@ LUA_API const char *lua_typename (lua_State *L, int t) { · 5 unmodified lines
221 221
222 222
223LUA_API int lua_iscfunction (lua_State *L, int idx) {223LUA_API int lua_iscfunction (lua_State *L, int idx) {
224 StkId o = luaA_index(L, idx);224 StkId o = index2adr(L, idx);
225 return iscfunction(o);225 return iscfunction(o);
226}226}
227 227
228 228
229LUA_API int lua_isnumber (lua_State *L, int idx) {229LUA_API int lua_isnumber (lua_State *L, int idx) {
230 TValue n;230 TValue n;
231 const TValue *o = luaA_index(L, idx);231 const TValue *o = index2adr(L, idx);
232 return tonumber(o, &n);232 return tonumber(o, &n);
233}233}
234 234
@@ -240,14 +240,14 @@ LUA_API int lua_isstring (lua_State *L, int idx) { · 5 unmodified lines
240 240
241 241
242LUA_API int lua_isuserdata (lua_State *L, int idx) {242LUA_API int lua_isuserdata (lua_State *L, int idx) {
243 const TValue *o = luaA_index(L, idx);243 const TValue *o = index2adr(L, idx);
244 return (ttisuserdata(o) || ttislightuserdata(o));244 return (ttisuserdata(o) || ttislightuserdata(o));
245}245}
246 246
247 247
248LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {248LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
249 StkId o1 = luaA_index(L, index1);249 StkId o1 = index2adr(L, index1);
250 StkId o2 = luaA_index(L, index2);250 StkId o2 = index2adr(L, index2);
251 return (o1 == &luaO_nilobject || o2 == &luaO_nilobject) ? 0251 return (o1 == &luaO_nilobject || o2 == &luaO_nilobject) ? 0
252 : luaO_rawequalObj(o1, o2);252 : luaO_rawequalObj(o1, o2);
253}253}
@@ -257,8 +257,8 @@ LUA_API int lua_equal (lua_State *L, int index1, int index2) { · 3 unmodified lines
257 StkId o1, o2;257 StkId o1, o2;
258 int i;258 int i;
259 lua_lock(L); /* may call tag method */259 lua_lock(L); /* may call tag method */
260 o1 = luaA_index(L, index1);260 o1 = index2adr(L, index1);
261 o2 = luaA_index(L, index2);261 o2 = index2adr(L, index2);
262 i = (o1 == &luaO_nilobject || o2 == &luaO_nilobject) ? 0262 i = (o1 == &luaO_nilobject || o2 == &luaO_nilobject) ? 0
263 : equalobj(L, o1, o2);263 : equalobj(L, o1, o2);
264 lua_unlock(L);264 lua_unlock(L);
@@ -270,8 +270,8 @@ LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { · 5 unmodified lines
270 StkId o1, o2;270 StkId o1, o2;
271 int i;271 int i;
272 lua_lock(L); /* may call tag method */272 lua_lock(L); /* may call tag method */
273 o1 = luaA_index(L, index1);273 o1 = index2adr(L, index1);
274 o2 = luaA_index(L, index2);274 o2 = index2adr(L, index2);
275 i = (o1 == &luaO_nilobject || o2 == &luaO_nilobject) ? 0275 i = (o1 == &luaO_nilobject || o2 == &luaO_nilobject) ? 0
276 : luaV_lessthan(L, o1, o2);276 : luaV_lessthan(L, o1, o2);
277 lua_unlock(L);277 lua_unlock(L);
@@ -282,7 +282,7 @@ LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { · 4 unmodified lines
282 282
283LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {283LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {
284 TValue n;284 TValue n;
285 const TValue *o = luaA_index(L, idx);285 const TValue *o = index2adr(L, idx);
286 if (tonumber(o, &n))286 if (tonumber(o, &n))
287 return nvalue(o);287 return nvalue(o);
288 else288 else
@@ -292,7 +292,7 @@ LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { · 3 unmodified lines
292 292
293LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {293LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {
294 TValue n;294 TValue n;
295 const TValue *o = luaA_index(L, idx);295 const TValue *o = index2adr(L, idx);
296 if (tonumber(o, &n)) {296 if (tonumber(o, &n)) {
297 lua_Integer res;297 lua_Integer res;
298 lua_number2integer(res, nvalue(o));298 lua_number2integer(res, nvalue(o));
@@ -304,13 +304,13 @@ LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { · 5 unmodified lines
304 304
305 305
306LUA_API int lua_toboolean (lua_State *L, int idx) {306LUA_API int lua_toboolean (lua_State *L, int idx) {
307 const TValue *o = luaA_index(L, idx);307 const TValue *o = index2adr(L, idx);
308 return !l_isfalse(o);308 return !l_isfalse(o);
309}309}
310 310
311 311
312LUA_API const char *lua_tostring (lua_State *L, int idx) {312LUA_API const char *lua_tostring (lua_State *L, int idx) {
313 StkId o = luaA_index(L, idx);313 StkId o = index2adr(L, idx);
314 if (ttisstring(o))314 if (ttisstring(o))
315 return svalue(o);315 return svalue(o);
316 else {316 else {
@@ -325,7 +325,7 @@ LUA_API const char *lua_tostring (lua_State *L, int idx) { · 8 unmodified lines
325 325
326 326
327LUA_API size_t lua_objsize (lua_State *L, int idx) {327LUA_API size_t lua_objsize (lua_State *L, int idx) {
328 StkId o = luaA_index(L, idx);328 StkId o = index2adr(L, idx);
329 if (ttisstring(o))329 if (ttisstring(o))
330 return tsvalue(o)->len;330 return tsvalue(o)->len;
331 else if (ttisuserdata(o))331 else if (ttisuserdata(o))
@@ -341,13 +341,13 @@ LUA_API size_t lua_objsize (lua_State *L, int idx) { · 9 unmodified lines
341 341
342 342
343LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {343LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
344 StkId o = luaA_index(L, idx);344 StkId o = index2adr(L, idx);
345 return (!iscfunction(o)) ? NULL : clvalue(o)->c.f;345 return (!iscfunction(o)) ? NULL : clvalue(o)->c.f;
346}346}
347 347
348 348
349LUA_API void *lua_touserdata (lua_State *L, int idx) {349LUA_API void *lua_touserdata (lua_State *L, int idx) {
350 StkId o = luaA_index(L, idx);350 StkId o = index2adr(L, idx);
351 switch (ttype(o)) {351 switch (ttype(o)) {
352 case LUA_TUSERDATA: return (rawuvalue(o) + 1);352 case LUA_TUSERDATA: return (rawuvalue(o) + 1);
353 case LUA_TLIGHTUSERDATA: return pvalue(o);353 case LUA_TLIGHTUSERDATA: return pvalue(o);
@@ -357,13 +357,13 @@ LUA_API void *lua_touserdata (lua_State *L, int idx) { · 3 unmodified lines
357 357
358 358
359LUA_API lua_State *lua_tothread (lua_State *L, int idx) {359LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
360 StkId o = luaA_index(L, idx);360 StkId o = index2adr(L, idx);
361 return (!ttisthread(o)) ? NULL : thvalue(o);361 return (!ttisthread(o)) ? NULL : thvalue(o);
362}362}
363 363
364 364
365LUA_API const void *lua_topointer (lua_State *L, int idx) {365LUA_API const void *lua_topointer (lua_State *L, int idx) {
366 StkId o = luaA_index(L, idx);366 StkId o = index2adr(L, idx);
367 switch (ttype(o)) {367 switch (ttype(o)) {
368 case LUA_TTABLE: return hvalue(o);368 case LUA_TTABLE: return hvalue(o);
369 case LUA_TFUNCTION: return clvalue(o);369 case LUA_TFUNCTION: return clvalue(o);
@@ -498,7 +498,7 @@ LUA_API int lua_pushthread (lua_State *L) { · 128 unmodified lines
498LUA_API void lua_gettable (lua_State *L, int idx) {498LUA_API void lua_gettable (lua_State *L, int idx) {
499 StkId t;499 StkId t;
500 lua_lock(L);500 lua_lock(L);
501 t = luaA_index(L, idx);501 t = index2adr(L, idx);
502 api_checkvalidindex(L, t);502 api_checkvalidindex(L, t);
503 luaV_gettable(L, t, L->top - 1, L->top - 1, NULL);503 luaV_gettable(L, t, L->top - 1, L->top - 1, NULL);
504 lua_unlock(L);504 lua_unlock(L);
@@ -509,7 +509,7 @@ LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { · 4 unmodified lines
509 StkId t;509 StkId t;
510 TValue key;510 TValue key;
511 lua_lock(L);511 lua_lock(L);
512 t = luaA_index(L, idx);512 t = index2adr(L, idx);
513 api_checkvalidindex(L, t);513 api_checkvalidindex(L, t);
514 setsvalue(L, &key, luaS_new(L, k));514 setsvalue(L, &key, luaS_new(L, k));
515 luaV_gettable(L, t, &key, L->top, NULL);515 luaV_gettable(L, t, &key, L->top, NULL);
@@ -521,7 +521,7 @@ LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { · 5 unmodified lines
521LUA_API void lua_rawget (lua_State *L, int idx) {521LUA_API void lua_rawget (lua_State *L, int idx) {
522 StkId t;522 StkId t;
523 lua_lock(L);523 lua_lock(L);
524 t = luaA_index(L, idx);524 t = index2adr(L, idx);
525 api_check(L, ttistable(t));525 api_check(L, ttistable(t));
526 setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));526 setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1));
527 lua_unlock(L);527 lua_unlock(L);
@@ -531,7 +531,7 @@ LUA_API void lua_rawget (lua_State *L, int idx) { · 3 unmodified lines
531LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {531LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
532 StkId o;532 StkId o;
533 lua_lock(L);533 lua_lock(L);
534 o = luaA_index(L, idx);534 o = index2adr(L, idx);
535 api_check(L, ttistable(o));535 api_check(L, ttistable(o));
536 setobj2s(L, L->top, luaH_getnum(hvalue(o), n));536 setobj2s(L, L->top, luaH_getnum(hvalue(o), n));
537 api_incr_top(L);537 api_incr_top(L);
@@ -553,7 +553,7 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) { · 15 unmodified lines
553 Table *mt = NULL;553 Table *mt = NULL;
554 int res;554 int res;
555 lua_lock(L);555 lua_lock(L);
556 obj = luaA_index(L, objindex);556 obj = index2adr(L, objindex);
557 switch (ttype(obj)) {557 switch (ttype(obj)) {
558 case LUA_TTABLE:558 case LUA_TTABLE:
559 mt = hvalue(obj)->metatable;559 mt = hvalue(obj)->metatable;
@@ -577,7 +577,7 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) { · 17 unmodified lines
577LUA_API void lua_getfenv (lua_State *L, int idx) {577LUA_API void lua_getfenv (lua_State *L, int idx) {
578 StkId o;578 StkId o;
579 lua_lock(L);579 lua_lock(L);
580 o = luaA_index(L, idx);580 o = index2adr(L, idx);
581 api_checkvalidindex(L, o);581 api_checkvalidindex(L, o);
582 setobj2s(L, L->top, isLfunction(o) ? &clvalue(o)->l.g : gt(L));582 setobj2s(L, L->top, isLfunction(o) ? &clvalue(o)->l.g : gt(L));
583 api_incr_top(L);583 api_incr_top(L);
@@ -594,7 +594,7 @@ LUA_API void lua_settable (lua_State *L, int idx) { · 10 unmodified lines
594 StkId t;594 StkId t;
595 lua_lock(L);595 lua_lock(L);
596 api_checknelems(L, 2);596 api_checknelems(L, 2);
597 t = luaA_index(L, idx);597 t = index2adr(L, idx);
598 api_checkvalidindex(L, t);598 api_checkvalidindex(L, t);
599 luaV_settable(L, t, L->top - 2, L->top - 1, NULL);599 luaV_settable(L, t, L->top - 2, L->top - 1, NULL);
600 L->top -= 2; /* pop index and value */600 L->top -= 2; /* pop index and value */
@@ -607,7 +607,7 @@ LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { · 6 unmodified lines
607 TValue key;607 TValue key;
608 lua_lock(L);608 lua_lock(L);
609 api_checknelems(L, 1);609 api_checknelems(L, 1);
610 t = luaA_index(L, idx);610 t = index2adr(L, idx);
611 api_checkvalidindex(L, t);611 api_checkvalidindex(L, t);
612 setsvalue(L, &key, luaS_new(L, k));612 setsvalue(L, &key, luaS_new(L, k));
613 luaV_settable(L, t, &key, L->top - 1, NULL);613 luaV_settable(L, t, &key, L->top - 1, NULL);
@@ -620,7 +620,7 @@ LUA_API void lua_rawset (lua_State *L, int idx) { · 6 unmodified lines
620 StkId t;620 StkId t;
621 lua_lock(L);621 lua_lock(L);
622 api_checknelems(L, 2);622 api_checknelems(L, 2);
623 t = luaA_index(L, idx);623 t = index2adr(L, idx);
624 api_check(L, ttistable(t));624 api_check(L, ttistable(t));
625 setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);625 setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);
626 luaC_barriert(L, hvalue(t), L->top-1);626 luaC_barriert(L, hvalue(t), L->top-1);
@@ -633,7 +633,7 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) { · 6 unmodified lines
633 StkId o;633 StkId o;
634 lua_lock(L);634 lua_lock(L);
635 api_checknelems(L, 1);635 api_checknelems(L, 1);
636 o = luaA_index(L, idx);636 o = index2adr(L, idx);
637 api_check(L, ttistable(o));637 api_check(L, ttistable(o));
638 setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);638 setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1);
639 luaC_barriert(L, hvalue(o), L->top-1);639 luaC_barriert(L, hvalue(o), L->top-1);
@@ -648,7 +648,7 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) { · 8 unmodified lines
648 int res = 1;648 int res = 1;
649 lua_lock(L);649 lua_lock(L);
650 api_checknelems(L, 1);650 api_checknelems(L, 1);
651 obj = luaA_index(L, objindex);651 obj = index2adr(L, objindex);
652 api_checkvalidindex(L, obj);652 api_checkvalidindex(L, obj);
653 if (ttisnil(L->top - 1))653 if (ttisnil(L->top - 1))
654 mt = NULL;654 mt = NULL;
@@ -685,7 +685,7 @@ LUA_API int lua_setfenv (lua_State *L, int idx) { · 30 unmodified lines
685 int res = 0;685 int res = 0;
686 lua_lock(L);686 lua_lock(L);
687 api_checknelems(L, 1);687 api_checknelems(L, 1);
688 o = luaA_index(L, idx);688 o = index2adr(L, idx);
689 api_checkvalidindex(L, o);689 api_checkvalidindex(L, o);
690 api_check(L, ttistable(L->top - 1));690 api_check(L, ttistable(L->top - 1));
691 if (isLfunction(o)) {691 if (isLfunction(o)) {
@@ -751,7 +751,7 @@ LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { · 59 unmodified lines
751 if (errfunc == 0)751 if (errfunc == 0)
752 func = 0;752 func = 0;
753 else {753 else {
754 StkId o = luaA_index(L, errfunc);754 StkId o = index2adr(L, errfunc);
755 api_checkvalidindex(L, o);755 api_checkvalidindex(L, o);
756 func = savestack(L, o);756 func = savestack(L, o);
757 }757 }
@@ -842,7 +842,7 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { · 84 unmodified lines
842 g = G(L);842 g = G(L);
843 switch (what) {843 switch (what) {
844 case LUA_GCSTOP: {844 case LUA_GCSTOP: {
845 g->GCthreshold = MAXLMEM;845 g->GCthreshold = MAX_LUMEM;
846 break;846 break;
847 }847 }
848 case LUA_GCRESTART: {848 case LUA_GCRESTART: {
@@ -867,6 +867,16 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { · 18 unmodified lines
867 luaC_step(L);867 luaC_step(L);
868 break;868 break;
869 }869 }
870 case LUA_GCSETSTEPMUL: {
871 res = g->stepmul;
872 g->stepmul = data;
873 break;
874 }
875 case LUA_GCSETINCMODE: {
876 res = g->incgc;
877 g->incgc = data;
878 break;
879 }
870 default: res = -1; /* invalid option */880 default: res = -1; /* invalid option */
871 }881 }
872 lua_unlock(L);882 lua_unlock(L);
@@ -898,7 +908,7 @@ LUA_API int lua_next (lua_State *L, int idx) { · 25 unmodified lines
898 StkId t;908 StkId t;
899 int more;909 int more;
900 lua_lock(L);910 lua_lock(L);
901 t = luaA_index(L, idx);911 t = index2adr(L, idx);
902 api_check(L, ttistable(t));912 api_check(L, ttistable(t));
903 more = luaH_next(L, hvalue(t), L->top - 1);913 more = luaH_next(L, hvalue(t), L->top - 1);
904 if (more) {914 if (more) {
@@ -970,7 +980,7 @@ LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { · 65 unmodified lines
970 const char *name;980 const char *name;
971 TValue *val;981 TValue *val;
972 lua_lock(L);982 lua_lock(L);
973 name = aux_upvalue(L, luaA_index(L, funcindex), n, &val);983 name = aux_upvalue(L, index2adr(L, funcindex), n, &val);
974 if (name) {984 if (name) {
975 setobj2s(L, L->top, val);985 setobj2s(L, L->top, val);
976 api_incr_top(L);986 api_incr_top(L);
@@ -985,7 +995,7 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { · 8 unmodified lines
985 TValue *val;995 TValue *val;
986 StkId fi;996 StkId fi;
987 lua_lock(L);997 lua_lock(L);
988 fi = luaA_index(L, funcindex);998 fi = index2adr(L, funcindex);
989 api_checknelems(L, 1);999 api_checknelems(L, 1);
990 name = aux_upvalue(L, fi, n, &val);1000 name = aux_upvalue(L, fi, n, &val);
991 if (name) {1001 if (name) {
src/lcode.c+50−27
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lcode.c,v 2.6 2004/08/24 20:09:11 roberto Exp $2** $Id: lcode.c,v 2.8 2004/12/03 20:35:33 roberto Exp $
3** Code generator for Lua3** Code generator for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -53,13 +53,13 @@ int luaK_jump (FuncState *fs) { · 47 unmodified lines
53}53}
54 54
55 55
56static int luaK_condjump (FuncState *fs, OpCode op, int A, int B, int C) {56static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
57 luaK_codeABC(fs, op, A, B, C);57 luaK_codeABC(fs, op, A, B, C);
58 return luaK_jump(fs);58 return luaK_jump(fs);
59}59}
60 60
61 61
62static void luaK_fixjump (FuncState *fs, int pc, int dest) {62static void fixjump (FuncState *fs, int pc, int dest) {
63 Instruction *jmp = &fs->f->code[pc];63 Instruction *jmp = &fs->f->code[pc];
64 int offset = dest-(pc+1);64 int offset = dest-(pc+1);
65 lua_assert(dest != NO_JUMP);65 lua_assert(dest != NO_JUMP);
@@ -79,7 +79,7 @@ int luaK_getlabel (FuncState *fs) { · 13 unmodified lines
79}79}
80 80
81 81
82static int luaK_getjump (FuncState *fs, int pc) {82static int getjump (FuncState *fs, int pc) {
83 int offset = GETARG_sBx(fs->f->code[pc]);83 int offset = GETARG_sBx(fs->f->code[pc]);
84 if (offset == NO_JUMP) /* point to itself represents end of list */84 if (offset == NO_JUMP) /* point to itself represents end of list */
85 return NO_JUMP; /* end of list */85 return NO_JUMP; /* end of list */
@@ -102,7 +102,7 @@ static Instruction *getjumpcontrol (FuncState *fs, int pc) { · 16 unmodified lines
102** (or produce an inverted value)102** (or produce an inverted value)
103*/103*/
104static int need_value (FuncState *fs, int list, int cond) {104static int need_value (FuncState *fs, int list, int cond) {
105 for (; list != NO_JUMP; list = luaK_getjump(fs, list)) {105 for (; list != NO_JUMP; list = getjump(fs, list)) {
106 Instruction i = *getjumpcontrol(fs, list);106 Instruction i = *getjumpcontrol(fs, list);
107 if (GET_OPCODE(i) != OP_TEST || GETARG_C(i) != cond) return 1;107 if (GET_OPCODE(i) != OP_TEST || GETARG_C(i) != cond) return 1;
108 }108 }
@@ -116,25 +116,25 @@ static void patchtestreg (Instruction *i, int reg) { · 7 unmodified lines
116}116}
117 117
118 118
119static void luaK_patchlistaux (FuncState *fs, int list,119static void patchlistaux (FuncState *fs, int list,
120 int ttarget, int treg, int ftarget, int freg, int dtarget) {120 int ttarget, int treg, int ftarget, int freg, int dtarget) {
121 while (list != NO_JUMP) {121 while (list != NO_JUMP) {
122 int next = luaK_getjump(fs, list);122 int next = getjump(fs, list);
123 Instruction *i = getjumpcontrol(fs, list);123 Instruction *i = getjumpcontrol(fs, list);
124 if (GET_OPCODE(*i) != OP_TEST) {124 if (GET_OPCODE(*i) != OP_TEST) {
125 lua_assert(dtarget != NO_JUMP);125 lua_assert(dtarget != NO_JUMP);
126 luaK_fixjump(fs, list, dtarget); /* jump to default target */126 fixjump(fs, list, dtarget); /* jump to default target */
127 }127 }
128 else {128 else {
129 if (GETARG_C(*i)) {129 if (GETARG_C(*i)) {
130 lua_assert(ttarget != NO_JUMP);130 lua_assert(ttarget != NO_JUMP);
131 patchtestreg(i, treg);131 patchtestreg(i, treg);
132 luaK_fixjump(fs, list, ttarget);132 fixjump(fs, list, ttarget);
133 }133 }
134 else {134 else {
135 lua_assert(ftarget != NO_JUMP);135 lua_assert(ftarget != NO_JUMP);
136 patchtestreg(i, freg);136 patchtestreg(i, freg);
137 luaK_fixjump(fs, list, ftarget);137 fixjump(fs, list, ftarget);
138 }138 }
139 }139 }
140 list = next;140 list = next;
@@ -142,8 +142,8 @@ static void luaK_patchlistaux (FuncState *fs, int list, · 1 unmodified line
142}142}
143 143
144 144
145static void luaK_dischargejpc (FuncState *fs) {145static void dischargejpc (FuncState *fs) {
146 luaK_patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc, NO_REG, fs->pc);146 patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc, NO_REG, fs->pc);
147 fs->jpc = NO_JUMP;147 fs->jpc = NO_JUMP;
148}148}
149 149
@@ -153,7 +153,7 @@ void luaK_patchlist (FuncState *fs, int list, int target) { · 3 unmodified lines
153 luaK_patchtohere(fs, list);153 luaK_patchtohere(fs, list);
154 else {154 else {
155 lua_assert(target < fs->pc);155 lua_assert(target < fs->pc);
156 luaK_patchlistaux(fs, list, target, NO_REG, target, NO_REG, target);156 patchlistaux(fs, list, target, NO_REG, target, NO_REG, target);
157 }157 }
158}158}
159 159
@@ -171,9 +171,9 @@ void luaK_concat (FuncState *fs, int *l1, int l2) { · 11 unmodified lines
171 else {171 else {
172 int list = *l1;172 int list = *l1;
173 int next;173 int next;
174 while ((next = luaK_getjump(fs, list)) != NO_JUMP) /* find last element */174 while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */
175 list = next;175 list = next;
176 luaK_fixjump(fs, list, l2);176 fixjump(fs, list, l2);
177 }177 }
178}178}
179 179
@@ -243,7 +243,14 @@ int luaK_numberK (FuncState *fs, lua_Number r) { · 63 unmodified lines
243}243}
244 244
245 245
246static int nil_constant (FuncState *fs) {246static int boolK (FuncState *fs, int b) {
247 TValue o;
248 setbvalue(&o, b);
249 return addk(fs, &o, &o);
250}
251
252
253static int nilK (FuncState *fs) {
247 TValue k, v;254 TValue k, v;
248 setnilvalue(&v);255 setnilvalue(&v);
249 /* cannot use nil as key; instead use table itself to represent nil */256 /* cannot use nil as key; instead use table itself to represent nil */
@@ -358,7 +365,7 @@ static void discharge2anyreg (FuncState *fs, expdesc *e) { · 108 unmodified lines
358}365}
359 366
360 367
361static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) {368static void exp2reg (FuncState *fs, expdesc *e, int reg) {
362 discharge2reg(fs, e, reg);369 discharge2reg(fs, e, reg);
363 if (e->k == VJMP)370 if (e->k == VJMP)
364 luaK_concat(fs, &e->t, e->info); /* put this jump in `t' list */371 luaK_concat(fs, &e->t, e->info); /* put this jump in `t' list */
@@ -375,8 +382,8 @@ static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) { · 10 unmodified lines
375 luaK_patchtohere(fs, fj);382 luaK_patchtohere(fs, fj);
376 }383 }
377 final = luaK_getlabel(fs);384 final = luaK_getlabel(fs);
378 luaK_patchlistaux(fs, e->f, p_f, NO_REG, final, reg, p_f);385 patchlistaux(fs, e->f, p_f, NO_REG, final, reg, p_f);
379 luaK_patchlistaux(fs, e->t, final, reg, p_t, NO_REG, p_t);386 patchlistaux(fs, e->t, final, reg, p_t, NO_REG, p_t);
380 }387 }
381 e->f = e->t = NO_JUMP;388 e->f = e->t = NO_JUMP;
382 e->info = reg;389 e->info = reg;
@@ -388,7 +395,7 @@ void luaK_exp2nextreg (FuncState *fs, expdesc *e) { · 5 unmodified lines
388 luaK_dischargevars(fs, e);395 luaK_dischargevars(fs, e);
389 freeexp(fs, e);396 freeexp(fs, e);
390 luaK_reserveregs(fs, 1);397 luaK_reserveregs(fs, 1);
391 luaK_exp2reg(fs, e, fs->freereg - 1);398 exp2reg(fs, e, fs->freereg - 1);
392}399}
393 400
394 401
@@ -397,7 +404,7 @@ int luaK_exp2anyreg (FuncState *fs, expdesc *e) { · 2 unmodified lines
397 if (e->k == VNONRELOC) {404 if (e->k == VNONRELOC) {
398 if (!hasjumps(e)) return e->info; /* exp is already in a register */ 405 if (!hasjumps(e)) return e->info; /* exp is already in a register */
399 if (e->info >= fs->nactvar) { /* reg. is not a local? */406 if (e->info >= fs->nactvar) { /* reg. is not a local? */
400 luaK_exp2reg(fs, e, e->info); /* put value on it */407 exp2reg(fs, e, e->info); /* put value on it */
401 return e->info;408 return e->info;
402 }409 }
403 }410 }
@@ -417,9 +424,11 @@ void luaK_exp2val (FuncState *fs, expdesc *e) { · 13 unmodified lines
417int luaK_exp2RK (FuncState *fs, expdesc *e) {424int luaK_exp2RK (FuncState *fs, expdesc *e) {
418 luaK_exp2val(fs, e);425 luaK_exp2val(fs, e);
419 switch (e->k) {426 switch (e->k) {
427 case VTRUE:
428 case VFALSE:
420 case VNIL: {429 case VNIL: {
421 if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */430 if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */
422 e->info = nil_constant(fs);431 e->info = (e->k == VNIL) ? nilK(fs) : boolK(fs, (e->k == VTRUE));
423 e->k = VK;432 e->k = VK;
424 return RKASK(e->info);433 return RKASK(e->info);
425 }434 }
@@ -441,7 +450,7 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { · 15 unmodified lines
441 switch (var->k) {450 switch (var->k) {
442 case VLOCAL: {451 case VLOCAL: {
443 freeexp(fs, ex);452 freeexp(fs, ex);
444 luaK_exp2reg(fs, ex, var->info);453 exp2reg(fs, ex, var->info);
445 return;454 return;
446 }455 }
447 case VUPVAL: {456 case VUPVAL: {
@@ -493,13 +502,13 @@ static int jumponcond (FuncState *fs, expdesc *e, int cond) { · 45 unmodified lines
493 Instruction ie = getcode(fs, e);502 Instruction ie = getcode(fs, e);
494 if (GET_OPCODE(ie) == OP_NOT) {503 if (GET_OPCODE(ie) == OP_NOT) {
495 fs->pc--; /* remove previous OP_NOT */504 fs->pc--; /* remove previous OP_NOT */
496 return luaK_condjump(fs, OP_TEST, NO_REG, GETARG_B(ie), !cond);505 return condjump(fs, OP_TEST, NO_REG, GETARG_B(ie), !cond);
497 }506 }
498 /* else go through */507 /* else go through */
499 }508 }
500 discharge2anyreg(fs, e);509 discharge2anyreg(fs, e);
501 freeexp(fs, e);510 freeexp(fs, e);
502 return luaK_condjump(fs, OP_TEST, NO_REG, e->info, cond);511 return condjump(fs, OP_TEST, NO_REG, e->info, cond);
503}512}
504 513
505 514
@@ -651,7 +660,7 @@ static void codebinop (FuncState *fs, expdesc *res, BinOpr op, · 145 unmodified lines
651 temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */660 temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */
652 }661 }
653 else if (op == OPR_NE) cond = 0;662 else if (op == OPR_NE) cond = 0;
654 res->info = luaK_condjump(fs, ops[op - OPR_NE], cond, o1, o2);663 res->info = condjump(fs, ops[op - OPR_NE], cond, o1, o2);
655 res->k = VJMP;664 res->k = VJMP;
656 }665 }
657}666}
@@ -708,7 +717,7 @@ void luaK_fixline (FuncState *fs, int line) { · 50 unmodified lines
708 717
709int luaK_code (FuncState *fs, Instruction i, int line) {718int luaK_code (FuncState *fs, Instruction i, int line) {
710 Proto *f = fs->f;719 Proto *f = fs->f;
711 luaK_dischargejpc(fs); /* `pc' will change */720 dischargejpc(fs); /* `pc' will change */
712 /* put new instruction in code array */721 /* put new instruction in code array */
713 luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,722 luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,
714 MAX_INT, "code size overflow");723 MAX_INT, "code size overflow");
@@ -735,3 +744,17 @@ int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { · 20 unmodified lines
735 return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline);744 return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline);
736}745}
737 746
747
748void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
749 int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1;
750 int b = (tostore == LUA_MULTRET) ? 0 : tostore;
751 lua_assert(tostore != 0);
752 if (c <= MAXARG_C)
753 luaK_codeABC(fs, OP_SETLIST, base, b, c);
754 else {
755 luaK_codeABC(fs, OP_SETLIST, base, b, 0);
756 luaK_code(fs, cast(Instruction, c), fs->ls->lastline);
757 }
758 fs->freereg = base + 1; /* free registers with list values */
759}
760
src/lcode.h+2−1
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lcode.h,v 1.39 2004/05/31 18:51:50 roberto Exp $2** $Id: lcode.h,v 1.40 2004/10/04 19:01:53 roberto Exp $
3** Code generator for Lua3** Code generator for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -72,6 +72,7 @@ int luaK_getlabel (FuncState *fs); · 66 unmodified lines
72void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v);72void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v);
73void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);73void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);
74void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2);74void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2);
75void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);
75 76
76 77
77#endif78#endif
src/ldebug.c+15−8
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldebug.c,v 2.8 2004/09/01 13:47:31 roberto Exp $2** $Id: ldebug.c,v 2.11 2004/12/03 20:35:33 roberto Exp $
3** Debug Interface3** Debug Interface
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -261,11 +261,11 @@ int luaG_checkopenop (Instruction i) { · 255 unmodified lines
261 switch (GET_OPCODE(i)) {261 switch (GET_OPCODE(i)) {
262 case OP_CALL:262 case OP_CALL:
263 case OP_TAILCALL:263 case OP_TAILCALL:
264 case OP_RETURN: {264 case OP_RETURN:
265 case OP_SETLIST: {
265 check(GETARG_B(i) == 0);266 check(GETARG_B(i) == 0);
266 return 1;267 return 1;
267 }268 }
268 case OP_SETLISTO: return 1;
269 default: return 0; /* invalid instruction after an open call */269 default: return 0; /* invalid instruction after an open call */
270 }270 }
271}271}
@@ -284,7 +284,7 @@ static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) { · 12 unmodified lines
284}284}
285 285
286 286
287static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) {287static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
288 int pc;288 int pc;
289 int last; /* stores position of last instruction that changed `reg' */289 int last; /* stores position of last instruction that changed `reg' */
290 last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */290 last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */
@@ -315,6 +315,11 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { · 24 unmodified lines
315 if (getBMode(op) == OpArgR) {315 if (getBMode(op) == OpArgR) {
316 int dest = pc+1+b;316 int dest = pc+1+b;
317 check(0 <= dest && dest < pt->sizecode);317 check(0 <= dest && dest < pt->sizecode);
318 if (dest > 0) {
319 /* cannot jump to a setlist count */
320 const Instruction d = pt->code[dest-1];
321 check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0));
322 }
318 }323 }
319 break;324 break;
320 }325 }
@@ -356,7 +361,8 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { · 35 unmodified lines
356 break;361 break;
357 }362 }
358 case OP_TFORLOOP: {363 case OP_TFORLOOP: {
359 checkreg(pt, a+5); /* space for control variables */364 check(c >= 1); /* at least one result (control variable) */
365 checkreg(pt, a+3+c); /* space for results */
360 if (reg >= a+3) last = pc; /* affect all regs above its call base */366 if (reg >= a+3) last = pc; /* affect all regs above its call base */
361 break;367 break;
362 }368 }
@@ -392,7 +398,8 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { · 29 unmodified lines
392 break;398 break;
393 }399 }
394 case OP_SETLIST: {400 case OP_SETLIST: {
395 checkreg(pt, a + (b&(LFIELDS_PER_FLUSH-1)) + 1);401 if (b > 0) checkreg(pt, a + b);
402 if (c == 0) pc++;
396 break;403 break;
397 }404 }
398 case OP_CLOSURE: {405 case OP_CLOSURE: {
@@ -427,7 +434,7 @@ static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { · 28 unmodified lines
427 434
428 435
429int luaG_checkcode (const Proto *pt) {436int luaG_checkcode (const Proto *pt) {
430 return (luaG_symbexec(pt, pt->sizecode, NO_REG) != 0);437 return (symbexec(pt, pt->sizecode, NO_REG) != 0);
431}438}
432 439
433 440
@@ -447,7 +454,7 @@ static const char *getobjname (CallInfo *ci, int stackpos, const char **name) { · 13 unmodified lines
447 *name = luaF_getlocalname(p, stackpos+1, pc);454 *name = luaF_getlocalname(p, stackpos+1, pc);
448 if (*name) /* is a local? */455 if (*name) /* is a local? */
449 return "local";456 return "local";
450 i = luaG_symbexec(p, pc, stackpos); /* try symbolic execution */457 i = symbexec(p, pc, stackpos); /* try symbolic execution */
451 lua_assert(pc != -1);458 lua_assert(pc != -1);
452 switch (GET_OPCODE(i)) {459 switch (GET_OPCODE(i)) {
453 case OP_GETGLOBAL: {460 case OP_GETGLOBAL: {
src/ldo.c+5−7
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldo.c,v 2.10 2004/09/15 20:39:42 roberto Exp $2** $Id: ldo.c,v 2.13 2004/12/03 20:35:33 roberto Exp $
3** Stack and Call structure of Lua3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -70,7 +70,7 @@ static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { · 64 unmodified lines
70void luaD_throw (lua_State *L, int errcode) {70void luaD_throw (lua_State *L, int errcode) {
71 if (L->errorJmp) {71 if (L->errorJmp) {
72 L->errorJmp->status = errcode;72 L->errorJmp->status = errcode;
73 L_THROW(L->errorJmp);73 L_THROW(L, L->errorJmp);
74 }74 }
75 else {75 else {
76 if (G(L)->panic) G(L)->panic(L);76 if (G(L)->panic) G(L)->panic(L);
@@ -84,7 +84,7 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { · 7 unmodified lines
84 lj.status = 0;84 lj.status = 0;
85 lj.previous = L->errorJmp; /* chain new error handler */85 lj.previous = L->errorJmp; /* chain new error handler */
86 L->errorJmp = &lj;86 L->errorJmp = &lj;
87 L_TRY(&lj,87 L_TRY(L, &lj,
88 (*f)(L, ud);88 (*f)(L, ud);
89 );89 );
90 L->errorJmp = lj.previous; /* restore old error handler */90 L->errorJmp = lj.previous; /* restore old error handler */
@@ -147,7 +147,7 @@ void luaD_growstack (lua_State *L, int n) { · 56 unmodified lines
147}147}
148 148
149 149
150static CallInfo *luaD_growCI (lua_State *L) {150static CallInfo *growCI (lua_State *L) {
151 if (L->size_ci > LUA_MAXCALLS) /* overflow while handling overflow? */151 if (L->size_ci > LUA_MAXCALLS) /* overflow while handling overflow? */
152 luaD_throw(L, LUA_ERRERR);152 luaD_throw(L, LUA_ERRERR);
153 else {153 else {
@@ -238,7 +238,7 @@ static StkId tryfuncTM (lua_State *L, StkId func) { · 84 unmodified lines
238 238
239 239
240#define inc_ci(L) \240#define inc_ci(L) \
241 ((L->ci == L->end_ci) ? luaD_growCI(L) : \241 ((L->ci == L->end_ci) ? growCI(L) : \
242 (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))242 (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci))
243 243
244 244
@@ -391,7 +391,6 @@ static int resume_error (lua_State *L, const char *msg) { · 146 unmodified lines
391 391
392LUA_API int lua_resume (lua_State *L, int nargs) {392LUA_API int lua_resume (lua_State *L, int nargs) {
393 int status;393 int status;
394 lu_byte old_allowhooks;
395 lua_lock(L);394 lua_lock(L);
396 lua_assert(L->errfunc == 0 && L->nCcalls == 0);395 lua_assert(L->errfunc == 0 && L->nCcalls == 0);
397 if (L->status != LUA_YIELD) {396 if (L->status != LUA_YIELD) {
@@ -400,7 +399,6 @@ LUA_API int lua_resume (lua_State *L, int nargs) { · 2 unmodified lines
400 else if (L->ci != L->base_ci)399 else if (L->ci != L->base_ci)
401 return resume_error(L, "cannot resume non-suspended coroutine");400 return resume_error(L, "cannot resume non-suspended coroutine");
402 }401 }
403 old_allowhooks = L->allowhook;
404 status = luaD_rawrunprotected(L, resume, &nargs);402 status = luaD_rawrunprotected(L, resume, &nargs);
405 if (status != 0) { /* error? */403 if (status != 0) { /* error? */
406 L->status = status; /* mark thread as `dead' */404 L->status = status; /* mark thread as `dead' */
src/ldump.c+6−3
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldump.c,v 1.8 2004/09/01 21:22:34 lhf Exp $2** $Id: ldump.c,v 1.9 2004/11/25 09:31:41 lhf Exp $
3** save pre-compiled Lua chunks3** save pre-compiled Lua chunks
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -113,14 +113,17 @@ static void DumpConstants(const Proto* f, DumpState* D) · 107 unmodified lines
113 DumpByte(ttype(o),D);113 DumpByte(ttype(o),D);
114 switch (ttype(o))114 switch (ttype(o))
115 {115 {
116 case LUA_TNIL:
117 break;
118 case LUA_TBOOLEAN:
119 DumpByte(bvalue(o),D);
120 break;
116 case LUA_TNUMBER:121 case LUA_TNUMBER:
117 DumpNumber(nvalue(o),D);122 DumpNumber(nvalue(o),D);
118 break;123 break;
119 case LUA_TSTRING:124 case LUA_TSTRING:
120 DumpString(rawtsvalue(o),D);125 DumpString(rawtsvalue(o),D);
121 break;126 break;
122 case LUA_TNIL:
123 break;
124 default:127 default:
125 lua_assert(0); /* cannot happen */128 lua_assert(0); /* cannot happen */
126 break;129 break;
src/lfunc.c+4−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lfunc.c,v 2.4 2004/04/30 20:13:38 roberto Exp $2** $Id: lfunc.c,v 2.5 2004/11/24 19:20:21 roberto Exp $
3** Auxiliary functions to manipulate prototypes and closures3** Auxiliary functions to manipulate prototypes and closures
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -75,7 +75,7 @@ void luaF_close (lua_State *L, StkId level) { · 69 unmodified lines
75 lua_assert(!isblack(o));75 lua_assert(!isblack(o));
76 L->openupval = uv->next; /* remove from `open' list */76 L->openupval = uv->next; /* remove from `open' list */
77 if (isdead(g, o))77 if (isdead(g, o))
78 luaM_freelem(L, uv); /* free upvalue */78 luaM_free(L, uv); /* free upvalue */
79 else {79 else {
80 setobj(L, &uv->value, uv->v);80 setobj(L, &uv->value, uv->v);
81 uv->v = &uv->value; /* now current value lives here */81 uv->v = &uv->value; /* now current value lives here */
@@ -117,14 +117,14 @@ void luaF_freeproto (lua_State *L, Proto *f) { · 35 unmodified lines
117 luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);117 luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
118 luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);118 luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
119 luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);119 luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *);
120 luaM_freelem(L, f);120 luaM_free(L, f);
121}121}
122 122
123 123
124void luaF_freeclosure (lua_State *L, Closure *c) {124void luaF_freeclosure (lua_State *L, Closure *c) {
125 int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) :125 int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) :
126 sizeLclosure(c->l.nupvalues);126 sizeLclosure(c->l.nupvalues);
127 luaM_free(L, c, size);127 luaM_freemem(L, c, size);
128}128}
129 129
130 130
src/lgc.c+25−25
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lgc.c,v 2.12 2004/09/15 20:38:15 roberto Exp $2** $Id: lgc.c,v 2.18 2004/12/06 17:53:42 roberto Exp $
3** Garbage Collector3** Garbage Collector
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -24,7 +24,6 @@ · 18 unmodified lines
24 24
25 25
26#define GCSTEPSIZE 100026#define GCSTEPSIZE 1000
27#define STEPMUL 2
28#define GCSWEEPMAX 1027#define GCSWEEPMAX 10
29#define GCSWEEPCOST 3028#define GCSWEEPCOST 30
30#define GCFINALIZECOST 10029#define GCFINALIZECOST 100
@@ -65,7 +64,7 @@ · 34 unmodified lines
65static void removeentry (Node *n) {64static void removeentry (Node *n) {
66 setnilvalue(gval(n)); /* remove corresponding value ... */65 setnilvalue(gval(n)); /* remove corresponding value ... */
67 if (iscollectable(gkey(n)))66 if (iscollectable(gkey(n)))
68 setttype(gkey(n), LUA_TNONE); /* dead key; remove it */67 setttype(gkey(n), LUA_TDEADKEY); /* dead key; remove it */
69}68}
70 69
71 70
@@ -139,7 +138,7 @@ size_t luaC_separateudata (lua_State *L, int all) { · 67 unmodified lines
139 p = &curr->gch.next;138 p = &curr->gch.next;
140 }139 }
141 else { /* must call its gc method */140 else { /* must call its gc method */
142 deadmem += sizeudata(gco2u(curr)->len);141 deadmem += sizeudata(gco2u(curr));
143 markfinalized(gco2u(curr));142 markfinalized(gco2u(curr));
144 *p = curr->gch.next;143 *p = curr->gch.next;
145 curr->gch.next = NULL; /* link `curr' at the end of `collected' list */144 curr->gch.next = NULL; /* link `curr' at the end of `collected' list */
@@ -184,6 +183,7 @@ static int traversetable (global_State *g, Table *h) { · 38 unmodified lines
184 i = sizenode(h);183 i = sizenode(h);
185 while (i--) {184 while (i--) {
186 Node *n = gnode(h, i);185 Node *n = gnode(h, i);
186 lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n)));
187 if (ttisnil(gval(n)))187 if (ttisnil(gval(n)))
188 removeentry(n); /* remove empty entries */188 removeentry(n); /* remove empty entries */
189 else {189 else {
@@ -367,7 +367,7 @@ static void cleartable (GCObject *l) { · 177 unmodified lines
367 while (i--) {367 while (i--) {
368 Node *n = gnode(h, i);368 Node *n = gnode(h, i);
369 if (!ttisnil(gval(n)) && /* non-empty entry? */369 if (!ttisnil(gval(n)) && /* non-empty entry? */
370 (iscleared(gkey(n), 1) || iscleared(gval(n), 0)))370 (iscleared(key2tval(n), 1) || iscleared(gval(n), 0)))
371 removeentry(n); /* remove entry from table */371 removeentry(n); /* remove entry from table */
372 }372 }
373 l = h->gclist;373 l = h->gclist;
@@ -379,7 +379,7 @@ static void freeobj (lua_State *L, GCObject *o) { · 5 unmodified lines
379 switch (o->gch.tt) {379 switch (o->gch.tt) {
380 case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;380 case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break;
381 case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break;381 case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break;
382 case LUA_TUPVAL: luaM_freelem(L, gco2uv(o)); break;382 case LUA_TUPVAL: luaM_free(L, gco2uv(o)); break;
383 case LUA_TTABLE: luaH_free(L, gco2h(o)); break;383 case LUA_TTABLE: luaH_free(L, gco2h(o)); break;
384 case LUA_TTHREAD: {384 case LUA_TTHREAD: {
385 lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread);385 lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread);
@@ -388,11 +388,11 @@ static void freeobj (lua_State *L, GCObject *o) { · 2 unmodified lines
388 }388 }
389 case LUA_TSTRING: {389 case LUA_TSTRING: {
390 G(L)->strt.nuse--;390 G(L)->strt.nuse--;
391 luaM_free(L, o, sizestring(gco2ts(o)->len));391 luaM_freemem(L, o, sizestring(gco2ts(o)));
392 break;392 break;
393 }393 }
394 case LUA_TUSERDATA: {394 case LUA_TUSERDATA: {
395 luaM_free(L, o, sizeudata(gco2u(o)->len));395 luaM_freemem(L, o, sizeudata(gco2u(o)));
396 break;396 break;
397 }397 }
398 default: lua_assert(0);398 default: lua_assert(0);
@@ -529,6 +529,7 @@ static void remarkupvals (global_State *g) { · 130 unmodified lines
529 529
530static void atomic (lua_State *L) {530static void atomic (lua_State *L) {
531 global_State *g = G(L);531 global_State *g = G(L);
532 size_t udsize; /* total size of userdata to be finalized */
532 int aux;533 int aux;
533 /* remark objects cautch by write barrier */534 /* remark objects cautch by write barrier */
534 propagateall(g);535 propagateall(g);
@@ -544,7 +545,7 @@ static void atomic (lua_State *L) { · 9 unmodified lines
544 g->gray = g->grayagain;545 g->gray = g->grayagain;
545 g->grayagain = NULL;546 g->grayagain = NULL;
546 propagateall(g);547 propagateall(g);
547 luaC_separateudata(L, 0); /* separate userdata to be preserved */548 udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */
548 marktmu(g); /* mark `preserved' userdata */549 marktmu(g); /* mark `preserved' userdata */
549 propagateall(g); /* remark, to propagate `preserveness' */550 propagateall(g); /* remark, to propagate `preserveness' */
550 cleartable(g->weak); /* remove collected objects from weak tables */551 cleartable(g->weak); /* remove collected objects from weak tables */
@@ -554,10 +555,10 @@ static void atomic (lua_State *L) { · 3 unmodified lines
554 g->sweepgc = &g->rootgc;555 g->sweepgc = &g->rootgc;
555 g->gcstate = GCSsweepstring;556 g->gcstate = GCSsweepstring;
556 aux = g->gcgenerational;557 aux = g->gcgenerational;
557 g->gcgenerational = (g->estimate <= 4*g->prevestimate/2);558 g->gcgenerational = g->incgc && (g->estimate/2 <= g->prevestimate);
558 if (!aux) /* last collection was full? */559 if (!aux) /* last collection was full? */
559 g->prevestimate = g->estimate; /* keep estimate of last full collection */560 g->prevestimate = g->estimate; /* keep estimate of last full collection */
560 g->estimate = g->totalbytes; /* first estimate */561 g->estimate = g->totalbytes - udsize; /* first estimate */
561}562}
562 563
563 564
@@ -586,6 +587,7 @@ static l_mem singlestep (lua_State *L) { · 22 unmodified lines
586 sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);587 sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);
587 if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */588 if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */
588 g->gcstate = GCSsweep; /* end sweep-string phase */589 g->gcstate = GCSsweep; /* end sweep-string phase */
590 lua_assert(old >= g->totalbytes);
589 g->estimate -= old - g->totalbytes;591 g->estimate -= old - g->totalbytes;
590 return GCSWEEPCOST;592 return GCSWEEPCOST;
591 }593 }
@@ -596,12 +598,15 @@ static l_mem singlestep (lua_State *L) { · 4 unmodified lines
596 checkSizes(L);598 checkSizes(L);
597 g->gcstate = GCSfinalize; /* end sweep phase */599 g->gcstate = GCSfinalize; /* end sweep phase */
598 }600 }
601 lua_assert(old >= g->totalbytes);
599 g->estimate -= old - g->totalbytes;602 g->estimate -= old - g->totalbytes;
600 return GCSWEEPMAX*GCSWEEPCOST;603 return GCSWEEPMAX*GCSWEEPCOST;
601 }604 }
602 case GCSfinalize: {605 case GCSfinalize: {
603 if (g->tmudata) {606 if (g->tmudata) {
607 g->GCthreshold += GCFINALIZECOST; /* avoid GC steps inside method */
604 GCTM(L);608 GCTM(L);
609 g->GCthreshold -= GCFINALIZECOST; /* correct threshold */
605 return GCFINALIZECOST;610 return GCFINALIZECOST;
606 }611 }
607 else {612 else {
@@ -616,23 +621,18 @@ static l_mem singlestep (lua_State *L) { · 8 unmodified lines
616 621
617void luaC_step (lua_State *L) {622void luaC_step (lua_State *L) {
618 global_State *g = G(L);623 global_State *g = G(L);
619 l_mem lim = (g->totalbytes - (g->GCthreshold - GCSTEPSIZE)) * STEPMUL;624 l_mem lim = (g->totalbytes - (g->GCthreshold - GCSTEPSIZE)) * g->stepmul;
620/*printf("step(%c): ", g->gcgenerational?'g':' ');*/
621 do {625 do {
622 /*printf("%c", "_pswf"[g->gcstate]);*/
623 lim -= singlestep(L);626 lim -= singlestep(L);
624 if (g->gcstate == GCSpause)627 if (g->gcstate == GCSpause)
625 break;628 break;
626 } while (lim > 0);629 } while (lim > 0 || !g->incgc);
627/*printf("\n");*/630 if (g->incgc)
628 if (g->gcstate != GCSpause)
629 g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/STEPMUL; */631 g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/STEPMUL; */
630 else {632 else {
631/*printf("---\n");*/
632 lua_assert(g->totalbytes >= g->estimate);633 lua_assert(g->totalbytes >= g->estimate);
634 lua_assert(g->gcstate == GCSpause);
633 g->GCthreshold = 2*g->estimate;635 g->GCthreshold = 2*g->estimate;
634 if (g->GCthreshold < g->totalbytes + GCSTEPSIZE)
635 g->GCthreshold = g->totalbytes + GCSTEPSIZE;
636 }636 }
637}637}
638 638
@@ -657,20 +657,19 @@ void luaC_fullgc (lua_State *L) { · 18 unmodified lines
657 }657 }
658 markroot(L);658 markroot(L);
659 lua_assert(!g->gcgenerational);659 lua_assert(!g->gcgenerational);
660 while (g->gcstate != GCSfinalize) {660 while (g->gcstate != GCSpause) {
661 singlestep(L);661 singlestep(L);
662 g->gcgenerational = 0; /* keep it in this mode */662 g->gcgenerational = 0; /* keep it in this mode */
663 }663 }
664 lua_assert(g->estimate == g->totalbytes);
665 g->GCthreshold = 2*g->estimate;664 g->GCthreshold = 2*g->estimate;
666 luaC_callGCTM(L); /* call finalizers */
667}665}
668 666
669 667
670void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {668void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {
671 global_State *g = G(L);669 global_State *g = G(L);
672 lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));670 lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
673 lua_assert(g->gcgenerational || g->gcstate != GCSfinalize);671 lua_assert(g->gcgenerational ||
672 (g->gcstate != GCSfinalize && g->gcstate != GCSpause));
674 lua_assert(ttype(&o->gch) != LUA_TTABLE);673 lua_assert(ttype(&o->gch) != LUA_TTABLE);
675 /* must keep invariant? */674 /* must keep invariant? */
676 if (g->gcstate == GCSpropagate || g->gcgenerational)675 if (g->gcstate == GCSpropagate || g->gcgenerational)
@@ -683,7 +682,8 @@ void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) { · 6 unmodified lines
683void luaC_barrierback (lua_State *L, GCObject *o, GCObject *v) {682void luaC_barrierback (lua_State *L, GCObject *o, GCObject *v) {
684 global_State *g = G(L);683 global_State *g = G(L);
685 lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));684 lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o));
686 lua_assert(g->gcgenerational || g->gcstate != GCSfinalize);685 lua_assert(g->gcgenerational ||
686 (g->gcstate != GCSfinalize && g->gcstate != GCSpause));
687 black2gray(o); /* make table gray (again) */687 black2gray(o); /* make table gray (again) */
688 gco2h(o)->gclist = g->grayagain;688 gco2h(o)->gclist = g->grayagain;
689 g->grayagain = o;689 g->grayagain = o;
src/lib/lauxlib.c+68−10
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lauxlib.c,v 1.124 2004/09/03 13:17:14 roberto Exp $2** $Id: lauxlib.c,v 1.126 2004/09/29 21:03:14 roberto Exp $
3** Auxiliary functions for building Lua libraries3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -239,16 +239,22 @@ LUALIB_API void luaL_openlib (lua_State *L, const char *libname, · 233 unmodified lines
239 const luaL_reg *l, int nup) {239 const luaL_reg *l, int nup) {
240 if (libname) {240 if (libname) {
241 /* check whether lib already exists */241 /* check whether lib already exists */
242 lua_getglobal(L, libname);242 luaL_getfield(L, LUA_GLOBALSINDEX, libname);
243 if (lua_isnil(L, -1)) { /* no? */243 if (lua_isnil(L, -1)) { /* not found? */
244 lua_pop(L, 1);244 lua_pop(L, 1); /* remove previous result */
245 lua_newtable(L); /* create it */245 lua_newtable(L); /* create it */
246 if (lua_getmetatable(L, LUA_GLOBALSINDEX))246 if (lua_getmetatable(L, LUA_GLOBALSINDEX))
247 lua_setmetatable(L, -2); /* share metatable with global table */247 lua_setmetatable(L, -2); /* share metatable with global table */
248 lua_pushvalue(L, -1);
249 /* register it with given name */248 /* register it with given name */
250 lua_setglobal(L, libname);249 lua_pushvalue(L, -1);
250 luaL_setfield(L, LUA_GLOBALSINDEX, libname);
251 }251 }
252 else if (!lua_istable(L, -1))
253 luaL_error(L, "name conflict for library `%s'", libname);
254 lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
255 lua_pushvalue(L, -2);
256 lua_setfield(L, -2, libname); /* _LOADED[modname] = new table */
257 lua_pop(L, 1); /* remove _LOADED table */
252 lua_insert(L, -(nup+1)); /* move library table to below upvalues */258 lua_insert(L, -(nup+1)); /* move library table to below upvalues */
253 }259 }
254 for (; l->name; l++) {260 for (; l->name; l++) {
@@ -352,8 +358,8 @@ static const char *pushnexttemplate (lua_State *L, const char *path) { · 97 unmodified lines
352}358}
353 359
354 360
355static const char *luaL_gsub (lua_State *L, const char *s,361LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p,
356 const char *p, const char *r) {362 const char *r) {
357 const char *wild;363 const char *wild;
358 int l = strlen(p);364 int l = strlen(p);
359 luaL_Buffer b;365 luaL_Buffer b;
@@ -381,16 +387,68 @@ LUALIB_API const char *luaL_searchpath (lua_State *L, const char *name, · 21 unmodified lines
381 }387 }
382 fname = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name);388 fname = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name);
383 lua_remove(L, -2); /* remove path template */389 lua_remove(L, -2); /* remove path template */
384 f = fopen(fname, "r"); /* try to read it */390 f = fopen(fname, "r"); /* try to open it */
385 if (f) {391 if (f) {
392 int err;
393 getc(f); /* try to read file */
394 err = ferror(f);
386 fclose(f);395 fclose(f);
387 return fname;396 if (err == 0) /* open and read sucessful? */
397 return fname; /* return that file name */
388 }398 }
389 lua_pop(L, 1); /* remove file name */ 399 lua_pop(L, 1); /* remove file name */
390 }400 }
391}401}
392 402
393 403
404LUALIB_API const char *luaL_getfield (lua_State *L, int idx,
405 const char *fname) {
406 const char *e;
407 lua_pushvalue(L, idx);
408 while ((e = strchr(fname, '.')) != NULL) {
409 lua_pushlstring(L, fname, e - fname);
410 lua_rawget(L, -2);
411 lua_remove(L, -2); /* remove previous table */
412 fname = e + 1;
413 if (!lua_istable(L, -1)) return fname;
414 }
415 lua_pushstring(L, fname);
416 lua_rawget(L, -2); /* get last field */
417 lua_remove(L, -2); /* remove previous table */
418 return NULL;
419}
420
421
422LUALIB_API const char *luaL_setfield (lua_State *L, int idx,
423 const char *fname) {
424 const char *e;
425 lua_pushvalue(L, idx);
426 while ((e = strchr(fname, '.')) != NULL) {
427 lua_pushlstring(L, fname, e - fname);
428 lua_rawget(L, -2);
429 if (lua_isnil(L, -1)) { /* no such field? */
430 lua_pop(L, 1); /* remove this nil */
431 lua_newtable(L); /* create a new table for field */
432 lua_pushlstring(L, fname, e - fname);
433 lua_pushvalue(L, -2);
434 lua_settable(L, -4); /* set new table into field */
435 }
436 lua_remove(L, -2); /* remove previous table */
437 fname = e + 1;
438 if (!lua_istable(L, -1)) {
439 lua_pop(L, 2); /* remove table and value */
440 return fname;
441 }
442 }
443 lua_pushstring(L, fname);
444 lua_pushvalue(L, -3); /* move value to the top */
445 lua_rawset(L, -3); /* set last field */
446 lua_pop(L, 2); /* remove value and table */
447 return NULL;
448}
449
450
451
394/*452/*
395** {======================================================453** {======================================================
396** Generic Buffer manipulation454** Generic Buffer manipulation
src/lib/lbaselib.c+13−63
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lbaselib.c,v 1.158 2004/09/15 20:39:42 roberto Exp $2** $Id: lbaselib.c,v 1.161 2004/12/06 17:53:42 roberto Exp $
3** Basic library3** Basic library
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -181,10 +181,10 @@ static int luaB_gcinfo (lua_State *L) { · 175 unmodified lines
181 181
182 182
183static int luaB_collectgarbage (lua_State *L) {183static int luaB_collectgarbage (lua_State *L) {
184 static const char *const opts[] = {"stop", "restart", "collect", "count",184 static const char *const opts[] = {"stop", "restart", "collect",
185 "step", NULL};185 "count", "step", "setstepmul", "setincmode", NULL};
186 static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART,186 static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
187 LUA_GCCOLLECT, LUA_GCCOUNT, LUA_GCSTEP};187 LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETSTEPMUL, LUA_GCSETINCMODE};
188 int o = luaL_findstring(luaL_optstring(L, 1, "collect"), opts);188 int o = luaL_findstring(luaL_optstring(L, 1, "collect"), opts);
189 int ex = luaL_optint(L, 2, 0);189 int ex = luaL_optint(L, 2, 0);
190 luaL_argcheck(L, o >= 0, 1, "invalid option");190 luaL_argcheck(L, o >= 0, 1, "invalid option");
@@ -440,50 +440,6 @@ static int luaB_newproxy (lua_State *L) { · 249 unmodified lines
440}440}
441 441
442 442
443/*
444** {======================================================
445** `require' function
446** =======================================================
447*/
448
449
450static const char *getpath (lua_State *L) {
451 /* try first `LUA_PATH' for compatibility */
452 lua_getfield(L, LUA_GLOBALSINDEX, "LUA_PATH");
453 if (!lua_isstring(L, -1)) {
454 lua_pop(L, 1);
455 lua_getfield(L, LUA_GLOBALSINDEX, "_PATH");
456 }
457 if (!lua_isstring(L, -1))
458 luaL_error(L, "global _PATH must be a string");
459 return lua_tostring(L, -1);
460}
461
462
463static int luaB_require (lua_State *L) {
464 const char *name = luaL_checkstring(L, 1);
465 const char *fname;
466 lua_getfield(L, lua_upvalueindex(1), name);
467 if (lua_toboolean(L, -1)) /* is it there? */
468 return 1; /* package is already loaded; return its result */
469 /* else must load it; first mark it as loaded */
470 lua_pushboolean(L, 1);
471 lua_setfield(L, lua_upvalueindex(1), name); /* _LOADED[name] = true */
472 fname = luaL_searchpath(L, name, getpath(L));
473 if (fname == NULL || luaL_loadfile(L, fname) != 0)
474 return luaL_error(L, "error loading package `%s' (%s)", name,
475 lua_tostring(L, -1));
476 lua_pushvalue(L, 1); /* pass name as argument to module */
477 lua_call(L, 1, 1); /* run loaded module */
478 if (!lua_isnil(L, -1)) /* nil return? */
479 lua_setfield(L, lua_upvalueindex(1), name);
480 lua_getfield(L, lua_upvalueindex(1), name); /* return _LOADED[name] */
481 return 1;
482}
483
484/* }====================================================== */
485
486
487static const luaL_reg base_funcs[] = {443static const luaL_reg base_funcs[] = {
488 {"error", luaB_error},444 {"error", luaB_error},
489 {"getmetatable", luaB_getmetatable},445 {"getmetatable", luaB_getmetatable},
@@ -656,11 +612,10 @@ static void auxopen (lua_State *L, const char *name, · 166 unmodified lines
656 612
657 613
658static void base_open (lua_State *L) {614static void base_open (lua_State *L) {
659 const char *path;
660 lua_pushvalue(L, LUA_GLOBALSINDEX);615 lua_pushvalue(L, LUA_GLOBALSINDEX);
661 luaL_openlib(L, NULL, base_funcs, 0); /* open lib into global table */616 luaL_openlib(L, NULL, base_funcs, 0); /* open lib into global table */
662 lua_pushliteral(L, LUA_VERSION);617 lua_pushliteral(L, LUA_VERSION);
663 lua_setfield(L, LUA_GLOBALSINDEX, "_VERSION"); /* set global _VERSION */618 lua_setglobal(L, "_VERSION"); /* set global _VERSION */
664 /* `ipairs' and `pairs' need auxliliary functions as upvalues */619 /* `ipairs' and `pairs' need auxliliary functions as upvalues */
665 auxopen(L, "ipairs", luaB_ipairs, ipairsaux);620 auxopen(L, "ipairs", luaB_ipairs, ipairsaux);
666 auxopen(L, "pairs", luaB_pairs, luaB_next);621 auxopen(L, "pairs", luaB_pairs, luaB_next);
@@ -671,21 +626,16 @@ static void base_open (lua_State *L) { · 4 unmodified lines
671 lua_pushliteral(L, "kv");626 lua_pushliteral(L, "kv");
672 lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */627 lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */
673 lua_pushcclosure(L, luaB_newproxy, 1);628 lua_pushcclosure(L, luaB_newproxy, 1);
674 lua_setfield(L, LUA_GLOBALSINDEX, "newproxy"); /* set global `newproxy' */629 lua_setglobal(L, "newproxy"); /* set global `newproxy' */
675 /* `require' needs a table to keep loaded chunks */630 /* create register._LOADED to track loaded modules */
631 lua_newtable(L);
632 lua_setfield(L, LUA_REGISTRYINDEX, "_LOADED");
633 /* create register._PRELOAD to allow pre-loaded modules */
676 lua_newtable(L);634 lua_newtable(L);
677 lua_pushvalue(L, -1);635 lua_setfield(L, LUA_REGISTRYINDEX, "_PRELOAD");
678 lua_setglobal(L, "_LOADED");
679 lua_pushcclosure(L, luaB_require, 1);
680 lua_setfield(L, LUA_GLOBALSINDEX, "require");
681 /* set global _G */636 /* set global _G */
682 lua_pushvalue(L, LUA_GLOBALSINDEX);637 lua_pushvalue(L, LUA_GLOBALSINDEX);
683 lua_setfield(L, LUA_GLOBALSINDEX, "_G");638 lua_setglobal(L, "_G");
684 /* set global _PATH */
685 path = getenv(LUA_PATH);
686 if (path == NULL) path = LUA_PATH_DEFAULT;
687 lua_pushstring(L, path);
688 lua_setfield(L, LUA_GLOBALSINDEX, "_PATH");
689}639}
690 640
691 641
src/lib/ldblib.c+5−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldblib.c,v 1.87 2004/08/13 18:02:36 roberto Exp $2** $Id: ldblib.c,v 1.89 2004/11/17 12:02:41 roberto Exp $
3** Interface from Lua to its debug API3** Interface from Lua to its debug API
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -261,7 +261,7 @@ static int debug (lua_State *L) { · 255 unmodified lines
261 if (fgets(buffer, sizeof(buffer), stdin) == 0 ||261 if (fgets(buffer, sizeof(buffer), stdin) == 0 ||
262 strcmp(buffer, "cont\n") == 0)262 strcmp(buffer, "cont\n") == 0)
263 return 0;263 return 0;
264 if (luaL_loadbuffer(L, buffer, strlen(buffer), "=debug command") ||264 if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||
265 lua_pcall(L, 0, 0, 0)) {265 lua_pcall(L, 0, 0, 0)) {
266 fputs(lua_tostring(L, -1), stderr);266 fputs(lua_tostring(L, -1), stderr);
267 fputs("\n", stderr);267 fputs("\n", stderr);
@@ -275,14 +275,15 @@ static int debug (lua_State *L) { · 7 unmodified lines
275#define LEVELS2 10 /* size of the second part of the stack */275#define LEVELS2 10 /* size of the second part of the stack */
276 276
277static int errorfb (lua_State *L) {277static int errorfb (lua_State *L) {
278 int level = 1; /* skip level 0 (it's this function) */278 int level = 0;
279 int firstpart = 1; /* still before eventual `...' */279 int firstpart = 1; /* still before eventual `...' */
280 int arg;280 int arg;
281 lua_State *L1 = getthread(L, &arg);281 lua_State *L1 = getthread(L, &arg);
282 lua_Debug ar;282 lua_Debug ar;
283 if (L == L1) level++; /* skip level 0 (it's this function) */
283 if (lua_gettop(L) == arg)284 if (lua_gettop(L) == arg)
284 lua_pushliteral(L, "");285 lua_pushliteral(L, "");
285 else if (!lua_isstring(L, arg+1)) return 1; /* no string message */286 else if (!lua_isstring(L, arg+1)) return 1; /* message is not a string */
286 else lua_pushliteral(L, "\n");287 else lua_pushliteral(L, "\n");
287 lua_pushliteral(L, "stack traceback:");288 lua_pushliteral(L, "stack traceback:");
288 while (lua_getstack(L1, level++, &ar)) {289 while (lua_getstack(L1, level++, &ar)) {
src/lib/loadlib.c+319−78
@@ -1,31 +1,35 @@
1/*1/*
2** $Id: loadlib.c,v 1.6 2004/04/30 20:13:38 roberto Exp $2** $Id: loadlib.c,v 1.11 2004/11/19 15:52:12 roberto Exp $
3** Dynamic library loader for Lua3** Dynamic library loader for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*5*
6* This Lua library exports a single function, called loadlib, which is6* This Lua library exports a single function, called loadlib, which
7* called from Lua as loadlib(lib,init), where lib is the full name of the7* is called from Lua as loadlib(lib,init), where lib is the full
8* library to be loaded (including the complete path) and init is the name8* name of the library to be loaded (including the complete path) and
9* of a function to be called after the library is loaded. Typically, this9* init is the name of a function to be called after the library is
10* function will register other functions, thus making the complete library10* loaded. Typically, this function will register other functions, thus
11* available to Lua. The init function is *not* automatically called by11* making the complete library available to Lua. The init function is
12* loadlib. Instead, loadlib returns the init function as a Lua function12* *not* automatically called by loadlib. Instead, loadlib returns the
13* that the client can call when it thinks is appropriate. In the case of13* init function as a Lua function that the client can call when it
14* errors, loadlib returns nil and two strings describing the error.14* thinks is appropriate. In the case of errors, loadlib returns nil and
15* The first string is supplied by the operating system; it should be15* two strings describing the error. The first string is supplied by
16* informative and useful for error messages. The second string is "open",16* the operating system; it should be informative and useful for error
17* "init", or "absent" to identify the error and is meant to be used for17* messages. The second string is "open", "init", or "absent" to identify
18* making decisions without having to look into the first string (whose18* the error and is meant to be used for making decisions without having
19* format is system-dependent).19* to look into the first string (whose format is system-dependent).
20*20* This module contains an implementation of loadlib for Unix systems
21* This module contains an implementation of loadlib for Unix systems that21* that have dlfcn, an implementation for Darwin (Mac OS X), an
22* have dlfcn, an implementation for Windows, and a stub for other systems.22* implementation for Windows, and a stub for other systems. See
23* See the list at the end of this file for some links to available23* the list at the end of this file for some links to available
24* implementations of dlfcn and interfaces to other native dynamic loaders24* implementations of dlfcn and interfaces to other native dynamic
25* on top of which loadlib could be implemented.25* loaders on top of which loadlib could be implemented.
26*
27*/26*/
28 27
28
29#include <stdlib.h>
30#include <string.h>
31
32
29#define loadlib_c33#define loadlib_c
30#define LUA_LIB34#define LUA_LIB
31 35
@@ -34,11 +38,14 @@ · 2 unmodified lines
34#include "lualib.h"38#include "lualib.h"
35 39
36 40
37#undef LOADLIB41#define ERR_OPEN 1
42#define ERR_FUNCTION 2
43
44
45static void registerlib (lua_State *L, const void *lib);
38 46
39 47
40#ifdef USE_DLOPEN48#if defined(USE_DLOPEN)
41#define LOADLIB
42/*49/*
43* This is an implementation of loadlib based on the dlfcn interface.50* This is an implementation of loadlib based on the dlfcn interface.
44* The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,51* The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD,
@@ -48,53 +55,41 @@ · 3 unmodified lines
48 55
49#include <dlfcn.h>56#include <dlfcn.h>
50 57
51static int loadlib(lua_State *L)58#define freelib dlclose
59
60static int loadlib(lua_State *L, const char *path, const char *init)
52{61{
53 const char *path=luaL_checkstring(L,1);
54 const char *init=luaL_checkstring(L,2);
55 void *lib=dlopen(path,RTLD_NOW);62 void *lib=dlopen(path,RTLD_NOW);
56 if (lib!=NULL)63 if (lib!=NULL)
57 {64 {
58 lua_CFunction f=(lua_CFunction) dlsym(lib,init);65 lua_CFunction f=(lua_CFunction) dlsym(lib,init);
59 if (f!=NULL)66 if (f!=NULL)
60 {67 {
61 lua_pushlightuserdata(L,lib);68 registerlib(L, lib);
62 lua_pushcclosure(L,f,1);69 lua_pushcfunction(L,f);
63 return 1;70 return 0;
64 }71 }
65 }72 }
66 /* else return appropriate error messages */73 /* else return appropriate error message */
67 lua_pushnil(L);
68 lua_pushstring(L,dlerror());74 lua_pushstring(L,dlerror());
69 lua_pushstring(L,(lib!=NULL) ? "init" : "open");75 if (lib!=NULL) {
70 if (lib!=NULL) dlclose(lib);76 dlclose(lib);
71 return 3;77 return ERR_FUNCTION; /* error loading function */
78 }
79 else return ERR_OPEN; /* error loading library */
72}80}
73 81
74#endif
75
76
77
78/*
79** In Windows, default is to use dll; otherwise, default is not to use dll
80*/
81#ifndef USE_DLL
82#ifdef _WIN32
83#define USE_DLL 1
84#else
85#define USE_DLL 0
86#endif
87#endif
88 82
89 83
90#if USE_DLL84#elif defined(USE_DLL)
91#define LOADLIB
92/*85/*
93* This is an implementation of loadlib for Windows using native functions.86* This is an implementation of loadlib for Windows using native functions.
94*/87*/
95 88
96#include <windows.h>89#include <windows.h>
97 90
91#define freelib(lib) FreeLibrary((HINSTANCE)lib)
92
98static void pusherror(lua_State *L)93static void pusherror(lua_State *L)
99{94{
100 int error=GetLastError();95 int error=GetLastError();
@@ -106,61 +101,310 @@ static void pusherror(lua_State *L) · 5 unmodified lines
106 lua_pushfstring(L,"system error %d\n",error);101 lua_pushfstring(L,"system error %d\n",error);
107}102}
108 103
109static int loadlib(lua_State *L)104static int loadlib(lua_State *L, const char *path, const char *init)
110{105{
111 const char *path=luaL_checkstring(L,1);
112 const char *init=luaL_checkstring(L,2);
113 HINSTANCE lib=LoadLibrary(path);106 HINSTANCE lib=LoadLibrary(path);
114 if (lib!=NULL)107 if (lib!=NULL)
115 {108 {
116 lua_CFunction f=(lua_CFunction) GetProcAddress(lib,init);109 lua_CFunction f=(lua_CFunction) GetProcAddress(lib,init);
117 if (f!=NULL)110 if (f!=NULL)
118 {111 {
119 lua_pushlightuserdata(L,lib);112 registerlib(L, lib);
120 lua_pushcclosure(L,f,1);113 lua_pushcfunction(L,f);
121 return 1;114 return 1;
122 }115 }
123 }116 }
124 lua_pushnil(L);
125 pusherror(L);117 pusherror(L);
126 lua_pushstring(L,(lib!=NULL) ? "init" : "open");118 if (lib!=NULL) {
127 if (lib!=NULL) FreeLibrary(lib);119 FreeLibrary(lib);
128 return 3;120 return ERR_OPEN;
121 }
122 else return ERR_FUNCTION;
129}123}
130 124
131#endif
132 125
133 126
127/* Native Mac OS X / Darwin Implementation */
128#elif defined(USE_DYLD)
129
130#include <mach-o/dyld.h>
131
132
133/* Mach cannot unload images (?) */
134#define freelib(lib) ((void)lib)
135
136static void pusherror (lua_State *L)
137{
138 const char *err_str;
139 const char *err_file;
140 NSLinkEditErrors err;
141 int err_num;
142 NSLinkEditError(&err, &err_num, &err_file, &err_str);
143 lua_pushstring(L, err_str);
144}
145
146static int loadlib (lua_State *L, const char *path, const char *init) {
147 const struct mach_header *lib;
148 /* this would be a rare case, but prevents crashing if it happens */
149 if(!_dyld_present()) {
150 lua_pushstring(L,"dyld not present.");
151 return ERR_OPEN;
152 }
153 lib = NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
154 if(lib != NULL) {
155 NSSymbol init_sym = NSLookupSymbolInImage(lib, init,
156 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND |
157 NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR);
158 if(init_sym != NULL) {
159 lua_CFunction f = (lua_CFunction)NSAddressOfSymbol(init_sym);
160 registerlib(L, lib);
161 lua_pushcfunction(L,f);
162 return 0;
163 }
164 }
165 /* else an error ocurred */
166 pusherror(L);
167 /* Can't unload image */
168 return (lib != NULL) ? ERR_FUNCTION : ERR_OPEN;
169}
170
134 171
135#ifndef LOADLIB
136/* Fallback for other systems */
137 172
138/*
139** Those systems support dlopen, so they should have defined USE_DLOPEN.
140** The default (no)implementation gives them a special error message.
141*/
142#if defined(linux) || defined(sun) || defined(sgi) || defined(BSD) || defined(_WIN32)
143#define LOADLIB "`loadlib' not installed (check your Lua configuration)"
144#else173#else
145#define LOADLIB "`loadlib' not supported"174/* Fallback for other systems */
146#endif175
147 176
177#define freelib(lib) ((void)lib)
148 178
149static int loadlib(lua_State *L)179static int loadlib(lua_State *L)
150{180{
181 registerlib(L, NULL); /* to avoid warnings */
151 lua_pushnil(L);182 lua_pushnil(L);
152 lua_pushliteral(L,LOADLIB);183 lua_pushliteral(L,"`loadlib' not supported");
153 lua_pushliteral(L,"absent");184 lua_pushliteral(L,"absent");
154 return 3;185 return 3;
155}186}
187
156#endif188#endif
157 189
158LUALIB_API int luaopen_loadlib (lua_State *L)190
191/*
192** common code for all implementations: put a library into the registry
193** so that, when Lua closes its state, the library's __gc metamethod
194** will be called to unload the library.
195*/
196static void registerlib (lua_State *L, const void *lib)
197{
198 const void **plib = (const void **)lua_newuserdata(L, sizeof(const void *));
199 *plib = lib;
200 luaL_getmetatable(L, "_LOADLIB");
201 lua_setmetatable(L, -2);
202 lua_pushboolean(L, 1);
203 lua_settable(L, LUA_REGISTRYINDEX); /* registry[lib] = true */
204}
205
206/*
207** __gc tag method: calls library's `freelib' function with the lib
208** handle
209*/
210static int gctm (lua_State *L)
159{211{
160 lua_register(L,"loadlib",loadlib);212 void *lib = *(void **)luaL_checkudata(L, 1, "_LOADLIB");
213 freelib(lib);
161 return 0;214 return 0;
162}215}
163 216
217
218static int loadlib1 (lua_State *L) {
219 const char *path=luaL_checkstring(L,1);
220 const char *init=luaL_checkstring(L,2);
221 int res = loadlib(L,path,init);
222 if (res == 0) /* no error? */
223 return 1; /* function is at stack top */
224 else { /* error */
225 lua_pushnil(L);
226 lua_insert(L,-2); /* insert nil before error message */
227 lua_pushstring(L, (res==ERR_OPEN)?"open":"init");
228 return 3;
229 }
230}
231
232
233
234/*
235** {======================================================
236** `require' and `module' functions
237** =======================================================
238*/
239
240
241static const char *loadLua (lua_State *L, const char *fname, const char *name) {
242 const char *path;
243 /* try first `LUA_PATH' for compatibility */
244 lua_getglobal(L, "LUA_PATH");
245 path = lua_tostring(L, -1);
246 if (!path) {
247 lua_pop(L, 1);
248 luaL_getfield(L, LUA_GLOBALSINDEX, "package.path");
249 path = lua_tostring(L, -1);
250 }
251 if (path == NULL)
252 luaL_error(L, "`package.path' must be a string");
253 fname = luaL_searchpath(L, fname, path);
254 if (fname == NULL) return path; /* library not found in this path */
255 if (luaL_loadfile(L, fname) != 0)
256 luaL_error(L, "error loading package `%s' (%s)", name, lua_tostring(L, -1));
257 return NULL; /* library loaded successfully */
258}
259
260
261static const char *loadC (lua_State *L, const char *fname, const char *name) {
262 const char *path;
263 const char *funcname;
264 luaL_getfield(L, LUA_GLOBALSINDEX, "package.cpath");
265 path = lua_tostring(L, -1);
266 if (path == NULL)
267 luaL_error(L, "global _CPATH must be a string");
268 fname = luaL_searchpath(L, fname, path);
269 if (fname == NULL) return path; /* library not found in this path */
270 funcname = luaL_gsub(L, name, ".", "");
271 funcname = lua_pushfstring(L, "%s%s", LUA_POF, funcname);
272 if (loadlib(L, fname, funcname) != 0)
273 luaL_error(L, "error loading package `%s' (%s)", name, lua_tostring(L, -1));
274 return NULL; /* library loaded successfully */
275}
276
277
278static int ll_require (lua_State *L) {
279 const char *name = luaL_checkstring(L, 1);
280 lua_settop(L, 1);
281 lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
282 lua_getfield(L, 2, name);
283 if (lua_toboolean(L, -1)) /* is it there? */
284 return 1; /* package is already loaded; return its result */
285 /* else must load it; first mark it as loaded */
286 lua_pushboolean(L, 1);
287 lua_setfield(L, 2, name); /* _LOADED[name] = true */
288 /* check whether it is preloaded */
289 lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD");
290 lua_getfield(L, -1, name);
291 if (lua_isnil(L, -1)) { /* no preload function for that module? */
292 const char *fname = luaL_gsub(L, name, ".", LUA_DIRSEP);
293 const char *cpath = loadC(L, fname, name); /* try a C module */
294 if (cpath) { /* not found? */
295 const char *path = loadLua(L, fname, name); /* try a Lua module */
296 if (path) { /* yet not found? */
297 lua_pushnil(L);
298 lua_setfield(L, 2, name); /* unmark _LOADED[name] */
299 return luaL_error(L, "package `%s' not found\n"
300 " cpath: %s\n path: %s",
301 name, cpath, path);
302 }
303 }
304 }
305 lua_pushvalue(L, 1); /* pass name as argument to module */
306 lua_call(L, 1, 1); /* run loaded module */
307 if (!lua_isnil(L, -1)) /* non-nil return? */
308 lua_setfield(L, 2, name); /* update _LOADED[name] with returned value */
309 lua_getfield(L, 2, name); /* return _LOADED[name] */
310 return 1;
311}
312
313
314static void setfenv (lua_State *L) {
315 lua_Debug ar;
316 lua_getstack(L, 1, &ar);
317 lua_getinfo(L, "f", &ar);
318 lua_pushvalue(L, -2);
319 lua_setfenv(L, -2);
320}
321
322
323static int ll_module (lua_State *L) {
324 const char *modname = luaL_checkstring(L, 1);
325 const char *dot;
326 lua_settop(L, 1);
327 lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
328 /* try to find given table */
329 luaL_getfield(L, LUA_GLOBALSINDEX, modname);
330 if (lua_isnil(L, -1)) { /* not found? */
331 lua_pop(L, 1); /* remove previous result */
332 lua_newtable(L); /* create it */
333 /* register it with given name */
334 lua_pushvalue(L, -1);
335 luaL_setfield(L, LUA_GLOBALSINDEX, modname);
336 }
337 else if (!lua_istable(L, -1))
338 return luaL_error(L, "name conflict for module `%s'", modname);
339 /* check whether table already has a _NAME field */
340 lua_getfield(L, -1, "_NAME");
341 if (!lua_isnil(L, -1)) /* is table an initialized module? */
342 lua_pop(L, 1);
343 else { /* no; initialize it */
344 lua_pop(L, 1);
345 lua_newtable(L); /* create new metatable */
346 lua_pushvalue(L, LUA_GLOBALSINDEX);
347 lua_setfield(L, -2, "__index"); /* mt.__index = _G */
348 lua_setmetatable(L, -2);
349 lua_pushstring(L, modname);
350 lua_setfield(L, -2, "_NAME");
351 dot = strrchr(modname, '.'); /* look for last dot in module name */
352 if (dot == NULL) dot = modname;
353 else dot++;
354 /* set _PACKAGE as package name (full module name minus last part) */
355 lua_pushlstring(L, modname, dot - modname);
356 lua_setfield(L, -2, "_PACKAGE");
357 }
358 lua_pushvalue(L, -1);
359 lua_setfield(L, 2, modname); /* _LOADED[modname] = new table */
360 setfenv(L);
361 return 0;
362}
363
364
365/* }====================================================== */
366
367
368static const luaL_reg ll_funcs[] = {
369 {"loadlib", loadlib1},
370 {"require", ll_require},
371 {"module", ll_module},
372 {NULL, NULL}
373};
374
375
376
377LUALIB_API int luaopen_loadlib (lua_State *L) {
378 const char *path;
379 /* create new type _LOADLIB */
380 luaL_newmetatable(L, "_LOADLIB");
381 lua_pushcfunction(L, gctm);
382 lua_setfield(L, -2, "__gc");
383 /* create `package' table */
384 lua_newtable(L);
385 lua_pushvalue(L, -1);
386 lua_setglobal(L, "package");
387 /* set field `path' */
388 path = getenv(LUA_PATH);
389 if (path == NULL) path = LUA_PATH_DEFAULT;
390 lua_pushstring(L, path);
391 lua_setfield(L, -2, "path");
392 /* set field `cpath' */
393 path = getenv(LUA_CPATH);
394 if (path == NULL) path = LUA_CPATH_DEFAULT;
395 lua_pushstring(L, path);
396 lua_setfield(L, -2, "cpath");
397 /* set field `loaded' */
398 lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
399 lua_setfield(L, -2, "loaded");
400 /* set field `preload' */
401 lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD");
402 lua_setfield(L, -2, "preload");
403 lua_pushvalue(L, LUA_GLOBALSINDEX);
404 luaL_openlib(L, NULL, ll_funcs, 0); /* open lib into global table */
405 return 1;
406}
407
164/*408/*
165* Here are some links to available implementations of dlfcn and409* Here are some links to available implementations of dlfcn and
166* interfaces to other native dynamic loaders on top of which loadlib410* interfaces to other native dynamic loaders on top of which loadlib
@@ -179,9 +423,6 @@ LUALIB_API int luaopen_loadlib (lua_State *L) · 12 unmodified lines
179* Macintosh, Windows423* Macintosh, Windows
180* http://www.stat.umn.edu/~luke/xls/projects/dlbasics/dlbasics.html424* http://www.stat.umn.edu/~luke/xls/projects/dlbasics/dlbasics.html
181*425*
182* Mac OS X/Darwin
183* http://www.opendarwin.org/projects/dlcompat/
184*
185* GLIB has wrapper code for BeOS, OS2, Unix and Windows426* GLIB has wrapper code for BeOS, OS2, Unix and Windows
186* http://cvs.gnome.org/lxr/source/glib/gmodule/427* http://cvs.gnome.org/lxr/source/glib/gmodule/
187*428*
src/lib/loslib.c+4−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: loslib.c,v 1.2 2004/08/05 19:30:37 roberto Exp $2** $Id: loslib.c,v 1.3 2004/10/08 18:57:16 roberto Exp $
3** Standard Operating System library3** Standard Operating System library
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -20,7 +20,7 @@ · 14 unmodified lines
20#include "lualib.h"20#include "lualib.h"
21 21
22 22
23static int pushresult (lua_State *L, int i, const char *filename) {23static int os_pushresult (lua_State *L, int i, const char *filename) {
24 if (i) {24 if (i) {
25 lua_pushboolean(L, 1);25 lua_pushboolean(L, 1);
26 return 1;26 return 1;
@@ -45,14 +45,14 @@ static int io_execute (lua_State *L) { · 18 unmodified lines
45 45
46static int io_remove (lua_State *L) {46static int io_remove (lua_State *L) {
47 const char *filename = luaL_checkstring(L, 1);47 const char *filename = luaL_checkstring(L, 1);
48 return pushresult(L, remove(filename) == 0, filename);48 return os_pushresult(L, remove(filename) == 0, filename);
49}49}
50 50
51 51
52static int io_rename (lua_State *L) {52static int io_rename (lua_State *L) {
53 const char *fromname = luaL_checkstring(L, 1);53 const char *fromname = luaL_checkstring(L, 1);
54 const char *toname = luaL_checkstring(L, 2);54 const char *toname = luaL_checkstring(L, 2);
55 return pushresult(L, rename(fromname, toname) == 0, fromname);55 return os_pushresult(L, rename(fromname, toname) == 0, fromname);
56}56}
57 57
58 58
src/lib/lstrlib.c+24−26
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstrlib.c,v 1.106 2004/08/09 13:30:33 roberto Exp $2** $Id: lstrlib.c,v 1.109 2004/12/01 15:46:06 roberto Exp $
3** Standard library for string operations and pattern-matching3** Standard library for string operations and pattern-matching
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -24,8 +24,6 @@ · 18 unmodified lines
24#define uchar(c) ((unsigned char)(c))24#define uchar(c) ((unsigned char)(c))
25 25
26 26
27typedef lua_Integer sint32; /* a signed version for size_t */
28
29 27
30static int str_len (lua_State *L) {28static int str_len (lua_State *L) {
31 size_t l;29 size_t l;
@@ -35,19 +33,19 @@ static int str_len (lua_State *L) { · 3 unmodified lines
35}33}
36 34
37 35
38static sint32 posrelat (sint32 pos, size_t len) {36static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
39 /* relative string position: negative means back from end */37 /* relative string position: negative means back from end */
40 return (pos>=0) ? pos : (sint32)len+pos+1;38 return (pos>=0) ? pos : (ptrdiff_t)len+pos+1;
41}39}
42 40
43 41
44static int str_sub (lua_State *L) {42static int str_sub (lua_State *L) {
45 size_t l;43 size_t l;
46 const char *s = luaL_checklstring(L, 1, &l);44 const char *s = luaL_checklstring(L, 1, &l);
47 sint32 start = posrelat(luaL_checkinteger(L, 2), l);45 ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l);
48 sint32 end = posrelat(luaL_optinteger(L, 3, -1), l);46 ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l);
49 if (start < 1) start = 1;47 if (start < 1) start = 1;
50 if (end > (sint32)l) end = (sint32)l;48 if (end > (ptrdiff_t)l) end = (ptrdiff_t)l;
51 if (start <= end)49 if (start <= end)
52 lua_pushlstring(L, s+start-1, end-start+1);50 lua_pushlstring(L, s+start-1, end-start+1);
53 else lua_pushliteral(L, "");51 else lua_pushliteral(L, "");
@@ -107,8 +105,8 @@ static int str_rep (lua_State *L) { · 53 unmodified lines
107static int str_byte (lua_State *L) {105static int str_byte (lua_State *L) {
108 size_t l;106 size_t l;
109 const char *s = luaL_checklstring(L, 1, &l);107 const char *s = luaL_checklstring(L, 1, &l);
110 sint32 posi = posrelat(luaL_optinteger(L, 2, 1), l);108 ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l);
111 sint32 pose = posrelat(luaL_optinteger(L, 3, posi), l);109 ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l);
112 int n, i;110 int n, i;
113 if (posi <= 0) posi = 1;111 if (posi <= 0) posi = 1;
114 if ((size_t)pose > l) pose = l;112 if ((size_t)pose > l) pose = l;
@@ -173,7 +171,7 @@ typedef struct MatchState { · 58 unmodified lines
173 int level; /* total number of captures (finished or unfinished) */171 int level; /* total number of captures (finished or unfinished) */
174 struct {172 struct {
175 const char *init;173 const char *init;
176 sint32 len;174 ptrdiff_t len;
177 } capture[MAX_CAPTURES];175 } capture[MAX_CAPTURES];
178} MatchState;176} MatchState;
179 177
@@ -198,7 +196,7 @@ static int capture_to_close (MatchState *ms) { · 18 unmodified lines
198}196}
199 197
200 198
201static const char *luaI_classend (MatchState *ms, const char *p) {199static const char *classend (MatchState *ms, const char *p) {
202 switch (*p++) {200 switch (*p++) {
203 case ESC: {201 case ESC: {
204 if (*p == '\0')202 if (*p == '\0')
@@ -250,7 +248,7 @@ static int matchbracketclass (int c, const char *p, const char *ec) { · 45 unmodified lines
250 while (++p < ec) {248 while (++p < ec) {
251 if (*p == ESC) {249 if (*p == ESC) {
252 p++;250 p++;
253 if (match_class(c, *p))251 if (match_class(c, uchar(*p)))
254 return sig;252 return sig;
255 }253 }
256 else if ((*(p+1) == '-') && (p+2 < ec)) {254 else if ((*(p+1) == '-') && (p+2 < ec)) {
@@ -264,10 +262,10 @@ static int matchbracketclass (int c, const char *p, const char *ec) { · 7 unmodified lines
264}262}
265 263
266 264
267static int luaI_singlematch (int c, const char *p, const char *ep) {265static int singlematch (int c, const char *p, const char *ep) {
268 switch (*p) {266 switch (*p) {
269 case '.': return 1; /* matches any char */267 case '.': return 1; /* matches any char */
270 case ESC: return match_class(c, *(p+1));268 case ESC: return match_class(c, uchar(*(p+1)));
271 case '[': return matchbracketclass(c, p, ep-1);269 case '[': return matchbracketclass(c, p, ep-1);
272 default: return (uchar(*p) == c);270 default: return (uchar(*p) == c);
273 }271 }
@@ -299,8 +297,8 @@ static const char *matchbalance (MatchState *ms, const char *s, · 25 unmodified lines
299 297
300static const char *max_expand (MatchState *ms, const char *s,298static const char *max_expand (MatchState *ms, const char *s,
301 const char *p, const char *ep) {299 const char *p, const char *ep) {
302 sint32 i = 0; /* counts maximum expand for item */300 ptrdiff_t i = 0; /* counts maximum expand for item */
303 while ((s+i)<ms->src_end && luaI_singlematch(uchar(*(s+i)), p, ep))301 while ((s+i)<ms->src_end && singlematch(uchar(*(s+i)), p, ep))
304 i++;302 i++;
305 /* keeps trying to match with the maximum repetitions */303 /* keeps trying to match with the maximum repetitions */
306 while (i>=0) {304 while (i>=0) {
@@ -318,7 +316,7 @@ static const char *min_expand (MatchState *ms, const char *s, · 11 unmodified lines
318 const char *res = match(ms, s, ep+1);316 const char *res = match(ms, s, ep+1);
319 if (res != NULL)317 if (res != NULL)
320 return res;318 return res;
321 else if (s<ms->src_end && luaI_singlematch(uchar(*s), p, ep))319 else if (s<ms->src_end && singlematch(uchar(*s), p, ep))
322 s++; /* try with one more repetition */320 s++; /* try with one more repetition */
323 else return NULL;321 else return NULL;
324 }322 }
@@ -385,7 +383,7 @@ static const char *match (MatchState *ms, const char *s, const char *p) { · 60 unmodified lines
385 p += 2;383 p += 2;
386 if (*p != '[')384 if (*p != '[')
387 luaL_error(ms->L, "missing `[' after `%%f' in pattern");385 luaL_error(ms->L, "missing `[' after `%%f' in pattern");
388 ep = luaI_classend(ms, p); /* points to what is next */386 ep = classend(ms, p); /* points to what is next */
389 previous = (s == ms->src_init) ? '\0' : *(s-1);387 previous = (s == ms->src_init) ? '\0' : *(s-1);
390 if (matchbracketclass(uchar(previous), p, ep-1) ||388 if (matchbracketclass(uchar(previous), p, ep-1) ||
391 !matchbracketclass(uchar(*s), p, ep-1)) return NULL;389 !matchbracketclass(uchar(*s), p, ep-1)) return NULL;
@@ -393,7 +391,7 @@ static const char *match (MatchState *ms, const char *s, const char *p) { · 1 unmodified line
393 }391 }
394 default: {392 default: {
395 if (isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */393 if (isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */
396 s = match_capture(ms, s, *(p+1));394 s = match_capture(ms, s, uchar(*(p+1)));
397 if (s == NULL) return NULL;395 if (s == NULL) return NULL;
398 p+=2; goto init; /* else return match(ms, s, p+2) */396 p+=2; goto init; /* else return match(ms, s, p+2) */
399 }397 }
@@ -410,8 +408,8 @@ static const char *match (MatchState *ms, const char *s, const char *p) { · 10 unmodified lines
410 else goto dflt;408 else goto dflt;
411 }409 }
412 default: dflt: { /* it is a pattern item */410 default: dflt: { /* it is a pattern item */
413 const char *ep = luaI_classend(ms, p); /* points to what is next */411 const char *ep = classend(ms, p); /* points to what is next */
414 int m = s<ms->src_end && luaI_singlematch(uchar(*s), p, ep);412 int m = s<ms->src_end && singlematch(uchar(*s), p, ep);
415 switch (*ep) {413 switch (*ep) {
416 case '?': { /* optional */414 case '?': { /* optional */
417 const char *res;415 const char *res;
@@ -490,9 +488,9 @@ static int str_find (lua_State *L) { · 72 unmodified lines
490 size_t l1, l2;488 size_t l1, l2;
491 const char *s = luaL_checklstring(L, 1, &l1);489 const char *s = luaL_checklstring(L, 1, &l1);
492 const char *p = luaL_checklstring(L, 2, &l2);490 const char *p = luaL_checklstring(L, 2, &l2);
493 sint32 init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1;491 ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1;
494 if (init < 0) init = 0;492 if (init < 0) init = 0;
495 else if ((size_t)(init) > l1) init = (sint32)l1;493 else if ((size_t)(init) > l1) init = (ptrdiff_t)l1;
496 if (lua_toboolean(L, 4) || /* explicit request? */494 if (lua_toboolean(L, 4) || /* explicit request? */
497 strpbrk(p, SPECIALS) == NULL) { /* or no special characters? */495 strpbrk(p, SPECIALS) == NULL) { /* or no special characters? */
498 /* do a plain search */496 /* do a plain search */
@@ -642,7 +640,7 @@ static int str_gsub (lua_State *L) { · 143 unmodified lines
642#define MAX_FORMAT 20640#define MAX_FORMAT 20
643 641
644 642
645static void luaI_addquoted (lua_State *L, luaL_Buffer *b, int arg) {643static void addquoted (lua_State *L, luaL_Buffer *b, int arg) {
646 size_t l;644 size_t l;
647 const char *s = luaL_checklstring(L, arg, &l);645 const char *s = luaL_checklstring(L, arg, &l);
648 luaL_putchar(b, '"');646 luaL_putchar(b, '"');
@@ -726,7 +724,7 @@ static int str_format (lua_State *L) { · 77 unmodified lines
726 break;724 break;
727 }725 }
728 case 'q': {726 case 'q': {
729 luaI_addquoted(L, &b, arg);727 addquoted(L, &b, arg);
730 continue; /* skip the `addsize' at the end */728 continue; /* skip the `addsize' at the end */
731 }729 }
732 case 's': {730 case 's': {
src/llex.c+41−35
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: llex.c,v 2.3 2004/04/30 20:13:38 roberto Exp $2** $Id: llex.c,v 2.9 2004/12/03 20:54:12 roberto Exp $
3** Lexical Analyzer3** Lexical Analyzer
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -26,34 +26,45 @@ · 20 unmodified lines
26#define next(ls) (ls->current = zgetc(ls->z))26#define next(ls) (ls->current = zgetc(ls->z))
27 27
28 28
29#define save(ls,c) { \
30 Mbuffer *b = ls->buff; \
31 if (b->n + 1 > b->buffsize) \
32 luaZ_resizebuffer(ls->L, b, ((b->buffsize*2) + LUA_MINBUFFER)); \
33 b->buffer[b->n++] = cast(char, c); }
34
35 29
36 30
37#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r')31#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r')
38 32
39 33
40/* ORDER RESERVED */34/* ORDER RESERVED */
41static const char *const token2string [] = {35const char *const luaX_tokens [] = {
42 "and", "break", "do", "else", "elseif",36 "and", "break", "do", "else", "elseif",
43 "end", "false", "for", "function", "if",37 "end", "false", "for", "function", "if",
44 "in", "local", "nil", "not", "or", "repeat",38 "in", "local", "nil", "not", "or", "repeat",
45 "return", "then", "true", "until", "while", "*name",39 "return", "then", "true", "until", "while",
46 "..", "...", "==", ">=", "<=", "~=",40 "..", "...", "==", ">=", "<=", "~=",
47 "*number", "*string", "<eof>"41 "<number>", "<name>", "<string>", "<eof>",
42 NULL
48};43};
49 44
50 45
46#define save_and_next(ls) (save(ls, ls->current), next(ls))
47
48
49static void save (LexState *ls, int c) {
50 Mbuffer *b = ls->buff;
51 if (b->n + 1 > b->buffsize) {
52 size_t newsize;
53 if (b->buffsize >= MAX_SIZET/2)
54 luaX_lexerror(ls, "lexical element too long", 0);
55 newsize = b->buffsize * 2;
56 luaZ_resizebuffer(ls->L, b, newsize);
57 }
58 b->buffer[b->n++] = cast(char, c);
59}
60
61
51void luaX_init (lua_State *L) {62void luaX_init (lua_State *L) {
52 int i;63 int i;
53 for (i=0; i<NUM_RESERVED; i++) {64 for (i=0; i<NUM_RESERVED; i++) {
54 TString *ts = luaS_new(L, token2string[i]);65 TString *ts = luaS_new(L, luaX_tokens[i]);
55 luaS_fix(ts); /* reserved words are never collected */66 luaS_fix(ts); /* reserved words are never collected */
56 lua_assert(strlen(token2string[i])+1 <= TOKEN_LEN);67 lua_assert(strlen(luaX_tokens[i])+1 <= TOKEN_LEN);
57 ts->tsv.reserved = cast(lu_byte, i+1); /* reserved word */68 ts->tsv.reserved = cast(lu_byte, i+1); /* reserved word */
58 }69 }
59}70}
@@ -64,12 +75,12 @@ void luaX_init (lua_State *L) { · 4 unmodified lines
64 75
65const char *luaX_token2str (LexState *ls, int token) {76const char *luaX_token2str (LexState *ls, int token) {
66 if (token < FIRST_RESERVED) {77 if (token < FIRST_RESERVED) {
67 lua_assert(token == (unsigned char)token);78 lua_assert(token == cast(unsigned char, token));
68 return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) :79 return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) :
69 luaO_pushfstring(ls->L, "%c", token);80 luaO_pushfstring(ls->L, "%c", token);
70 }81 }
71 else82 else
72 return token2string[token-FIRST_RESERVED];83 return luaX_tokens[token-FIRST_RESERVED];
73}84}
74 85
75 86
@@ -130,6 +141,7 @@ void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { · 54 unmodified lines
130 ls->linenumber = 1;141 ls->linenumber = 1;
131 ls->lastline = 1;142 ls->lastline = 1;
132 ls->source = source;143 ls->source = source;
144 luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */
133 next(ls); /* read first char */145 next(ls); /* read first char */
134}146}
135 147
@@ -143,12 +155,6 @@ void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { · 7 unmodified lines
143 155
144 156
145 157
146static void save_and_next (LexState *ls) {
147 save(ls, ls->current);
148 next(ls);
149}
150
151
152 158
153/* LUA_NUMBER */159/* LUA_NUMBER */
154static void read_numeral (LexState *ls, SemInfo *seminfo) {160static void read_numeral (LexState *ls, SemInfo *seminfo) {
@@ -181,12 +187,12 @@ static void read_numeral (LexState *ls, SemInfo *seminfo) { · 26 unmodified lines
181}187}
182 188
183 189
184static int skip_ast (LexState *ls) {190static int skip_sep (LexState *ls) {
185 int count = 0;191 int count = 0;
186 int s = ls->current;192 int s = ls->current;
187 lua_assert(s == '[' || s == ']');193 lua_assert(s == '[' || s == ']');
188 save_and_next(ls);194 save_and_next(ls);
189 while (ls->current == '*') {195 while (ls->current == '=') {
190 save_and_next(ls);196 save_and_next(ls);
191 count++;197 count++;
192 }198 }
@@ -194,7 +200,7 @@ static int skip_ast (LexState *ls) { · 1 unmodified line
194}200}
195 201
196 202
197static void read_long_string (LexState *ls, SemInfo *seminfo, int ast) {203static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
198 int cont = 0;204 int cont = 0;
199 save_and_next(ls); /* skip 2nd `[' */205 save_and_next(ls); /* skip 2nd `[' */
200 if (currIsNewline(ls)) /* string starts with a newline? */206 if (currIsNewline(ls)) /* string starts with a newline? */
@@ -206,13 +212,13 @@ static void read_long_string (LexState *ls, SemInfo *seminfo, int ast) { · 5 unmodified lines
206 "unfinished long comment", TK_EOS);212 "unfinished long comment", TK_EOS);
207 break; /* to avoid warnings */213 break; /* to avoid warnings */
208 case '[':214 case '[':
209 if (skip_ast(ls) == ast) {215 if (skip_sep(ls) == sep) {
210 save_and_next(ls); /* skip 2nd `[' */216 save_and_next(ls); /* skip 2nd `[' */
211 cont++;217 cont++;
212 }218 }
213 continue;219 continue;
214 case ']':220 case ']':
215 if (skip_ast(ls) == ast) {221 if (skip_sep(ls) == sep) {
216 save_and_next(ls); /* skip 2nd `]' */222 save_and_next(ls); /* skip 2nd `]' */
217 if (cont-- == 0) goto endloop;223 if (cont-- == 0) goto endloop;
218 }224 }
@@ -229,8 +235,8 @@ static void read_long_string (LexState *ls, SemInfo *seminfo, int ast) { · 10 unmodified lines
229 }235 }
230 } endloop:236 } endloop:
231 if (seminfo)237 if (seminfo)
232 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + ast),238 seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep),
233 luaZ_bufflen(ls->buff) - 2*(2 + ast));239 luaZ_bufflen(ls->buff) - 2*(2 + sep));
234}240}
235 241
236 242
@@ -305,10 +311,10 @@ int luaX_lex (LexState *ls, SemInfo *seminfo) { · 68 unmodified lines
305 /* else is a comment */311 /* else is a comment */
306 next(ls);312 next(ls);
307 if (ls->current == '[') {313 if (ls->current == '[') {
308 int ast = skip_ast(ls);314 int sep = skip_sep(ls);
309 luaZ_resetbuffer(ls->buff); /* `skip_ast' may dirty the buffer */315 luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */
310 if (ast >= 0) {316 if (sep >= 0) {
311 read_long_string(ls, NULL, ast); /* long comment */317 read_long_string(ls, NULL, sep); /* long comment */
312 luaZ_resetbuffer(ls->buff);318 luaZ_resetbuffer(ls->buff);
313 continue;319 continue;
314 }320 }
@@ -319,12 +325,12 @@ int luaX_lex (LexState *ls, SemInfo *seminfo) { · 4 unmodified lines
319 continue;325 continue;
320 }326 }
321 case '[': {327 case '[': {
322 int ast = skip_ast(ls);328 int sep = skip_sep(ls);
323 if (ast >= 0) {329 if (sep >= 0) {
324 read_long_string(ls, seminfo, ast);330 read_long_string(ls, seminfo, sep);
325 return TK_STRING;331 return TK_STRING;
326 }332 }
327 else if (ast == -1) return '[';333 else if (sep == -1) return '[';
328 else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING);334 else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING);
329 }335 }
330 case '=': {336 case '=': {
src/llex.h+7−3
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: llex.h,v 1.50 2004/03/12 19:53:56 roberto Exp $2** $Id: llex.h,v 1.52 2004/12/03 20:54:12 roberto Exp $
3** Lexical Analyzer3** Lexical Analyzer
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -28,14 +28,18 @@ enum RESERVED { · 22 unmodified lines
28 TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,28 TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT,
29 TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,29 TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE,
30 /* other terminal symbols */30 /* other terminal symbols */
31 TK_NAME, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER,31 TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER,
32 TK_STRING, TK_EOS32 TK_NAME, TK_STRING, TK_EOS
33};33};
34 34
35/* number of reserved words */35/* number of reserved words */
36#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1))36#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1))
37 37
38 38
39/* array with token `names' */
40extern const char *const luaX_tokens [];
41
42
39typedef union {43typedef union {
40 lua_Number r;44 lua_Number r;
41 TString *ts;45 TString *ts;
src/llimits.h+6−17
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: llimits.h,v 1.60 2004/09/10 17:30:46 roberto Exp $2** $Id: llimits.h,v 1.61 2004/11/24 18:55:56 roberto Exp $
3** Limits, basic types, and some other `installation-dependent' definitions3** Limits, basic types, and some other `installation-dependent' definitions
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -18,22 +18,9 @@ · 12 unmodified lines
18 18
19typedef LUA_UINT32 lu_int32;19typedef LUA_UINT32 lu_int32;
20 20
21typedef LUA_INT32 l_int32;21typedef LU_MEM lu_mem;
22 22
23 23typedef L_MEM l_mem;
24/*
25** an unsigned integer big enough to count the total memory used by Lua;
26** it should be at least as large as `size_t'
27*/
28typedef lu_int32 lu_mem;
29
30
31/*
32** a signed integer big enough to count the total memory used by Lua;
33** it should be at least as large as `size_t'
34*/
35typedef l_int32 l_mem;
36#define MAXLMEM LUA_MAXINT32
37 24
38 25
39 26
@@ -43,6 +30,8 @@ typedef unsigned char lu_byte; · 3 unmodified lines
43 30
44#define MAX_SIZET ((size_t)(~(size_t)0)-2)31#define MAX_SIZET ((size_t)(~(size_t)0)-2)
45 32
33#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2)
34
46 35
47#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */36#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */
48 37
@@ -51,7 +40,7 @@ typedef unsigned char lu_byte; · 2 unmodified lines
51** this is for hashing only; there is no problem if the integer40** this is for hashing only; there is no problem if the integer
52** cannot hold the whole pointer value41** cannot hold the whole pointer value
53*/42*/
54#define IntPoint(p) ((unsigned int)(p))43#define IntPoint(p) ((unsigned int)(lu_mem)(p))
55 44
56 45
57 46
src/lmem.c+14−11
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lmem.c,v 1.65 2004/08/30 13:44:44 roberto Exp $2** $Id: lmem.c,v 1.67 2004/12/01 15:46:18 roberto Exp $
3** Interface to Memory Manager3** Interface to Memory Manager
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -43,36 +43,39 @@ · 37 unmodified lines
43#define MINSIZEARRAY 443#define MINSIZEARRAY 4
44 44
45 45
46void *luaM_growaux (lua_State *L, void *block, int *size, int size_elems,46void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems,
47 int limit, const char *errormsg) {47 int limit, const char *errormsg) {
48 void *newblock;48 void *newblock;
49 int newsize;49 int newsize;
50 if (*size >= limit/2) { /* cannot double it? */50 if (*size >= limit/2) { /* cannot double it? */
51 if (*size >= limit - MINSIZEARRAY) /* try something smaller... */51 if (*size >= limit) /* cannot grow even a little? */
52 luaG_runerror(L, errormsg);52 luaG_runerror(L, errormsg);
53 newsize = limit; /* still have at least MINSIZEARRAY free places */53 newsize = limit; /* still have at least one free place */
54 }54 }
55 else {55 else {
56 newsize = (*size)*2;56 newsize = (*size)*2;
57 if (newsize < MINSIZEARRAY)57 if (newsize < MINSIZEARRAY)
58 newsize = MINSIZEARRAY; /* minimum size */58 newsize = MINSIZEARRAY; /* minimum size */
59 }59 }
60 newblock = luaM_realloc(L, block,60 newblock = luaM_reallocv(L, block, *size, newsize, size_elems);
61 cast(lu_mem, *size)*cast(lu_mem, size_elems),
62 cast(lu_mem, newsize)*cast(lu_mem, size_elems));
63 *size = newsize; /* update only when everything else is OK */61 *size = newsize; /* update only when everything else is OK */
64 return newblock;62 return newblock;
65}63}
66 64
67 65
66void *luaM_toobig (lua_State *L) {
67 luaG_runerror(L, "memory allocation error: block too big");
68 return NULL; /* to avoid warnings */
69}
70
71
72
68/*73/*
69** generic allocation routine.74** generic allocation routine.
70*/75*/
71void *luaM_realloc (lua_State *L, void *block, lu_mem osize, lu_mem nsize) {76void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
72 global_State *g = G(L);77 global_State *g = G(L);
73 lua_assert((osize == 0) == (block == NULL));78 lua_assert((osize == 0) == (block == NULL));
74 if (nsize >= MAX_SIZET)
75 luaG_runerror(L, "memory allocation error: block too big");
76 block = (*g->realloc)(g->ud, block, osize, nsize);79 block = (*g->realloc)(g->ud, block, osize, nsize);
77 if (block == NULL && nsize > 0)80 if (block == NULL && nsize > 0)
78 luaD_throw(L, LUA_ERRMEM);81 luaD_throw(L, LUA_ERRMEM);
src/lmem.h+22−16
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lmem.h,v 1.26 2002/05/01 20:40:42 roberto Exp $2** $Id: lmem.h,v 1.29 2004/12/01 15:46:18 roberto Exp $
3** Interface to Memory Manager3** Interface to Memory Manager
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -16,28 +16,34 @@ · 10 unmodified lines
16#define MEMERRMSG "not enough memory"16#define MEMERRMSG "not enough memory"
17 17
18 18
19void *luaM_realloc (lua_State *L, void *oldblock, lu_mem oldsize, lu_mem size);19void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, size_t size);
20 20
21void *luaM_growaux (lua_State *L, void *block, int *size, int size_elem,21void *luaM_toobig (lua_State *L);
22 int limit, const char *errormsg);
23 22
24#define luaM_free(L, b, s) luaM_realloc(L, (b), (s), 0)23#define luaM_reallocv(L,b,on,n,e) \
25#define luaM_freelem(L, b) luaM_realloc(L, (b), sizeof(*(b)), 0)24 ((cast(unsigned int, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \
26#define luaM_freearray(L, b, n, t) luaM_realloc(L, (b), \25 luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \
27 cast(lu_mem, n)*cast(lu_mem, sizeof(t)), 0)26 luaM_toobig(L))
28 27
29#define luaM_malloc(L, t) luaM_realloc(L, NULL, 0, (t))28
30#define luaM_new(L, t) cast(t *, luaM_malloc(L, sizeof(t)))29void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elem,
31#define luaM_newvector(L, n,t) cast(t *, luaM_malloc(L, \30 int limit, const char *errormsg);
32 cast(lu_mem, n)*cast(lu_mem, sizeof(t))))31
32#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0)
33#define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0)
34#define luaM_freearray(L, b, n, t) luaM_reallocv(L, (b), n, 0, sizeof(t))
35
36#define luaM_malloc(L,t) luaM_realloc_(L, NULL, 0, (t))
37#define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t)))
38#define luaM_newvector(L,n,t) \
39 cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t)))
33 40
34#define luaM_growvector(L,v,nelems,size,t,limit,e) \41#define luaM_growvector(L,v,nelems,size,t,limit,e) \
35 if (((nelems)+1) > (size)) \42 if ((nelems)+1 > (size)) \
36 ((v)=cast(t *, luaM_growaux(L,v,&(size),sizeof(t),limit,e)))43 ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))
37 44
38#define luaM_reallocvector(L, v,oldn,n,t) \45#define luaM_reallocvector(L, v,oldn,n,t) \
39 ((v)=cast(t *, luaM_realloc(L, v,cast(lu_mem, oldn)*cast(lu_mem, sizeof(t)), \46 ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t))))
40 cast(lu_mem, n)*cast(lu_mem, sizeof(t)))))
41 47
42 48
43#endif49#endif
src/lobject.c+16−7
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lobject.c,v 2.4 2004/07/09 16:01:38 roberto Exp $2** $Id: lobject.c,v 2.7 2004/11/24 19:16:03 roberto Exp $
3** Some generic functions over Lua objects3** Some generic functions over Lua objects
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -23,7 +23,7 @@ · 17 unmodified lines
23 23
24 24
25 25
26const TValue luaO_nilobject = {LUA_TNIL, {NULL}};26const TValue luaO_nilobject = {{NULL}, LUA_TNIL};
27 27
28 28
29/*29/*
@@ -31,12 +31,21 @@ const TValue luaO_nilobject = {LUA_TNIL, {NULL}}; · 1 unmodified line
31** (mmmmmxxx), where the real value is (xxx) * 2^(mmmmm)31** (mmmmmxxx), where the real value is (xxx) * 2^(mmmmm)
32*/32*/
33int luaO_int2fb (unsigned int x) {33int luaO_int2fb (unsigned int x) {
34 int m = 0; /* mantissa */34 int e = 0; /* expoent */
35 while (x >= (1<<3)) {35 while (x >= 16) {
36 x = (x+1) >> 1;36 x = (x+1) >> 1;
37 m++;37 e++;
38 }38 }
39 return (m << 3) | cast(int, x);39 if (x < 8) return x;
40 else return ((e+1) << 3) | (cast(int, x) - 8);
41}
42
43
44/* converts back */
45int luaO_fb2int (int x) {
46 int e = (x >> 3) & 31;
47 if (e == 0) return x;
48 else return ((x & 7)+8) << (e - 1);
40}49}
41 50
42 51
@@ -80,7 +89,7 @@ int luaO_str2d (const char *s, lua_Number *result) { · 37 unmodified lines
80 char *endptr;89 char *endptr;
81 lua_Number res = lua_str2number(s, &endptr);90 lua_Number res = lua_str2number(s, &endptr);
82 if (endptr == s) return 0; /* no conversion */91 if (endptr == s) return 0; /* no conversion */
83 while (isspace((unsigned char)(*endptr))) endptr++;92 while (isspace(cast(unsigned char, *endptr))) endptr++;
84 if (*endptr != '\0') return 0; /* invalid trailing characters? */93 if (*endptr != '\0') return 0; /* invalid trailing characters? */
85 *result = res;94 *result = res;
86 return 1;95 return 1;
src/lobject.h+15−7
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lobject.h,v 2.5 2004/05/31 18:51:50 roberto Exp $2** $Id: lobject.h,v 2.8 2004/12/04 18:10:22 roberto Exp $
3** Type definitions for Lua objects3** Type definitions for Lua objects
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -25,6 +25,7 @@ · 19 unmodified lines
25*/25*/
26#define LUA_TPROTO (NUM_TAGS+1)26#define LUA_TPROTO (NUM_TAGS+1)
27#define LUA_TUPVAL (NUM_TAGS+2)27#define LUA_TUPVAL (NUM_TAGS+2)
28#define LUA_TDEADKEY (NUM_TAGS+3)
28 29
29 30
30/*31/*
@@ -64,9 +65,11 @@ typedef union { · 33 unmodified lines
64/*65/*
65** Tagged Values66** Tagged Values
66*/67*/
68
69#define TValuefields Value value; int tt
70
67typedef struct lua_TValue {71typedef struct lua_TValue {
68 int tt;72 TValuefields;
69 Value value;
70} TValue;73} TValue;
71 74
72 75
@@ -158,7 +161,7 @@ typedef struct lua_TValue { · 85 unmodified lines
158 161
159#define setobj(L,obj1,obj2) \162#define setobj(L,obj1,obj2) \
160 { const TValue *o2=(obj2); TValue *o1=(obj1); \163 { const TValue *o2=(obj2); TValue *o1=(obj1); \
161 o1->tt=o2->tt; o1->value = o2->value; \164 o1->value = o2->value; o1->tt=o2->tt; \
162 checkliveness(G(L),o1); }165 checkliveness(G(L),o1); }
163 166
164 167
@@ -308,10 +311,15 @@ typedef union Closure { · 143 unmodified lines
308** Tables311** Tables
309*/312*/
310 313
314typedef struct TKey {
315 TValuefields;
316 struct Node *next; /* for chaining */
317} TKey;
318
319
311typedef struct Node {320typedef struct Node {
312 TValue i_key;
313 TValue i_val;321 TValue i_val;
314 struct Node *next; /* for chaining */322 TKey i_key;
315} Node;323} Node;
316 324
317 325
@@ -345,7 +353,7 @@ extern const TValue luaO_nilobject; · 27 unmodified lines
345 353
346int luaO_log2 (unsigned int x);354int luaO_log2 (unsigned int x);
347int luaO_int2fb (unsigned int x);355int luaO_int2fb (unsigned int x);
348#define fb2int(x) (((x) & 7) << ((x) >> 3))356int luaO_fb2int (int x);
349 357
350int luaO_rawequalObj (const TValue *t1, const TValue *t2);358int luaO_rawequalObj (const TValue *t1, const TValue *t2);
351int luaO_str2d (const char *s, lua_Number *result);359int luaO_str2d (const char *s, lua_Number *result);
src/lopcodes.c+5−6
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lopcodes.c,v 1.28 2004/07/16 13:15:32 roberto Exp $2** $Id: lopcodes.c,v 1.30 2004/12/02 12:59:10 roberto Exp $
3** See Copyright Notice in lua.h3** See Copyright Notice in lua.h
4*/4*/
5 5
@@ -15,7 +15,7 @@ · 9 unmodified lines
15 15
16/* ORDER OP */16/* ORDER OP */
17 17
18const char *const luaP_opnames[NUM_OPCODES] = {18const char *const luaP_opnames[NUM_OPCODES+1] = {
19 "MOVE",19 "MOVE",
20 "LOADK",20 "LOADK",
21 "LOADBOOL",21 "LOADBOOL",
@@ -49,10 +49,10 @@ const char *const luaP_opnames[NUM_OPCODES] = { · 27 unmodified lines
49 "TFORLOOP",49 "TFORLOOP",
50 "TFORPREP",50 "TFORPREP",
51 "SETLIST",51 "SETLIST",
52 "SETLISTO",
53 "CLOSE",52 "CLOSE",
54 "CLOSURE",53 "CLOSURE",
55 "VARARG"54 "VARARG",
55 NULL
56};56};
57 57
58 58
@@ -92,8 +92,7 @@ const lu_byte luaP_opmodes[NUM_OPCODES] = { · 33 unmodified lines
92 ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORPREP */92 ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORPREP */
93 ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TFORLOOP */93 ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TFORLOOP */
94 ,opmode(0, 0, OpArgR, OpArgN, iAsBx) /* OP_TFORPREP */94 ,opmode(0, 0, OpArgR, OpArgN, iAsBx) /* OP_TFORPREP */
95 ,opmode(0, 0, OpArgU, OpArgN, iABx) /* OP_SETLIST */95 ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */
96 ,opmode(0, 0, OpArgU, OpArgN, iABx) /* OP_SETLISTO */
97 ,opmode(0, 0, OpArgN, OpArgN, iABC) /* OP_CLOSE */96 ,opmode(0, 0, OpArgN, OpArgN, iABC) /* OP_CLOSE */
98 ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */97 ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */
99 ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */98 ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */
src/lopcodes.h+10−8
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lopcodes.h,v 1.111 2004/08/04 20:18:13 roberto Exp $2** $Id: lopcodes.h,v 1.114 2004/12/02 12:59:10 roberto Exp $
3** Opcodes for Lua virtual machine3** Opcodes for Lua virtual machine
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -198,8 +198,7 @@ OP_TFORLOOP,/* A C R(A+2), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); · 192 unmodified lines
198OP_TFORPREP,/* A sBx if type(R(A)) == table then R(A+1):=R(A), R(A):=next;198OP_TFORPREP,/* A sBx if type(R(A)) == table then R(A+1):=R(A), R(A):=next;
199 pc+=sBx */199 pc+=sBx */
200 200
201OP_SETLIST,/* A Bx R(A)[Bx-Bx%FPF+i] := R(A+i), 1 <= i <= Bx%FPF+1 */201OP_SETLIST,/* A B C R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B */
202OP_SETLISTO,/* A Bx */
203 202
204OP_CLOSE,/* A close all variables in the stack up to (>=) R(A)*/203OP_CLOSE,/* A close all variables in the stack up to (>=) R(A)*/
205OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n)) */204OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n)) */
@@ -219,11 +218,15 @@ OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */ · 13 unmodified lines
219 next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'.218 next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'.
220 219
221 (*) In OP_VARARG, if (B == 0) then use actual number of varargs and220 (*) In OP_VARARG, if (B == 0) then use actual number of varargs and
222 set top (like in OP_CALL).221 set top (like in OP_CALL with C == 0).
223 222
224 (*) In OP_RETURN, if (B == 0) then return up to `top'223 (*) In OP_RETURN, if (B == 0) then return up to `top'
225 224
226 (*) For comparisons, B specifies what conditions the test should accept.225 (*) In OP_SETLIST, if (B == 0) then B = `top';
226 if (C == 0) then next `instruction' is real C
227
228 (*) For comparisons, A specifies what condition the test should accept
229 (true or false).
227 230
228 (*) All `skips' (pc++) assume that next instruction is a jump231 (*) All `skips' (pc++) assume that next instruction is a jump
229===========================================================================*/232===========================================================================*/
@@ -254,12 +257,11 @@ extern const lu_byte luaP_opmodes[NUM_OPCODES]; · 24 unmodified lines
254#define testTMode(m) (luaP_opmodes[m] & (1 << 7))257#define testTMode(m) (luaP_opmodes[m] & (1 << 7))
255 258
256 259
257extern const char *const luaP_opnames[NUM_OPCODES]; /* opcode names */260extern const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */
258 261
259 262
260/* number of list items to accumulate before a SETLIST instruction */263/* number of list items to accumulate before a SETLIST instruction */
261/* (must be a power of 2) */264#define LFIELDS_PER_FLUSH 50
262#define LFIELDS_PER_FLUSH 32
263 265
264 266
265#endif267#endif
src/lparser.c+16−19
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lparser.c,v 2.5 2004/05/31 18:51:50 roberto Exp $2** $Id: lparser.c,v 2.10 2004/12/03 20:50:25 roberto Exp $
3** Lua Parser3** Lua Parser
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -31,7 +31,7 @@ · 25 unmodified lines
31 31
32#define getlocvar(fs, i) ((fs)->f->locvars[(fs)->actvar[i]])32#define getlocvar(fs, i) ((fs)->f->locvars[(fs)->actvar[i]])
33 33
34#define luaY_checklimit(fs,v,l,m) if ((v)>(l)) luaY_errorlimit(fs,l,m)34#define luaY_checklimit(fs,v,l,m) if ((v)>(l)) errorlimit(fs,l,m)
35 35
36#define enterlevel(ls) if (++(ls)->nestlevel > LUA_MAXPARSERLEVEL) \36#define enterlevel(ls) if (++(ls)->nestlevel > LUA_MAXPARSERLEVEL) \
37 luaX_lexerror(ls, "chunk has too many syntax levels", 0)37 luaX_lexerror(ls, "chunk has too many syntax levels", 0)
@@ -90,7 +90,7 @@ static void error_expected (LexState *ls, int token) { · 52 unmodified lines
90}90}
91 91
92 92
93static void luaY_errorlimit (FuncState *fs, int limit, const char *what) {93static void errorlimit (FuncState *fs, int limit, const char *what) {
94 const char *msg = (fs->f->lineDefined == 0) ?94 const char *msg = (fs->f->lineDefined == 0) ?
95 luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) :95 luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) :
96 luaO_pushfstring(fs->L, "function at line %d has more than %d %s",96 luaO_pushfstring(fs->L, "function at line %d has more than %d %s",
@@ -133,7 +133,7 @@ static void check_match (LexState *ls, int what, int who, int where) { · 36 unmodified lines
133 133
134static TString *str_checkname (LexState *ls) {134static TString *str_checkname (LexState *ls) {
135 TString *ts;135 TString *ts;
136 check_condition(ls, (ls->t.token == TK_NAME), "<name> expected");136 if (ls->t.token != TK_NAME) error_expected(ls, TK_NAME);
137 ts = ls->t.seminfo.ts;137 ts = ls->t.seminfo.ts;
138 next(ls);138 next(ls);
139 return ts;139 return ts;
@@ -157,7 +157,7 @@ static void checkname(LexState *ls, expdesc *e) { · 17 unmodified lines
157}157}
158 158
159 159
160static int luaI_registerlocalvar (LexState *ls, TString *varname) {160static int registerlocalvar (LexState *ls, TString *varname) {
161 FuncState *fs = ls->fs;161 FuncState *fs = ls->fs;
162 Proto *f = fs->f;162 Proto *f = fs->f;
163 int oldsize = f->sizelocvars;163 int oldsize = f->sizelocvars;
@@ -177,8 +177,7 @@ static int luaI_registerlocalvar (LexState *ls, TString *varname) { · 13 unmodified lines
177static void new_localvar (LexState *ls, TString *name, int n) {177static void new_localvar (LexState *ls, TString *name, int n) {
178 FuncState *fs = ls->fs;178 FuncState *fs = ls->fs;
179 luaY_checklimit(fs, fs->nactvar+n+1, MAXVARS, "local variables");179 luaY_checklimit(fs, fs->nactvar+n+1, MAXVARS, "local variables");
180 fs->actvar[fs->nactvar+n] = cast(unsigned short,180 fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name));
181 luaI_registerlocalvar(ls, name));
182}181}
183 182
184 183
@@ -413,7 +412,7 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { · 228 unmodified lines
413/*============================================================*/412/*============================================================*/
414 413
415 414
416static void luaY_field (LexState *ls, expdesc *v) {415static void field (LexState *ls, expdesc *v) {
417 /* field -> ['.' | ':'] NAME */416 /* field -> ['.' | ':'] NAME */
418 FuncState *fs = ls->fs;417 FuncState *fs = ls->fs;
419 expdesc key;418 expdesc key;
@@ -424,7 +423,7 @@ static void luaY_field (LexState *ls, expdesc *v) { · 4 unmodified lines
424}423}
425 424
426 425
427static void luaY_index (LexState *ls, expdesc *v) {426static void yindex (LexState *ls, expdesc *v) {
428 /* index -> '[' expr ']' */427 /* index -> '[' expr ']' */
429 next(ls); /* skip the '[' */428 next(ls); /* skip the '[' */
430 expr(ls, v);429 expr(ls, v);
@@ -460,7 +459,7 @@ static void recfield (LexState *ls, struct ConsControl *cc) { · 29 unmodified lines
460 checkname(ls, &key);459 checkname(ls, &key);
461 }460 }
462 else /* ls->t.token == '[' */461 else /* ls->t.token == '[' */
463 luaY_index(ls, &key);462 yindex(ls, &key);
464 check(ls, '=');463 check(ls, '=');
465 luaK_exp2RK(fs, &key);464 luaK_exp2RK(fs, &key);
466 expr(ls, &val);465 expr(ls, &val);
@@ -475,9 +474,8 @@ static void closelistfield (FuncState *fs, struct ConsControl *cc) { · 8 unmodified lines
475 luaK_exp2nextreg(fs, &cc->v);474 luaK_exp2nextreg(fs, &cc->v);
476 cc->v.k = VVOID;475 cc->v.k = VVOID;
477 if (cc->tostore == LFIELDS_PER_FLUSH) {476 if (cc->tostore == LFIELDS_PER_FLUSH) {
478 luaK_codeABx(fs, OP_SETLIST, cc->t->info, cc->na-1); /* flush */477 luaK_setlist(fs, cc->t->info, cc->na, cc->tostore); /* flush */
479 cc->tostore = 0; /* no more items pending */478 cc->tostore = 0; /* no more items pending */
480 fs->freereg = cc->t->info + 1; /* free registers */
481 }479 }
482}480}
483 481
@@ -486,15 +484,14 @@ static void lastlistfield (FuncState *fs, struct ConsControl *cc) { · 2 unmodified lines
486 if (cc->tostore == 0) return;484 if (cc->tostore == 0) return;
487 if (hasmultret(cc->v.k)) {485 if (hasmultret(cc->v.k)) {
488 luaK_setmultret(fs, &cc->v);486 luaK_setmultret(fs, &cc->v);
489 luaK_codeABx(fs, OP_SETLISTO, cc->t->info, cc->na-1);487 luaK_setlist(fs, cc->t->info, cc->na, LUA_MULTRET);
490 cc->na--; /* do not count last expression (unknown number of elements) */488 cc->na--; /* do not count last expression (unknown number of elements) */
491 }489 }
492 else {490 else {
493 if (cc->v.k != VVOID)491 if (cc->v.k != VVOID)
494 luaK_exp2nextreg(fs, &cc->v);492 luaK_exp2nextreg(fs, &cc->v);
495 luaK_codeABx(fs, OP_SETLIST, cc->t->info, cc->na-1);493 luaK_setlist(fs, cc->t->info, cc->na, cc->tostore);
496 }494 }
497 fs->freereg = cc->t->info + 1; /* free registers */
498}495}
499 496
500 497
@@ -703,13 +700,13 @@ static void primaryexp (LexState *ls, expdesc *v) { · 202 unmodified lines
703 for (;;) {700 for (;;) {
704 switch (ls->t.token) {701 switch (ls->t.token) {
705 case '.': { /* field */702 case '.': { /* field */
706 luaY_field(ls, v);703 field(ls, v);
707 break;704 break;
708 }705 }
709 case '[': { /* `[' exp1 `]' */706 case '[': { /* `[' exp1 `]' */
710 expdesc key;707 expdesc key;
711 luaK_exp2anyreg(fs, v);708 luaK_exp2anyreg(fs, v);
712 luaY_index(ls, &key);709 yindex(ls, &key);
713 luaK_indexed(fs, v, &key);710 luaK_indexed(fs, v, &key);
714 break;711 break;
715 }712 }
@@ -1213,10 +1210,10 @@ static int funcname (LexState *ls, expdesc *v) { · 497 unmodified lines
1213 int needself = 0;1210 int needself = 0;
1214 singlevar(ls, v, 1);1211 singlevar(ls, v, 1);
1215 while (ls->t.token == '.')1212 while (ls->t.token == '.')
1216 luaY_field(ls, v);1213 field(ls, v);
1217 if (ls->t.token == ':') {1214 if (ls->t.token == ':') {
1218 needself = 1;1215 needself = 1;
1219 luaY_field(ls, v);1216 field(ls, v);
1220 }1217 }
1221 return needself;1218 return needself;
1222}1219}
src/lstate.c+6−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstate.c,v 2.14 2004/09/15 20:39:42 roberto Exp $2** $Id: lstate.c,v 2.18 2004/12/06 17:53:42 roberto Exp $
3** Global State3** Global State
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -79,7 +79,7 @@ static void f_luaopen (lua_State *L, void *ud) { · 73 unmodified lines
79 Udata *u; /* head of udata list */79 Udata *u; /* head of udata list */
80 global_State *g = G(L);80 global_State *g = G(L);
81 UNUSED(ud);81 UNUSED(ud);
82 u = cast(Udata *, luaM_malloc(L, sizeudata(0)));82 u = luaM_new(L, Udata);
83 u->uv.len = 0;83 u->uv.len = 0;
84 u->uv.metatable = NULL;84 u->uv.metatable = NULL;
85 g->firstudata = obj2gco(u);85 g->firstudata = obj2gco(u);
@@ -155,7 +155,7 @@ void luaE_freethread (lua_State *L, lua_State *L1) { · 69 unmodified lines
155 luaF_close(L1, L1->stack); /* close all upvalues for this thread */155 luaF_close(L1, L1->stack); /* close all upvalues for this thread */
156 lua_assert(L1->openupval == NULL);156 lua_assert(L1->openupval == NULL);
157 freestack(L, L1);157 freestack(L, L1);
158 luaM_free(L, fromstate(L1), state_size(lua_State));158 luaM_freemem(L, fromstate(L1), state_size(lua_State));
159}159}
160 160
161 161
@@ -191,8 +191,10 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { · 29 unmodified lines
191 g->tmudata = NULL;191 g->tmudata = NULL;
192 setnilvalue(gkey(g->dummynode));192 setnilvalue(gkey(g->dummynode));
193 setnilvalue(gval(g->dummynode));193 setnilvalue(gval(g->dummynode));
194 g->dummynode->next = NULL;194 gnext(g->dummynode) = NULL;
195 g->totalbytes = sizeof(LG);195 g->totalbytes = sizeof(LG);
196 g->stepmul = STEPMUL;
197 g->incgc = 1;
196 if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) {198 if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) {
197 /* memory allocation error: free partial state */199 /* memory allocation error: free partial state */
198 close_state(L);200 close_state(L);
src/lstate.h+3−1
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstate.h,v 2.8 2004/09/15 20:39:42 roberto Exp $2** $Id: lstate.h,v 2.9 2004/12/06 17:53:42 roberto Exp $
3** Global State3** Global State
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -85,6 +85,8 @@ typedef struct global_State { · 79 unmodified lines
85 lu_mem totalbytes; /* number of bytes currently allocated */85 lu_mem totalbytes; /* number of bytes currently allocated */
86 lu_mem estimate; /* an estimate of number of bytes actually in use */86 lu_mem estimate; /* an estimate of number of bytes actually in use */
87 lu_mem prevestimate; /* previous estimate */87 lu_mem prevestimate; /* previous estimate */
88 int stepmul; /* relative `speed' of the GC */
89 int incgc; /* 0 if GC is done non-incrementally */
88 lua_CFunction panic; /* to be called in unprotected errors */90 lua_CFunction panic; /* to be called in unprotected errors */
89 TValue _registry;91 TValue _registry;
90 struct lua_State *mainthread;92 struct lua_State *mainthread;
src/lstring.c+9−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstring.c,v 2.3 2004/08/24 20:12:06 roberto Exp $2** $Id: lstring.c,v 2.5 2004/11/24 19:16:03 roberto Exp $
3** String table (keeps all strings handled by Lua)3** String table (keeps all strings handled by Lua)
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -49,8 +49,11 @@ void luaS_resize (lua_State *L, int newsize) { · 43 unmodified lines
49 49
50static TString *newlstr (lua_State *L, const char *str, size_t l,50static TString *newlstr (lua_State *L, const char *str, size_t l,
51 unsigned int h) {51 unsigned int h) {
52 TString *ts = cast(TString *, luaM_malloc(L, sizestring(l)));52 TString *ts;
53 stringtable *tb;53 stringtable *tb;
54 if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char))
55 luaM_toobig(L);
56 ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString)));
54 ts->tsv.len = l;57 ts->tsv.len = l;
55 ts->tsv.hash = h;58 ts->tsv.hash = h;
56 ts->tsv.marked = luaC_white(G(L));59 ts->tsv.marked = luaC_white(G(L));
@@ -75,7 +78,7 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { · 18 unmodified lines
75 size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */78 size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */
76 size_t l1;79 size_t l1;
77 for (l1=l; l1>=step; l1-=step) /* compute hash */80 for (l1=l; l1>=step; l1-=step) /* compute hash */
78 h = h ^ ((h<<5)+(h>>2)+(unsigned char)(str[l1-1]));81 h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1]));
79 for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];82 for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)];
80 o != NULL;83 o != NULL;
81 o = o->gch.next) {84 o = o->gch.next) {
@@ -92,7 +95,9 @@ TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { · 10 unmodified lines
92 95
93Udata *luaS_newudata (lua_State *L, size_t s) {96Udata *luaS_newudata (lua_State *L, size_t s) {
94 Udata *u;97 Udata *u;
95 u = cast(Udata *, luaM_malloc(L, sizeudata(s)));98 if (s > MAX_SIZET - sizeof(Udata))
99 luaM_toobig(L);
100 u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata)));
96 u->uv.marked = luaC_white(G(L)); /* is not finalized */101 u->uv.marked = luaC_white(G(L)); /* is not finalized */
97 u->uv.tt = LUA_TUSERDATA;102 u->uv.tt = LUA_TUSERDATA;
98 u->uv.len = s;103 u->uv.len = s;
src/lstring.h+3−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstring.h,v 1.39 2004/08/24 20:12:06 roberto Exp $2** $Id: lstring.h,v 1.40 2004/11/19 15:52:40 roberto Exp $
3** String table (keep all strings handled by Lua)3** String table (keep all strings handled by Lua)
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -13,10 +13,9 @@ · 7 unmodified lines
13#include "lstate.h"13#include "lstate.h"
14 14
15 15
16#define sizestring(l) (cast(lu_mem, sizeof(union TString))+ \16#define sizestring(s) (sizeof(union TString)+((s)->len+1)*sizeof(char))
17 (cast(lu_mem, l)+1)*sizeof(char))
18 17
19#define sizeudata(l) (cast(lu_mem, sizeof(union Udata))+(l))18#define sizeudata(u) (sizeof(union Udata)+(u)->len)
20 19
21#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s)))20#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s)))
22#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \21#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \
src/ltable.c+45−40
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ltable.c,v 2.5 2004/08/31 17:57:33 roberto Exp $2** $Id: ltable.c,v 2.12 2004/12/04 18:10:22 roberto Exp $
3** Lua tables (hash)3** Lua tables (hash)
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -38,7 +38,7 @@ · 32 unmodified lines
38** max size of array part is 2^MAXBITS38** max size of array part is 2^MAXBITS
39*/39*/
40#if LUA_BITSINT > 2640#if LUA_BITSINT > 26
41#define MAXBITS 2441#define MAXBITS 26
42#else42#else
43#define MAXBITS (LUA_BITSINT-2)43#define MAXBITS (LUA_BITSINT-2)
44#endif44#endif
@@ -107,11 +107,10 @@ Node *luaH_mainposition (const Table *t, const TValue *key) { · 62 unmodified lines
107** returns the index for `key' if `key' is an appropriate key to live in107** returns the index for `key' if `key' is an appropriate key to live in
108** the array part of the table, -1 otherwise.108** the array part of the table, -1 otherwise.
109*/109*/
110static int arrayindex (const TValue *key, lua_Number lim) {110static int arrayindex (const TValue *key) {
111 if (ttisnumber(key)) {111 if (ttisnumber(key)) {
112 lua_Number n = nvalue(key);112 lua_Number n = nvalue(key);
113 int k;113 int k;
114 if (n <= 0 || n > lim) return -1; /* out of range? */
115 lua_number2int(k, n);114 lua_number2int(k, n);
116 if (cast(lua_Number, k) == nvalue(key))115 if (cast(lua_Number, k) == nvalue(key))
117 return k;116 return k;
@@ -123,28 +122,35 @@ static int arrayindex (const TValue *key, lua_Number lim) { · 5 unmodified lines
123/*122/*
124** returns the index of a `key' for table traversals. First goes all123** returns the index of a `key' for table traversals. First goes all
125** elements in the array part, then elements in the hash part. The124** elements in the array part, then elements in the hash part. The
126** beginning and end of a traversal are signalled by -1.125** beginning of a traversal is signalled by -1.
127*/126*/
128static int luaH_index (lua_State *L, Table *t, StkId key) {127static int findindex (lua_State *L, Table *t, StkId key) {
129 int i;128 int i;
130 if (ttisnil(key)) return -1; /* first iteration */129 if (ttisnil(key)) return -1; /* first iteration */
131 i = arrayindex(key, t->sizearray);130 i = arrayindex(key);
132 if (0 <= i) { /* is `key' inside array part? */131 if (0 < i && i <= t->sizearray) /* is `key' inside array part? */
133 return i-1; /* yes; that's the index (corrected to C) */132 return i-1; /* yes; that's the index (corrected to C) */
134 }
135 else {133 else {
136 const TValue *v = luaH_get(t, key);134 Node *n = luaH_mainposition(t, key);
137 if (v == &luaO_nilobject)135 do { /* check whether `key' is somewhere in the chain */
138 luaG_runerror(L, "invalid key for `next'");136 /* key may be dead already, but it is ok to use it in `next' */
139 i = cast(int, (cast(const lu_byte *, v) -137 if (luaO_rawequalObj(key2tval(n), key) ||
140 cast(const lu_byte *, gval(gnode(t, 0)))) / sizeof(Node));138 (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) &&
141 return i + t->sizearray; /* hash elements are numbered after array ones */139 gcvalue(gkey(n)) == gcvalue(key))) {
140 i = n - gnode(t, 0); /* key index in hash table */
141 /* hash elements are numbered after array ones */
142 return i + t->sizearray;
143 }
144 else n = gnext(n);
145 } while (n);
146 luaG_runerror(L, "invalid key for `next'"); /* key not found */
147 return 0; /* to avoid warnings */
142 }148 }
143}149}
144 150
145 151
146int luaH_next (lua_State *L, Table *t, StkId key) {152int luaH_next (lua_State *L, Table *t, StkId key) {
147 int i = luaH_index(L, t, key); /* find original element */153 int i = findindex(L, t, key); /* find original element */
148 for (i++; i < t->sizearray; i++) { /* try first array part */154 for (i++; i < t->sizearray; i++) { /* try first array part */
149 if (!ttisnil(&t->array[i])) { /* a non-nil value? */155 if (!ttisnil(&t->array[i])) { /* a non-nil value? */
150 setnvalue(key, cast(lua_Number, i+1));156 setnvalue(key, cast(lua_Number, i+1));
@@ -154,7 +160,7 @@ int luaH_next (lua_State *L, Table *t, StkId key) { · 3 unmodified lines
154 }160 }
155 for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */161 for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */
156 if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */162 if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */
157 setobj2s(L, key, gkey(gnode(t, i)));163 setobj2s(L, key, key2tval(gnode(t, i)));
158 setobj2s(L, key+1, gval(gnode(t, i)));164 setobj2s(L, key+1, gval(gnode(t, i)));
159 return 1;165 return 1;
160 }166 }
@@ -195,7 +201,6 @@ static void numuse (const Table *t, int *narray, int *nhash) { · 34 unmodified lines
195 int nums[MAXBITS+1];201 int nums[MAXBITS+1];
196 int i, lg;202 int i, lg;
197 int totaluse = 0;203 int totaluse = 0;
198 lua_Number sizelimit; /* an upper bound for the array size */
199 /* count elements in array part */204 /* count elements in array part */
200 for (i=0, lg=0; lg<=MAXBITS; lg++) { /* for each slice [2^(lg-1) to 2^lg) */205 for (i=0, lg=0; lg<=MAXBITS; lg++) { /* for each slice [2^(lg-1) to 2^lg) */
201 int ttlg = twoto(lg); /* 2^lg */206 int ttlg = twoto(lg); /* 2^lg */
@@ -215,14 +220,11 @@ static void numuse (const Table *t, int *narray, int *nhash) { · 13 unmodified lines
215 *narray = totaluse; /* all previous uses were in array part */220 *narray = totaluse; /* all previous uses were in array part */
216 /* count elements in hash part */221 /* count elements in hash part */
217 i = sizenode(t);222 i = sizenode(t);
218 /* array part cannot be larger than twice the maximum number of elements */
219 sizelimit = cast(lua_Number, totaluse + i) * 2;
220 if (sizelimit >= MAXASIZE) sizelimit = MAXASIZE;
221 while (i--) {223 while (i--) {
222 Node *n = &t->node[i];224 Node *n = &t->node[i];
223 if (!ttisnil(gval(n))) {225 if (!ttisnil(gval(n))) {
224 int k = arrayindex(gkey(n), sizelimit);226 int k = arrayindex(key2tval(n));
225 if (k >= 0) { /* is `key' an appropriate array index? */227 if (0 < k && k <= MAXASIZE) { /* is `key' an appropriate array index? */
226 nums[luaO_log2(k-1)+1]++; /* count as such */228 nums[luaO_log2(k-1)+1]++; /* count as such */
227 (*narray)++;229 (*narray)++;
228 }230 }
@@ -251,12 +253,12 @@ static void setnodevector (lua_State *L, Table *t, int lsize) { · 22 unmodified lines
251 t->node = G(L)->dummynode; /* use common `dummynode' */253 t->node = G(L)->dummynode; /* use common `dummynode' */
252 lua_assert(ttisnil(gkey(t->node))); /* assert invariants: */254 lua_assert(ttisnil(gkey(t->node))); /* assert invariants: */
253 lua_assert(ttisnil(gval(t->node)));255 lua_assert(ttisnil(gval(t->node)));
254 lua_assert(t->node->next == NULL); /* (`dummynode' must be empty) */256 lua_assert(gnext(t->node) == NULL); /* (`dummynode' must be empty) */
255 }257 }
256 else {258 else {
257 t->node = luaM_newvector(L, size, Node);259 t->node = luaM_newvector(L, size, Node);
258 for (i=0; i<size; i++) {260 for (i=0; i<size; i++) {
259 t->node[i].next = NULL;261 gnext(&t->node[i]) = NULL;
260 setnilvalue(gkey(gnode(t, i)));262 setnilvalue(gkey(gnode(t, i)));
261 setnilvalue(gval(gnode(t, i)));263 setnilvalue(gval(gnode(t, i)));
262 }264 }
@@ -280,7 +282,7 @@ void luaH_resize (lua_State *L, Table *t, int nasize, int nhsize) { · 17 unmodified lines
280 nold = temp;282 nold = temp;
281 setnilvalue(gkey(G(L)->dummynode)); /* restate invariant */283 setnilvalue(gkey(G(L)->dummynode)); /* restate invariant */
282 setnilvalue(gval(G(L)->dummynode));284 setnilvalue(gval(G(L)->dummynode));
283 lua_assert(G(L)->dummynode->next == NULL);285 lua_assert(gnext(G(L)->dummynode) == NULL);
284 }286 }
285 if (nasize > oldasize) /* array part must grow? */287 if (nasize > oldasize) /* array part must grow? */
286 setarrayvector(L, t, nasize);288 setarrayvector(L, t, nasize);
@@ -301,7 +303,7 @@ void luaH_resize (lua_State *L, Table *t, int nasize, int nhsize) { · 14 unmodified lines
301 for (i = twoto(oldhsize) - 1; i >= 0; i--) {303 for (i = twoto(oldhsize) - 1; i >= 0; i--) {
302 Node *old = nold+i;304 Node *old = nold+i;
303 if (!ttisnil(gval(old)))305 if (!ttisnil(gval(old)))
304 setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old));306 setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old));
305 }307 }
306 if (oldhsize)308 if (oldhsize)
307 luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */309 luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */
@@ -341,7 +343,7 @@ void luaH_free (lua_State *L, Table *t) { · 33 unmodified lines
341 if (t->lsizenode)343 if (t->lsizenode)
342 luaM_freearray(L, t->node, sizenode(t), Node);344 luaM_freearray(L, t->node, sizenode(t), Node);
343 luaM_freearray(L, t->array, t->sizearray, TValue);345 luaM_freearray(L, t->array, t->sizearray, TValue);
344 luaM_freelem(L, t);346 luaM_free(L, t);
345}347}
346 348
347 349
@@ -357,24 +359,25 @@ static TValue *newkey (lua_State *L, Table *t, const TValue *key) { · 9 unmodified lines
357 TValue *val;359 TValue *val;
358 Node *mp = luaH_mainposition(t, key);360 Node *mp = luaH_mainposition(t, key);
359 if (!ttisnil(gval(mp))) { /* main position is not free? */361 if (!ttisnil(gval(mp))) { /* main position is not free? */
360 Node *othern = luaH_mainposition(t, gkey(mp)); /* `mp' of colliding node */362 /* `mp' of colliding node */
363 Node *othern = luaH_mainposition(t, key2tval(mp));
361 Node *n = t->firstfree; /* get a free place */364 Node *n = t->firstfree; /* get a free place */
362 if (othern != mp) { /* is colliding node out of its main position? */365 if (othern != mp) { /* is colliding node out of its main position? */
363 /* yes; move colliding node into free position */366 /* yes; move colliding node into free position */
364 while (othern->next != mp) othern = othern->next; /* find previous */367 while (gnext(othern) != mp) othern = gnext(othern); /* find previous */
365 othern->next = n; /* redo the chain with `n' in place of `mp' */368 gnext(othern) = n; /* redo the chain with `n' in place of `mp' */
366 *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */369 *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */
367 mp->next = NULL; /* now `mp' is free */370 gnext(mp) = NULL; /* now `mp' is free */
368 setnilvalue(gval(mp));371 setnilvalue(gval(mp));
369 }372 }
370 else { /* colliding node is in its own main position */373 else { /* colliding node is in its own main position */
371 /* new node will go into free position */374 /* new node will go into free position */
372 n->next = mp->next; /* chain new position */375 gnext(n) = gnext(mp); /* chain new position */
373 mp->next = n;376 gnext(mp) = n;
374 mp = n;377 mp = n;
375 }378 }
376 }379 }
377 setobj2t(L, gkey(mp), key);380 gkey(mp)->value = key->value; gkey(mp)->tt = key->tt;
378 luaC_barriert(L, t, key);381 luaC_barriert(L, t, key);
379 lua_assert(ttisnil(gval(mp)));382 lua_assert(ttisnil(gval(mp)));
380 for (;;) { /* correct `firstfree' */383 for (;;) { /* correct `firstfree' */
@@ -397,7 +400,8 @@ static TValue *newkey (lua_State *L, Table *t, const TValue *key) { · 16 unmodified lines
397** search function for integers400** search function for integers
398*/401*/
399const TValue *luaH_getnum (Table *t, int key) {402const TValue *luaH_getnum (Table *t, int key) {
400 if (1 <= key && key <= t->sizearray)403 /* (1 <= key && key <= t->sizearray) */
404 if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray))
401 return &t->array[key-1];405 return &t->array[key-1];
402 else {406 else {
403 lua_Number nk = cast(lua_Number, key);407 lua_Number nk = cast(lua_Number, key);
@@ -405,7 +409,7 @@ const TValue *luaH_getnum (Table *t, int key) { · 1 unmodified line
405 do { /* check whether `key' is somewhere in the chain */409 do { /* check whether `key' is somewhere in the chain */
406 if (ttisnumber(gkey(n)) && nvalue(gkey(n)) == nk)410 if (ttisnumber(gkey(n)) && nvalue(gkey(n)) == nk)
407 return gval(n); /* that's it */411 return gval(n); /* that's it */
408 else n = n->next;412 else n = gnext(n);
409 } while (n);413 } while (n);
410 return &luaO_nilobject;414 return &luaO_nilobject;
411 }415 }
@@ -420,7 +424,7 @@ const TValue *luaH_getstr (Table *t, TString *key) { · 8 unmodified lines
420 do { /* check whether `key' is somewhere in the chain */424 do { /* check whether `key' is somewhere in the chain */
421 if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key)425 if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key)
422 return gval(n); /* that's it */426 return gval(n); /* that's it */
423 else n = n->next;427 else n = gnext(n);
424 } while (n);428 } while (n);
425 return &luaO_nilobject;429 return &luaO_nilobject;
426}430}
@@ -443,8 +447,9 @@ const TValue *luaH_get (Table *t, const TValue *key) { · 16 unmodified lines
443 default: {447 default: {
444 Node *n = luaH_mainposition(t, key);448 Node *n = luaH_mainposition(t, key);
445 do { /* check whether `key' is somewhere in the chain */449 do { /* check whether `key' is somewhere in the chain */
446 if (luaO_rawequalObj(gkey(n), key)) return gval(n); /* that's it */450 if (luaO_rawequalObj(key2tval(n), key))
447 else n = n->next;451 return gval(n); /* that's it */
452 else n = gnext(n);
448 } while (n);453 } while (n);
449 return &luaO_nilobject;454 return &luaO_nilobject;
450 }455 }
src/ltable.h+4−1
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ltable.h,v 2.2 2004/03/26 14:02:41 roberto Exp $2** $Id: ltable.h,v 2.3 2004/10/06 18:34:16 roberto Exp $
3** Lua tables (hash)3** Lua tables (hash)
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -13,6 +13,9 @@ · 7 unmodified lines
13#define gnode(t,i) (&(t)->node[i])13#define gnode(t,i) (&(t)->node[i])
14#define gkey(n) (&(n)->i_key)14#define gkey(n) (&(n)->i_key)
15#define gval(n) (&(n)->i_val)15#define gval(n) (&(n)->i_val)
16#define gnext(n) ((n)->i_key.next)
17
18#define key2tval(n) (cast(const TValue *, gkey(n)))
16 19
17 20
18const TValue *luaH_getnum (Table *t, int key);21const TValue *luaH_getnum (Table *t, int key);
src/lua/lua.c+4−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lua.c,v 1.132 2004/08/30 18:35:14 roberto Exp $2** $Id: lua.c,v 1.133 2004/11/18 19:53:49 roberto Exp $
3** Lua stand-alone interpreter3** Lua stand-alone interpreter
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -127,9 +127,9 @@ static int dostring (lua_State *L, const char *s, const char *name) { · 121 unmodified lines
127 127
128 128
129static int dolibrary (lua_State *L, const char *name) {129static int dolibrary (lua_State *L, const char *name) {
130 lua_getfield(L, LUA_GLOBALSINDEX, "_PATH");130 luaL_getfield(L, LUA_GLOBALSINDEX, "package.path");
131 if (!lua_isstring(L, -1)) {131 if (!lua_isstring(L, -1)) {
132 l_message(progname, "global _PATH must be a string");132 l_message(progname, "`package.path' must be a string");
133 return 1;133 return 1;
134 }134 }
135 name = luaL_searchpath(L, name, lua_tostring(L, -1));135 name = luaL_searchpath(L, name, lua_tostring(L, -1));
@@ -295,7 +295,7 @@ static int handle_argv (lua_State *L, char *argv[], int *interactive) { · 159 unmodified lines
295 print_usage();295 print_usage();
296 return 1;296 return 1;
297 }297 }
298 if (dostring(L, chunk, "=<command line>") != 0)298 if (dostring(L, chunk, "=(command line)") != 0)
299 return 1;299 return 1;
300 break;300 break;
301 }301 }
src/luac/print.c+8−5
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: print.c,v 1.48 2004/09/01 21:22:34 lhf Exp $2** $Id: print.c,v 1.49 2004/11/25 09:31:41 lhf Exp $
3** print bytecodes3** print bytecodes
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -33,7 +33,7 @@ static void PrintString(const Proto* f, int n) · 27 unmodified lines
33 case '\r': printf("\\r"); break;33 case '\r': printf("\\r"); break;
34 case '\t': printf("\\t"); break;34 case '\t': printf("\\t"); break;
35 case '\v': printf("\\v"); break;35 case '\v': printf("\\v"); break;
36 default: printf(isprint(*s) ? "%c" : "\\%03d",*s);36 default: printf(isprint((unsigned char)*s) ? "%c" : "\\%03d",*s);
37 }37 }
38 }38 }
39 putchar('"');39 putchar('"');
@@ -44,15 +44,18 @@ static void PrintConstant(const Proto* f, int i) · 4 unmodified lines
44 const TValue* o=&f->k[i];44 const TValue* o=&f->k[i];
45 switch (ttype(o))45 switch (ttype(o))
46 {46 {
47 case LUA_TNIL:
48 printf("nil");
49 break;
50 case LUA_TBOOLEAN:
51 printf(bvalue(o) ? "true" : "false");
52 break;
47 case LUA_TNUMBER:53 case LUA_TNUMBER:
48 printf(LUA_NUMBER_FMT,nvalue(o));54 printf(LUA_NUMBER_FMT,nvalue(o));
49 break;55 break;
50 case LUA_TSTRING:56 case LUA_TSTRING:
51 PrintString(f,i);57 PrintString(f,i);
52 break;58 break;
53 case LUA_TNIL:
54 printf("nil");
55 break;
56 default: /* cannot happen */59 default: /* cannot happen */
57 printf("? type=%d",ttype(o));60 printf("? type=%d",ttype(o));
58 break;61 break;
src/lundump.c+10−11
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lundump.c,v 1.53 2004/09/01 21:22:34 lhf Exp $2** $Id: lundump.c,v 1.54 2004/11/25 09:31:41 lhf Exp $
3** load pre-compiled Lua chunks3** load pre-compiled Lua chunks
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -177,15 +177,18 @@ static void LoadConstants (LoadState* S, Proto* f) · 171 unmodified lines
177 int t=LoadByte(S);177 int t=LoadByte(S);
178 switch (t)178 switch (t)
179 {179 {
180 case LUA_TNIL:
181 setnilvalue(o);
182 break;
183 case LUA_TBOOLEAN:
184 setbvalue(o,LoadByte(S));
185 break;
180 case LUA_TNUMBER:186 case LUA_TNUMBER:
181 setnvalue(o,LoadNumber(S));187 setnvalue(o,LoadNumber(S));
182 break;188 break;
183 case LUA_TSTRING:189 case LUA_TSTRING:
184 setsvalue2n(S->L,o,LoadString(S));190 setsvalue2n(S->L,o,LoadString(S));
185 break;191 break;
186 case LUA_TNIL:
187 setnilvalue(o);
188 break;
189 default:192 default:
190 error(S,"bad constant type (%d)",t);193 error(S,"bad constant type (%d)",t);
191 break;194 break;
@@ -243,19 +246,15 @@ static void LoadHeader (LoadState* S) · 51 unmodified lines
243 lua_Number x,tx=TEST_NUMBER;246 lua_Number x,tx=TEST_NUMBER;
244 LoadSignature(S);247 LoadSignature(S);
245 version=LoadByte(S);248 version=LoadByte(S);
246 if (version>VERSION)249 if (version!=VERSION)
247 error(S,"bad version (read %d.%d; expected at %s %d.%d)",250 error(S,"bad version (read %d.%d; expected %d.%d)",V(version),V(VERSION));
248 V(version),"most",V(VERSION));
249 if (version<VERSION0) /* check last major change */
250 error(S,"bad version (read %d.%d; expected at %s %d.%d)",
251 V(version),"least",V(VERSION0));
252 S->swap=(luaU_endianness()!=LoadByte(S)); /* need to swap bytes? */251 S->swap=(luaU_endianness()!=LoadByte(S)); /* need to swap bytes? */
253 TestSize(S,sizeof(int),"int");252 TestSize(S,sizeof(int),"int");
254 TestSize(S,sizeof(size_t),"size_t");253 TestSize(S,sizeof(size_t),"size_t");
255 TestSize(S,sizeof(Instruction),"instruction");254 TestSize(S,sizeof(Instruction),"instruction");
256 TestSize(S,sizeof(lua_Number),"number");255 TestSize(S,sizeof(lua_Number),"number");
257 x=LoadNumber(S);256 x=LoadNumber(S);
258 if ((long)x!=(long)tx) /* disregard errors in last bits of fraction */257 if (x!=tx)
259 error(S,"unknown number format");258 error(S,"unknown number format");
260}259}
261 260
src/lundump.h+5−7
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lundump.h,v 1.33 2004/06/09 21:03:53 lhf Exp $2** $Id: lundump.h,v 1.34 2004/11/25 09:31:41 lhf Exp $
3** load pre-compiled Lua chunks3** load pre-compiled Lua chunks
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -22,12 +22,10 @@ int luaU_dump (lua_State* L, const Proto* f, lua_Chunkwriter w, void* data, int · 16 unmodified lines
22/* print one chunk; from print.c */22/* print one chunk; from print.c */
23void luaU_print (const Proto* f, int full);23void luaU_print (const Proto* f, int full);
24 24
25/* definitions for headers of binary files */25/* for header of binary files -- this is Lua 5.1 */
26#define VERSION 0x51 /* last format change was in 5.1 */26#define VERSION 0x51
27#define VERSION0 0x51 /* last major change was in 5.1 */
28 27
29/* a multiple of PI for testing native format */28/* for testing native format of lua_Numbers */
30/* multiplying by 1E7 gives non-trivial integer values */29#define TEST_NUMBER ((lua_Number)31415926.0)
31#define TEST_NUMBER ((lua_Number)3.14159265358979323846E7)
32 30
33#endif31#endif
src/lvm.c+17−20
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lvm.c,v 2.14 2004/09/15 20:39:42 roberto Exp $2** $Id: lvm.c,v 2.18 2004/12/03 20:35:33 roberto Exp $
3** Lua virtual machine3** Lua virtual machine
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -214,7 +214,7 @@ static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, · 208 unmodified lines
214}214}
215 215
216 216
217static int luaV_strcmp (const TString *ls, const TString *rs) {217static int l_strcmp (const TString *ls, const TString *rs) {
218 const char *l = getstr(ls);218 const char *l = getstr(ls);
219 size_t ll = ls->tsv.len;219 size_t ll = ls->tsv.len;
220 const char *r = getstr(rs);220 const char *r = getstr(rs);
@@ -243,21 +243,21 @@ int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { · 22 unmodified lines
243 else if (ttisnumber(l))243 else if (ttisnumber(l))
244 return nvalue(l) < nvalue(r);244 return nvalue(l) < nvalue(r);
245 else if (ttisstring(l))245 else if (ttisstring(l))
246 return luaV_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;246 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;
247 else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)247 else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)
248 return res;248 return res;
249 return luaG_ordererror(L, l, r);249 return luaG_ordererror(L, l, r);
250}250}
251 251
252 252
253static int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) {253static int lessequal (lua_State *L, const TValue *l, const TValue *r) {
254 int res;254 int res;
255 if (ttype(l) != ttype(r))255 if (ttype(l) != ttype(r))
256 return luaG_ordererror(L, l, r);256 return luaG_ordererror(L, l, r);
257 else if (ttisnumber(l))257 else if (ttisnumber(l))
258 return nvalue(l) <= nvalue(r);258 return nvalue(l) <= nvalue(r);
259 else if (ttisstring(l))259 else if (ttisstring(l))
260 return luaV_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;260 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;
261 else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */261 else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */
262 return res;262 return res;
263 else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */263 else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */
@@ -303,15 +303,14 @@ void luaV_concat (lua_State *L, int total, int last) { · 39 unmodified lines
303 luaG_concaterror(L, top-2, top-1);303 luaG_concaterror(L, top-2, top-1);
304 } else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */304 } else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */
305 /* at least two string values; get as many as possible */305 /* at least two string values; get as many as possible */
306 lu_mem tl = cast(lu_mem, tsvalue(top-1)->len) +306 size_t tl = tsvalue(top-1)->len;
307 cast(lu_mem, tsvalue(top-2)->len);
308 char *buffer;307 char *buffer;
309 int i;308 int i;
310 while (n < total && tostring(L, top-n-1)) { /* collect total length */309 /* collect total length */
310 for (n = 1; n < total && tostring(L, top-n-1); n++) {
311 size_t l = tsvalue(top-n-1)->len;311 size_t l = tsvalue(top-n-1)->len;
312 if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow");312 if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow");
313 tl += l;313 tl += l;
314 n++;
315 }314 }
316 buffer = luaZ_openspace(L, &G(L)->buff, tl);315 buffer = luaZ_openspace(L, &G(L)->buff, tl);
317 tl = 0;316 tl = 0;
@@ -462,7 +461,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { · 144 unmodified lines
462 }461 }
463 case OP_NEWTABLE: {462 case OP_NEWTABLE: {
464 int b = GETARG_B(i);463 int b = GETARG_B(i);
465 b = fb2int(b);464 b = luaO_fb2int(b);
466 sethvalue(L, ra, luaH_new(L, b, GETARG_C(i)));465 sethvalue(L, ra, luaH_new(L, b, GETARG_C(i)));
467 L->ci->savedpc = pc;466 L->ci->savedpc = pc;
468 luaC_checkGC(L); /***/467 luaC_checkGC(L); /***/
@@ -569,7 +568,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { · 100 unmodified lines
569 }568 }
570 case OP_LE: {569 case OP_LE: {
571 L->ci->savedpc = pc;570 L->ci->savedpc = pc;
572 if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/571 if (lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; /***/
573 else dojump(L, pc, GETARG_sBx(*pc) + 1);572 else dojump(L, pc, GETARG_sBx(*pc) + 1);
574 base = L->base;573 base = L->base;
575 continue;574 continue;
@@ -710,21 +709,19 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { · 134 unmodified lines
710 dojump(L, pc, GETARG_sBx(i));709 dojump(L, pc, GETARG_sBx(i));
711 continue;710 continue;
712 }711 }
713 case OP_SETLIST:712 case OP_SETLIST: {
714 case OP_SETLISTO: {713 int n = GETARG_B(i);
715 int bc = GETARG_Bx(i);714 int c = GETARG_C(i);
716 int n, last;715 int last;
717 Table *h;716 Table *h;
718 runtime_check(L, ttistable(ra));717 runtime_check(L, ttistable(ra));
719 h = hvalue(ra);718 h = hvalue(ra);
720 if (GET_OPCODE(i) == OP_SETLIST)719 if (n == 0) {
721 n = (bc&(LFIELDS_PER_FLUSH-1)) + 1;
722 else {
723 n = L->top - ra - 1;720 n = L->top - ra - 1;
724 L->top = L->ci->top;721 L->top = L->ci->top;
725 }722 }
726 bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */723 if (c == 0) c = cast(int, *pc++);
727 last = bc + n + LUA_FIRSTINDEX - 1;724 last = ((c-1)*LFIELDS_PER_FLUSH) + n + LUA_FIRSTINDEX - 1;
728 if (last > h->sizearray) /* needs more space? */725 if (last > h->sizearray) /* needs more space? */
729 luaH_resize(L, h, last, h->lsizenode); /* pre-alloc it at once */726 luaH_resize(L, h, last, h->lsizenode); /* pre-alloc it at once */
730 for (; n > 0; n--) {727 for (; n > 0; n--) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t