diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-10-16 17:40:58 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-10-16 17:40:58 -0300 |
commit | c196348717dfda116726145220e5d1311547980e (patch) | |
tree | 83149c29559b888eed7a28e5f1558a67a912cf90 | |
parent | 669129a6d8210e758ba94ea2786a370946572f7d (diff) | |
download | lua-c196348717dfda116726145220e5d1311547980e.tar.gz lua-c196348717dfda116726145220e5d1311547980e.tar.bz2 lua-c196348717dfda116726145220e5d1311547980e.zip |
in case of memory allocation errors, sizecode and sizelineinfo can
be different
-rw-r--r-- | lcode.c | 8 | ||||
-rw-r--r-- | ldebug.c | 3 | ||||
-rw-r--r-- | lfunc.c | 6 | ||||
-rw-r--r-- | lobject.h | 3 | ||||
-rw-r--r-- | lparser.c | 5 |
5 files changed, 14 insertions, 11 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 1.110 2002/08/20 20:03:05 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 1.111 2002/08/21 18:56:33 roberto Exp roberto $ |
3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -686,14 +686,14 @@ void luaK_fixline (FuncState *fs, int line) { | |||
686 | 686 | ||
687 | int luaK_code (FuncState *fs, Instruction i, int line) { | 687 | int luaK_code (FuncState *fs, Instruction i, int line) { |
688 | Proto *f = fs->f; | 688 | Proto *f = fs->f; |
689 | int oldsize = f->sizecode; | ||
690 | luaK_dischargejpc(fs); /* `pc' will change */ | 689 | luaK_dischargejpc(fs); /* `pc' will change */ |
691 | /* put new instruction in code array */ | 690 | /* put new instruction in code array */ |
692 | luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, | 691 | luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, |
693 | MAX_INT, "code size overflow"); | 692 | MAX_INT, "code size overflow"); |
694 | f->code[fs->pc] = i; | 693 | f->code[fs->pc] = i; |
695 | if (f->sizecode != oldsize) | 694 | /* save corresponding line information */ |
696 | luaM_reallocvector(fs->L, f->lineinfo, oldsize, f->sizecode, int); | 695 | luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int, |
696 | MAX_INT, "code size overflow"); | ||
697 | f->lineinfo[fs->pc] = line; | 697 | f->lineinfo[fs->pc] = line; |
698 | return fs->pc++; | 698 | return fs->pc++; |
699 | } | 699 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 1.133 2002/08/20 20:03:05 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.134 2002/09/05 19:45:42 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -248,6 +248,7 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | |||
248 | 248 | ||
249 | static int precheck (const Proto *pt) { | 249 | static int precheck (const Proto *pt) { |
250 | check(pt->maxstacksize <= MAXSTACK); | 250 | check(pt->maxstacksize <= MAXSTACK); |
251 | check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); | ||
251 | lua_assert(pt->numparams+pt->is_vararg <= pt->maxstacksize); | 252 | lua_assert(pt->numparams+pt->is_vararg <= pt->maxstacksize); |
252 | check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); | 253 | check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); |
253 | return 1; | 254 | return 1; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lfunc.c,v 1.58 2002/08/16 14:45:55 roberto Exp roberto $ | 2 | ** $Id: lfunc.c,v 1.59 2002/08/30 19:09:21 roberto Exp roberto $ |
3 | ** Auxiliary functions to manipulate prototypes and closures | 3 | ** Auxiliary functions to manipulate prototypes and closures |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -80,6 +80,7 @@ Proto *luaF_newproto (lua_State *L) { | |||
80 | f->sizep = 0; | 80 | f->sizep = 0; |
81 | f->code = NULL; | 81 | f->code = NULL; |
82 | f->sizecode = 0; | 82 | f->sizecode = 0; |
83 | f->sizelineinfo = 0; | ||
83 | f->nupvalues = 0; | 84 | f->nupvalues = 0; |
84 | f->numparams = 0; | 85 | f->numparams = 0; |
85 | f->is_vararg = 0; | 86 | f->is_vararg = 0; |
@@ -95,8 +96,7 @@ Proto *luaF_newproto (lua_State *L) { | |||
95 | 96 | ||
96 | void luaF_freeproto (lua_State *L, Proto *f) { | 97 | void luaF_freeproto (lua_State *L, Proto *f) { |
97 | luaM_freearray(L, f->code, f->sizecode, Instruction); | 98 | luaM_freearray(L, f->code, f->sizecode, Instruction); |
98 | if (f->lineinfo) | 99 | luaM_freearray(L, f->lineinfo, f->sizelineinfo, int); |
99 | luaM_freearray(L, f->lineinfo, f->sizecode, int); | ||
100 | luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); | 100 | luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); |
101 | luaM_freearray(L, f->k, f->sizek, TObject); | 101 | luaM_freearray(L, f->k, f->sizek, TObject); |
102 | luaM_freearray(L, f->p, f->sizep, Proto *); | 102 | luaM_freearray(L, f->p, f->sizep, Proto *); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lobject.h,v 1.146 2002/09/19 13:03:53 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 1.147 2002/10/08 18:46:08 roberto Exp roberto $ |
3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -186,6 +186,7 @@ typedef struct Proto { | |||
186 | TString *source; | 186 | TString *source; |
187 | int sizek; /* size of `k' */ | 187 | int sizek; /* size of `k' */ |
188 | int sizecode; | 188 | int sizecode; |
189 | int sizelineinfo; | ||
189 | int sizep; /* size of `p' */ | 190 | int sizep; /* size of `p' */ |
190 | int sizelocvars; | 191 | int sizelocvars; |
191 | int lineDefined; | 192 | int lineDefined; |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 1.194 2002/08/30 19:09:21 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.195 2002/10/08 18:46:08 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 | */ |
@@ -337,8 +337,9 @@ static void close_func (LexState *ls) { | |||
337 | removevars(ls, 0); | 337 | removevars(ls, 0); |
338 | luaK_codeABC(fs, OP_RETURN, 0, 1, 0); /* final return */ | 338 | luaK_codeABC(fs, OP_RETURN, 0, 1, 0); /* final return */ |
339 | luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); | 339 | luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); |
340 | luaM_reallocvector(L, f->lineinfo, f->sizecode, fs->pc, int); | ||
341 | f->sizecode = fs->pc; | 340 | f->sizecode = fs->pc; |
341 | luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); | ||
342 | f->sizelineinfo = fs->pc; | ||
342 | luaM_reallocvector(L, f->k, f->sizek, fs->nk, TObject); | 343 | luaM_reallocvector(L, f->k, f->sizek, fs->nk, TObject); |
343 | f->sizek = fs->nk; | 344 | f->sizek = fs->nk; |
344 | luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); | 345 | luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); |