diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-12-06 09:41:28 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-12-06 09:41:28 -0200 |
commit | 968ad49da6522c1cf413bd86323a613176d12c07 (patch) | |
tree | 6961b75297c9533963f3b2d7db4f06900ed4f9f7 | |
parent | 1fdb445e7dae6d08b67e46e1979f285b38bbc18d (diff) | |
download | lua-968ad49da6522c1cf413bd86323a613176d12c07.tar.gz lua-968ad49da6522c1cf413bd86323a613176d12c07.tar.bz2 lua-968ad49da6522c1cf413bd86323a613176d12c07.zip |
`lua_newstate' gets the inital stack size and other arguments
-rw-r--r-- | ldo.h | 4 | ||||
-rw-r--r-- | lstate.c | 51 | ||||
-rw-r--r-- | lstate.h | 3 | ||||
-rw-r--r-- | lua.c | 6 | ||||
-rw-r--r-- | lua.h | 6 |
5 files changed, 55 insertions, 15 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldo.h,v 1.12 1999/12/01 19:50:08 roberto Exp roberto $ | 2 | ** $Id: ldo.h,v 1.13 1999/12/02 16:24:45 roberto Exp roberto $ |
3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -23,7 +23,7 @@ | |||
23 | #define incr_top {if (L->top == L->stack_last) luaD_checkstack(L, 1); L->top++;} | 23 | #define incr_top {if (L->top == L->stack_last) luaD_checkstack(L, 1); L->top++;} |
24 | 24 | ||
25 | 25 | ||
26 | void luaD_init (lua_State *L); | 26 | void luaD_init (lua_State *L, int stacksize); |
27 | void luaD_adjusttop (lua_State *L, StkId base, int extra); | 27 | void luaD_adjusttop (lua_State *L, StkId base, int extra); |
28 | void luaD_openstack (lua_State *L, StkId pos); | 28 | void luaD_openstack (lua_State *L, StkId pos); |
29 | void luaD_lineHook (lua_State *L, int line); | 29 | void luaD_lineHook (lua_State *L, int line); |
@@ -1,12 +1,15 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 1.18 1999/11/29 19:12:07 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 1.19 1999/12/01 19:50:08 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
6 | 6 | ||
7 | 7 | ||
8 | #include <stdarg.h> | ||
9 | |||
8 | #define LUA_REENTRANT | 10 | #define LUA_REENTRANT |
9 | 11 | ||
12 | #include "lauxlib.h" | ||
10 | #include "lbuiltin.h" | 13 | #include "lbuiltin.h" |
11 | #include "ldo.h" | 14 | #include "ldo.h" |
12 | #include "lgc.h" | 15 | #include "lgc.h" |
@@ -18,10 +21,15 @@ | |||
18 | #include "ltm.h" | 21 | #include "ltm.h" |
19 | 22 | ||
20 | 23 | ||
24 | #ifndef DEFAULT_STACK_SIZE | ||
25 | #define DEFAULT_STACK_SIZE 1024 | ||
26 | #endif | ||
27 | |||
28 | |||
21 | lua_State *lua_state = NULL; | 29 | lua_State *lua_state = NULL; |
22 | 30 | ||
23 | 31 | ||
24 | lua_State *lua_newstate (void) { | 32 | static lua_State *newstate_aux (int stacksize, int put_builtin) { |
25 | lua_State *L = luaM_new(NULL, lua_State); | 33 | lua_State *L = luaM_new(NULL, lua_State); |
26 | L->errorJmp = NULL; | 34 | L->errorJmp = NULL; |
27 | L->Mbuffer = NULL; | 35 | L->Mbuffer = NULL; |
@@ -43,16 +51,42 @@ lua_State *lua_newstate (void) { | |||
43 | L->refFree = NONEXT; | 51 | L->refFree = NONEXT; |
44 | L->nblocks = 0; | 52 | L->nblocks = 0; |
45 | L->GCthreshold = MAX_INT; /* to avoid GC during pre-definitions */ | 53 | L->GCthreshold = MAX_INT; /* to avoid GC during pre-definitions */ |
46 | luaD_init(L); | 54 | luaD_init(L, stacksize); |
47 | luaS_init(L); | 55 | luaS_init(L); |
48 | luaX_init(L); | 56 | luaX_init(L); |
49 | luaT_init(L); | 57 | luaT_init(L); |
50 | luaB_predefine(L); | 58 | if (put_builtin) |
59 | luaB_predefine(L); | ||
51 | L->GCthreshold = L->nblocks*4; | 60 | L->GCthreshold = L->nblocks*4; |
52 | return L; | 61 | return L; |
53 | } | 62 | } |
54 | 63 | ||
55 | 64 | ||
65 | lua_State *lua_newstate (const char *s, ...) { | ||
66 | static const char *const ops[] = {"stack", "builtin", NULL}; | ||
67 | va_list ap; | ||
68 | int stacksize = DEFAULT_STACK_SIZE; | ||
69 | int put_builtin = 1; | ||
70 | va_start(ap, s); | ||
71 | while (s) { | ||
72 | switch (luaL_findstring(s, ops)) { | ||
73 | case 0: /* stack */ | ||
74 | stacksize = va_arg(ap, int); | ||
75 | break; | ||
76 | case 1: /* builtin */ | ||
77 | put_builtin = va_arg(ap, int); | ||
78 | break; | ||
79 | default: /* invalid argument */ | ||
80 | va_end(ap); | ||
81 | return NULL; | ||
82 | } | ||
83 | s = va_arg(ap, const char *); | ||
84 | } | ||
85 | va_end(ap); | ||
86 | return newstate_aux(stacksize, put_builtin); | ||
87 | } | ||
88 | |||
89 | |||
56 | void lua_close (lua_State *L) { | 90 | void lua_close (lua_State *L) { |
57 | luaC_collect(L, 1); /* collect all elements */ | 91 | luaC_collect(L, 1); /* collect all elements */ |
58 | LUA_ASSERT(L, L->rootproto == NULL, "list should be empty"); | 92 | LUA_ASSERT(L, L->rootproto == NULL, "list should be empty"); |
@@ -66,9 +100,12 @@ void lua_close (lua_State *L) { | |||
66 | luaM_free(L, L->Mbuffer); | 100 | luaM_free(L, L->Mbuffer); |
67 | luaM_free(L, L->Cblocks); | 101 | luaM_free(L, L->Cblocks); |
68 | LUA_ASSERT(L, L->nblocks == 0, "wrong count for nblocks"); | 102 | LUA_ASSERT(L, L->nblocks == 0, "wrong count for nblocks"); |
103 | LUA_ASSERT(L, L != lua_state || L->Cstack.lua2C == L->stack, "bad stack"); | ||
104 | LUA_ASSERT(L, L != lua_state || L->Cstack.base == L->stack, "bad stack"); | ||
69 | luaM_free(L, L); | 105 | luaM_free(L, L); |
70 | LUA_ASSERT(L, numblocks == 0, "memory leak!"); | 106 | LUA_ASSERT(L, L != lua_state || numblocks == 0, "memory leak!"); |
71 | LUA_ASSERT(L, totalmem == 0,"memory leak!"); | 107 | LUA_ASSERT(L, L != lua_state || totalmem == 0,"memory leak!"); |
72 | L = NULL; | 108 | if (L == lua_state) |
109 | lua_state = NULL; | ||
73 | } | 110 | } |
74 | 111 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.h,v 1.23 1999/11/22 13:12:07 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 1.24 1999/12/01 19:50:08 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -53,6 +53,7 @@ struct lua_State { | |||
53 | StkId top; /* first free slot in the stack */ | 53 | StkId top; /* first free slot in the stack */ |
54 | StkId stack; /* stack base */ | 54 | StkId stack; /* stack base */ |
55 | StkId stack_last; /* last free slot in the stack */ | 55 | StkId stack_last; /* last free slot in the stack */ |
56 | int stacksize; | ||
56 | struct C_Lua_Stack Cstack; /* C2lua struct */ | 57 | struct C_Lua_Stack Cstack; /* C2lua struct */ |
57 | struct lua_longjmp *errorJmp; /* current error recover point */ | 58 | struct lua_longjmp *errorJmp; /* current error recover point */ |
58 | char *Mbuffer; /* global buffer */ | 59 | char *Mbuffer; /* global buffer */ |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lua.c,v 1.26 1999/11/16 12:50:48 roberto Exp roberto $ | 2 | ** $Id: lua.c,v 1.27 1999/11/22 13:12:07 roberto Exp roberto $ |
3 | ** Lua stand-alone interpreter | 3 | ** Lua stand-alone interpreter |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -91,6 +91,7 @@ static void assign (char *arg) { | |||
91 | 91 | ||
92 | 92 | ||
93 | static void getargs (int argc, char *argv[]) { | 93 | static void getargs (int argc, char *argv[]) { |
94 | lua_beginblock(); { | ||
94 | int i, j; | 95 | int i, j; |
95 | lua_Object args = lua_createtable(); | 96 | lua_Object args = lua_createtable(); |
96 | lua_pushobject(args); | 97 | lua_pushobject(args); |
@@ -108,6 +109,7 @@ static void getargs (int argc, char *argv[]) { | |||
108 | /* arg.nn = minimum index in table `arg' */ | 109 | /* arg.nn = minimum index in table `arg' */ |
109 | lua_pushobject(args); lua_pushstring("nn"); | 110 | lua_pushobject(args); lua_pushstring("nn"); |
110 | lua_pushnumber(-i); lua_settable(); | 111 | lua_pushnumber(-i); lua_settable(); |
112 | } lua_endblock(); | ||
111 | } | 113 | } |
112 | 114 | ||
113 | 115 | ||
@@ -146,7 +148,7 @@ static void manual_input (int prompt) { | |||
146 | 148 | ||
147 | int main (int argc, char *argv[]) { | 149 | int main (int argc, char *argv[]) { |
148 | int i; | 150 | int i; |
149 | lua_open(); | 151 | lua_state = lua_newstate("stack", 1024, "builtin", 1, NULL); |
150 | lua_pushstring("> "); lua_setglobal("_PROMPT"); | 152 | lua_pushstring("> "); lua_setglobal("_PROMPT"); |
151 | lua_userinit(); | 153 | lua_userinit(); |
152 | getargs(argc, argv); | 154 | getargs(argc, argv); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lua.h,v 1.41 1999/11/29 19:31:29 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.42 1999/12/02 16:24:45 roberto Exp roberto $ |
3 | ** Lua - An Extensible Extension Language | 3 | ** Lua - An Extensible Extension Language |
4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil | 4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil |
5 | ** e-mail: lua@tecgraf.puc-rio.br | 5 | ** e-mail: lua@tecgraf.puc-rio.br |
@@ -30,7 +30,7 @@ typedef struct TObject *lua_Object; | |||
30 | #define LUA_NOOBJECT ((lua_Object)0) | 30 | #define LUA_NOOBJECT ((lua_Object)0) |
31 | 31 | ||
32 | 32 | ||
33 | lua_State *lua_newstate (void); | 33 | lua_State *lua_newstate (const char *s, ...); |
34 | void lua_close (lua_State *L); | 34 | void lua_close (lua_State *L); |
35 | 35 | ||
36 | lua_Object lua_settagmethod (lua_State *L, int tag, const char *event); | 36 | lua_Object lua_settagmethod (lua_State *L, int tag, const char *event); |
@@ -156,7 +156,7 @@ lua_State *lua_setstate (lua_State *st); | |||
156 | 156 | ||
157 | extern lua_State *lua_state; | 157 | extern lua_State *lua_state; |
158 | 158 | ||
159 | #define lua_open() ((void)(lua_state?0:(lua_state=lua_newstate()))) | 159 | #define lua_open() ((void)(lua_state?0:(lua_state=lua_newstate(NULL)))) |
160 | 160 | ||
161 | #define lua_close() (lua_close)(lua_state) | 161 | #define lua_close() (lua_close)(lua_state) |
162 | #define lua_setstate(st) (lua_setstate)(lua_state, st) | 162 | #define lua_setstate(st) (lua_setstate)(lua_state, st) |