diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-04-07 10:09:07 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-04-07 10:09:07 -0300 |
commit | fabf5db2373d18a7c97016ea00acc0e05601960a (patch) | |
tree | 984c0e14d70e857e577a1be2d0e9d8815d92bdac /lparser.c | |
parent | de0bfe33b7380fcf165b95dd36895865e1321226 (diff) | |
download | lua-fabf5db2373d18a7c97016ea00acc0e05601960a.tar.gz lua-fabf5db2373d18a7c97016ea00acc0e05601960a.tar.bz2 lua-fabf5db2373d18a7c97016ea00acc0e05601960a.zip |
C stack is the same for the parser and the interpreter, so depth
control should be unified in both parts.
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 2.18 2005/03/09 16:28:07 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.19 2005/03/16 16:59:21 roberto Exp roberto $ |
3 | ** Lua Parser | 3 | ** Lua Parser |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -33,10 +33,6 @@ | |||
33 | 33 | ||
34 | #define luaY_checklimit(fs,v,l,m) if ((v)>(l)) 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 > LUAI_MAXPARSERLEVEL) \ | ||
37 | luaX_lexerror(ls, "chunk has too many syntax levels", 0) | ||
38 | #define leavelevel(ls) ((ls)->nestlevel--) | ||
39 | |||
40 | 36 | ||
41 | /* | 37 | /* |
42 | ** nodes for block list (list of active blocks) | 38 | ** nodes for block list (list of active blocks) |
@@ -295,6 +291,15 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { | |||
295 | } | 291 | } |
296 | 292 | ||
297 | 293 | ||
294 | static void enterlevel (LexState *ls) { | ||
295 | if (++ls->L->nCcalls > LUAI_MAXCCALLS) | ||
296 | luaX_lexerror(ls, "chunk has too many syntax levels", 0); | ||
297 | } | ||
298 | |||
299 | |||
300 | #define leavelevel(ls) ((ls)->L->nCcalls--) | ||
301 | |||
302 | |||
298 | static void enterblock (FuncState *fs, BlockCnt *bl, int isbreakable) { | 303 | static void enterblock (FuncState *fs, BlockCnt *bl, int isbreakable) { |
299 | bl->breaklist = NO_JUMP; | 304 | bl->breaklist = NO_JUMP; |
300 | bl->isbreakable = isbreakable; | 305 | bl->isbreakable = isbreakable; |
@@ -395,7 +400,6 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { | |||
395 | struct LexState lexstate; | 400 | struct LexState lexstate; |
396 | struct FuncState funcstate; | 401 | struct FuncState funcstate; |
397 | lexstate.buff = buff; | 402 | lexstate.buff = buff; |
398 | lexstate.nestlevel = 0; | ||
399 | luaX_setinput(L, &lexstate, z, luaS_new(L, name)); | 403 | luaX_setinput(L, &lexstate, z, luaS_new(L, name)); |
400 | open_func(&lexstate, &funcstate); | 404 | open_func(&lexstate, &funcstate); |
401 | funcstate.f->is_vararg = NEWSTYLEVARARG; | 405 | funcstate.f->is_vararg = NEWSTYLEVARARG; |
@@ -405,7 +409,6 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { | |||
405 | close_func(&lexstate); | 409 | close_func(&lexstate); |
406 | lua_assert(funcstate.prev == NULL); | 410 | lua_assert(funcstate.prev == NULL); |
407 | lua_assert(funcstate.f->nups == 0); | 411 | lua_assert(funcstate.f->nups == 0); |
408 | lua_assert(lexstate.nestlevel == 0); | ||
409 | lua_assert(lexstate.fs == NULL); | 412 | lua_assert(lexstate.fs == NULL); |
410 | return funcstate.f; | 413 | return funcstate.f; |
411 | } | 414 | } |