summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lcode.c27
-rw-r--r--ldebug.c85
-rw-r--r--ldebug.h3
-rw-r--r--ldo.c9
-rw-r--r--ldo.h4
-rw-r--r--lfunc.c5
-rw-r--r--lobject.h3
-rw-r--r--lopcodes.c8
-rw-r--r--lopcodes.h5
-rw-r--r--lparser.c18
-rw-r--r--lparser.h4
-rw-r--r--lstate.h8
-rw-r--r--ltests.c4
-rw-r--r--lundump.c3
-rw-r--r--lvm.c68
15 files changed, 79 insertions, 175 deletions
diff --git a/lcode.c b/lcode.c
index 086b527f..5caa6515 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 1.91 2002/03/08 19:10:32 roberto Exp roberto $ 2** $Id: lcode.c,v 1.92 2002/03/21 20:31:43 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*/
@@ -737,31 +737,16 @@ void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
737} 737}
738 738
739 739
740static void codelineinfo (FuncState *fs) {
741 Proto *f = fs->f;
742 LexState *ls = fs->ls;
743 if (ls->lastline > fs->lastline) {
744 if (ls->lastline > fs->lastline+1) {
745 luaM_growvector(fs->L, f->lineinfo, fs->nlineinfo, f->sizelineinfo, int,
746 MAX_INT, "line info overflow");
747 f->lineinfo[fs->nlineinfo++] = -(ls->lastline - (fs->lastline+1));
748 }
749 luaM_growvector(fs->L, f->lineinfo, fs->nlineinfo, f->sizelineinfo, int,
750 MAX_INT, "line info overflow");
751 f->lineinfo[fs->nlineinfo++] = fs->pc;
752 fs->lastline = ls->lastline;
753 }
754}
755
756
757static int luaK_code (FuncState *fs, Instruction i) { 740static int luaK_code (FuncState *fs, Instruction i) {
758 Proto *f; 741 Proto *f = fs->f;
759 codelineinfo(fs); 742 int oldsize = f->sizecode;
760 f = fs->f;
761 /* put new instruction in code array */ 743 /* put new instruction in code array */
762 luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, 744 luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,
763 MAX_INT, "code size overflow"); 745 MAX_INT, "code size overflow");
764 f->code[fs->pc] = i; 746 f->code[fs->pc] = i;
747 if (f->sizecode != oldsize)
748 luaM_reallocvector(fs->L, f->lineinfo, oldsize, f->sizecode, int);
749 f->lineinfo[fs->pc] = fs->ls->lastline;
765 return fs->pc++; 750 return fs->pc++;
766} 751}
767 752
diff --git a/ldebug.c b/ldebug.c
index 34b3eec5..323a5f7c 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 1.103 2002/03/19 12:45:25 roberto Exp roberto $ 2** $Id: ldebug.c,v 1.104 2002/03/22 16:54:31 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*/
@@ -34,6 +34,24 @@ static int isLmark (CallInfo *ci) {
34} 34}
35 35
36 36
37static int currentpc (lua_State *L, CallInfo *ci) {
38 if (ci->pc == NULL) return -1; /* function is not an active Lua function */
39 if (ci == L->ci || ci->pc != (ci+1)->pc) /* no other function using `pc'? */
40 return (*ci->pc - ci_func(ci)->l.p->code) - 1;
41 else /* function's pc is saved */
42 return (ci->savedpc - ci_func(ci)->l.p->code) - 1;
43}
44
45
46static int currentline (lua_State *L, CallInfo *ci) {
47 int pc = currentpc(L, ci);
48 if (pc < 0)
49 return -1; /* only active lua functions have current-line information */
50 else
51 return ci_func(ci)->l.p->lineinfo[pc];
52}
53
54
37LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) { 55LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) {
38 lua_Hook oldhook; 56 lua_Hook oldhook;
39 lua_lock(L); 57 lua_lock(L);
@@ -45,10 +63,13 @@ LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) {
45 63
46 64
47LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) { 65LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) {
66 CallInfo *ci;
48 lua_Hook oldhook; 67 lua_Hook oldhook;
49 lua_lock(L); 68 lua_lock(L);
50 oldhook = L->linehook; 69 oldhook = L->linehook;
51 L->linehook = func; 70 L->linehook = func;
71 for (ci = L->base_ci; ci <= L->ci; ci++)
72 ci->lastpc = currentpc(L, ci);
52 lua_unlock(L); 73 lua_unlock(L);
53 return oldhook; 74 return oldhook;
54} 75}
@@ -67,57 +88,6 @@ LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
67} 88}
68 89
69 90
70int luaG_getline (int *lineinfo, int pc, int refline, int *prefi) {
71 int refi;
72 if (lineinfo == NULL) return -1; /* no line info */
73 refi = prefi ? *prefi : 0;
74 if (lineinfo[refi] < 0)
75 refline += -lineinfo[refi++];
76 lua_assert(lineinfo[refi] >= 0);
77 while (lineinfo[refi] > pc) {
78 refline--;
79 refi--;
80 if (lineinfo[refi] < 0)
81 refline -= -lineinfo[refi--];
82 lua_assert(lineinfo[refi] >= 0);
83 }
84 for (;;) {
85 int nextline = refline + 1;
86 int nextref = refi + 1;
87 if (lineinfo[nextref] < 0)
88 nextline += -lineinfo[nextref++];
89 lua_assert(lineinfo[nextref] >= 0);
90 if (lineinfo[nextref] > pc)
91 break;
92 refline = nextline;
93 refi = nextref;
94 }
95 if (prefi) *prefi = refi;
96 return refline;
97}
98
99
100static int currentpc (lua_State *L, CallInfo *ci) {
101 lua_assert(isLmark(ci));
102 if (ci->pc == NULL) return 0; /* function is not active */
103 if (ci == L->ci || ci->pc != (ci+1)->pc) /* no other function using `pc'? */
104 return (*ci->pc - ci_func(ci)->l.p->code) - 1;
105 else /* function's pc is saved */
106 return (ci->savedpc - ci_func(ci)->l.p->code) - 1;
107}
108
109
110static int currentline (lua_State *L, CallInfo *ci) {
111 if (!isLmark(ci))
112 return -1; /* only active lua functions have current-line information */
113 else {
114 int *lineinfo = ci_func(ci)->l.p->lineinfo;
115 return luaG_getline(lineinfo, currentpc(L, ci), 1, NULL);
116 }
117}
118
119
120
121static Proto *getluaproto (CallInfo *ci) { 91static Proto *getluaproto (CallInfo *ci) {
122 return (isLmark(ci) ? ci_func(ci)->l.p : NULL); 92 return (isLmark(ci) ? ci_func(ci)->l.p : NULL);
123} 93}
@@ -272,19 +242,8 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
272#define checkreg(pt,reg) check((reg) < (pt)->maxstacksize) 242#define checkreg(pt,reg) check((reg) < (pt)->maxstacksize)
273 243
274 244
275static int checklineinfo (const Proto *pt) {
276 int *lineinfo = pt->lineinfo;
277 if (lineinfo == NULL) return 1;
278 check(pt->sizelineinfo >= 2 && lineinfo[pt->sizelineinfo-1] == MAX_INT);
279 lua_assert(luaG_getline(lineinfo, pt->sizecode-1, 1, NULL) < MAX_INT);
280 if (*lineinfo < 0) lineinfo++;
281 check(*lineinfo == 0);
282 return 1;
283}
284
285 245
286static int precheck (const Proto *pt) { 246static int precheck (const Proto *pt) {
287 check(checklineinfo(pt));
288 check(pt->maxstacksize <= MAXSTACK); 247 check(pt->maxstacksize <= MAXSTACK);
289 lua_assert(pt->numparams+pt->is_vararg <= pt->maxstacksize); 248 lua_assert(pt->numparams+pt->is_vararg <= pt->maxstacksize);
290 check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); 249 check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);
diff --git a/ldebug.h b/ldebug.h
index 18afa5ab..36b866df 100644
--- a/ldebug.h
+++ b/ldebug.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.h,v 1.16 2001/11/28 20:13:13 roberto Exp roberto $ 2** $Id: ldebug.h,v 1.17 2002/03/19 12:45:25 roberto Exp roberto $
3** Auxiliary functions from Debug Interface module 3** Auxiliary functions from Debug Interface module
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -15,7 +15,6 @@
15void luaG_typeerror (lua_State *L, const TObject *o, const char *opname); 15void luaG_typeerror (lua_State *L, const TObject *o, const char *opname);
16void luaG_concaterror (lua_State *L, StkId p1, StkId p2); 16void luaG_concaterror (lua_State *L, StkId p1, StkId p2);
17void luaG_aritherror (lua_State *L, StkId p1, const TObject *p2); 17void luaG_aritherror (lua_State *L, StkId p1, const TObject *p2);
18int luaG_getline (int *lineinfo, int pc, int refline, int *refi);
19void luaG_ordererror (lua_State *L, const TObject *p1, const TObject *p2); 18void luaG_ordererror (lua_State *L, const TObject *p1, const TObject *p2);
20int luaG_checkcode (const Proto *pt); 19int luaG_checkcode (const Proto *pt);
21 20
diff --git a/ldo.c b/ldo.c
index b9efd24a..37dac3b5 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.164 2002/03/15 17:17:16 roberto Exp roberto $ 2** $Id: ldo.c,v 1.165 2002/03/20 12:52:32 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*/
@@ -122,13 +122,13 @@ static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) {
122} 122}
123 123
124 124
125void luaD_lineHook (lua_State *L, int line, lua_Hook linehook) { 125void luaD_lineHook (lua_State *L, int line) {
126 if (L->allowhooks) { 126 if (L->allowhooks) {
127 lua_Debug ar; 127 lua_Debug ar;
128 ar.event = "line"; 128 ar.event = "line";
129 ar.i_ci = L->ci - L->base_ci; 129 ar.i_ci = L->ci - L->base_ci;
130 ar.currentline = line; 130 ar.currentline = line;
131 dohook(L, &ar, linehook); 131 dohook(L, &ar, L->linehook);
132 } 132 }
133} 133}
134 134
@@ -221,7 +221,6 @@ StkId luaD_precall (lua_State *L, StkId func) {
221 if (p->is_vararg) /* varargs? */ 221 if (p->is_vararg) /* varargs? */
222 adjust_varargs(L, p->numparams); 222 adjust_varargs(L, p->numparams);
223 luaD_checkstack(L, p->maxstacksize); 223 luaD_checkstack(L, p->maxstacksize);
224 ci->line = 0;
225 ci->top = ci->base + p->maxstacksize; 224 ci->top = ci->base + p->maxstacksize;
226 while (L->top < ci->top) 225 while (L->top < ci->top)
227 setnilvalue(L->top++); 226 setnilvalue(L->top++);
@@ -250,7 +249,7 @@ void luaD_poscall (lua_State *L, int wanted, StkId firstResult) {
250 luaD_callHook(L, L->callhook, "return"); 249 luaD_callHook(L, L->callhook, "return");
251 firstResult = restorestack(L, fr); 250 firstResult = restorestack(L, fr);
252 } 251 }
253 res = L->ci->base - 1; /* func == final position of 1st result */ 252 res = L->ci->base - 1; /* res == final position of 1st result */
254 L->ci--; 253 L->ci--;
255 /* move results to correct place */ 254 /* move results to correct place */
256 while (wanted != 0 && firstResult < L->top) { 255 while (wanted != 0 && firstResult < L->top) {
diff --git a/ldo.h b/ldo.h
index e25d9c09..2eb5f43b 100644
--- a/ldo.h
+++ b/ldo.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.h,v 1.40 2002/01/30 17:27:53 roberto Exp roberto $ 2** $Id: ldo.h,v 1.41 2002/03/20 12:52:32 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*/
@@ -27,7 +27,7 @@
27#define restorestack(L,n) ((TObject *)((char *)L->stack + (n))) 27#define restorestack(L,n) ((TObject *)((char *)L->stack + (n)))
28 28
29 29
30void luaD_lineHook (lua_State *L, int line, lua_Hook linehook); 30void luaD_lineHook (lua_State *L, int line);
31StkId luaD_precall (lua_State *L, StkId func); 31StkId luaD_precall (lua_State *L, StkId func);
32void luaD_call (lua_State *L, StkId func, int nResults); 32void luaD_call (lua_State *L, StkId func, int nResults);
33void luaD_poscall (lua_State *L, int wanted, StkId firstResult); 33void luaD_poscall (lua_State *L, int wanted, StkId firstResult);
diff --git a/lfunc.c b/lfunc.c
index 2b79b8de..205f39b6 100644
--- a/lfunc.c
+++ b/lfunc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lfunc.c,v 1.53 2001/12/21 17:31:35 roberto Exp roberto $ 2** $Id: lfunc.c,v 1.54 2002/03/05 12:42:47 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*/
@@ -87,7 +87,6 @@ Proto *luaF_newproto (lua_State *L) {
87 f->marked = 0; 87 f->marked = 0;
88 f->lineinfo = NULL; 88 f->lineinfo = NULL;
89 f->sizelocvars = 0; 89 f->sizelocvars = 0;
90 f->sizelineinfo = 0;
91 f->locvars = NULL; 90 f->locvars = NULL;
92 f->lineDefined = 0; 91 f->lineDefined = 0;
93 f->source = NULL; 92 f->source = NULL;
@@ -99,10 +98,10 @@ Proto *luaF_newproto (lua_State *L) {
99 98
100void luaF_freeproto (lua_State *L, Proto *f) { 99void luaF_freeproto (lua_State *L, Proto *f) {
101 luaM_freearray(L, f->code, f->sizecode, Instruction); 100 luaM_freearray(L, f->code, f->sizecode, Instruction);
101 luaM_freearray(L, f->lineinfo, f->sizecode, int);
102 luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); 102 luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar);
103 luaM_freearray(L, f->k, f->sizek, TObject); 103 luaM_freearray(L, f->k, f->sizek, TObject);
104 luaM_freearray(L, f->p, f->sizep, Proto *); 104 luaM_freearray(L, f->p, f->sizep, Proto *);
105 luaM_freearray(L, f->lineinfo, f->sizelineinfo, int);
106 luaM_freelem(L, f); 105 luaM_freelem(L, f);
107} 106}
108 107
diff --git a/lobject.h b/lobject.h
index 746b7751..dca2531a 100644
--- a/lobject.h
+++ b/lobject.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.h,v 1.126 2002/03/11 12:45:00 roberto Exp roberto $ 2** $Id: lobject.h,v 1.127 2002/03/18 18:16:16 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*/
@@ -129,7 +129,6 @@ typedef struct Proto {
129 int sizek; /* size of `k' */ 129 int sizek; /* size of `k' */
130 int sizecode; 130 int sizecode;
131 int sizep; /* size of `p' */ 131 int sizep; /* size of `p' */
132 int sizelineinfo; /* size of `lineinfo' */
133 int sizelocvars; 132 int sizelocvars;
134 int lineDefined; 133 int lineDefined;
135 lu_byte nupvalues; 134 lu_byte nupvalues;
diff --git a/lopcodes.c b/lopcodes.c
index 8d13a09f..c156f533 100644
--- a/lopcodes.c
+++ b/lopcodes.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lopcodes.c,v 1.12 2002/03/08 19:10:32 roberto Exp roberto $ 2** $Id: lopcodes.c,v 1.13 2002/03/21 20:32:22 roberto Exp roberto $
3** extracted automatically from lopcodes.h by mkprint.lua 3** extracted automatically from lopcodes.h by mkprint.lua
4** DO NOT EDIT 4** DO NOT EDIT
5** See Copyright Notice in lua.h 5** See Copyright Notice in lua.h
@@ -59,11 +59,11 @@ const char *const luaP_opnames[] = {
59 59
60#define opmode(t,x,b,c,sa,k,m) (((t)<<OpModeT) | \ 60#define opmode(t,x,b,c,sa,k,m) (((t)<<OpModeT) | \
61 ((b)<<OpModeBreg) | ((c)<<OpModeCreg) | \ 61 ((b)<<OpModeBreg) | ((c)<<OpModeCreg) | \
62 ((sa)<<OpModesetA) | ((k)<<OpModeK) | (x)<<OpModeNoTrace | (m)) 62 ((sa)<<OpModesetA) | ((k)<<OpModeK) | (m))
63 63
64 64
65const lu_byte luaP_opmodes[NUM_OPCODES] = { 65const lu_byte luaP_opmodes[NUM_OPCODES] = {
66/* T n B C sA K mode opcode */ 66/* T _ B C sA K mode opcode */
67 opmode(0,0,1,0, 1,0,iABC) /* OP_MOVE */ 67 opmode(0,0,1,0, 1,0,iABC) /* OP_MOVE */
68 ,opmode(0,0,0,0, 1,1,iABc) /* OP_LOADK */ 68 ,opmode(0,0,0,0, 1,1,iABc) /* OP_LOADK */
69 ,opmode(0,0,0,0, 1,0,iABC) /* OP_LOADBOOL */ 69 ,opmode(0,0,0,0, 1,0,iABC) /* OP_LOADBOOL */
@@ -96,7 +96,7 @@ const lu_byte luaP_opmodes[NUM_OPCODES] = {
96 ,opmode(0,0,0,0, 0,0,iABC) /* OP_CALL */ 96 ,opmode(0,0,0,0, 0,0,iABC) /* OP_CALL */
97 ,opmode(0,0,0,0, 0,0,iABC) /* OP_TAILCALL */ 97 ,opmode(0,0,0,0, 0,0,iABC) /* OP_TAILCALL */
98 ,opmode(0,0,0,0, 0,0,iABC) /* OP_RETURN */ 98 ,opmode(0,0,0,0, 0,0,iABC) /* OP_RETURN */
99 ,opmode(0,1,0,0, 0,0,iAsBc) /* OP_FORLOOP */ 99 ,opmode(0,0,0,0, 0,0,iAsBc) /* OP_FORLOOP */
100 ,opmode(0,0,0,0, 0,0,iABC) /* OP_TFORLOOP */ 100 ,opmode(0,0,0,0, 0,0,iABC) /* OP_TFORLOOP */
101 ,opmode(0,0,0,0, 0,0,iABc) /* OP_SETLIST */ 101 ,opmode(0,0,0,0, 0,0,iABc) /* OP_SETLIST */
102 ,opmode(0,0,0,0, 0,0,iABc) /* OP_SETLISTO */ 102 ,opmode(0,0,0,0, 0,0,iABc) /* OP_SETLISTO */
diff --git a/lopcodes.h b/lopcodes.h
index b684dab5..566fc84f 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lopcodes.h,v 1.91 2002/03/18 14:49:46 roberto Exp roberto $ 2** $Id: lopcodes.h,v 1.92 2002/03/21 20:32:22 roberto Exp roberto $
3** Opcodes for Lua virtual machine 3** Opcodes for Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -207,8 +207,7 @@ enum OpModeMask {
207 OpModeCreg, /* C is a register/constant */ 207 OpModeCreg, /* C is a register/constant */
208 OpModesetA, /* instruction set register A */ 208 OpModesetA, /* instruction set register A */
209 OpModeK, /* Bc is a constant */ 209 OpModeK, /* Bc is a constant */
210 OpModeT, /* operator is a test */ 210 OpModeT /* operator is a test */
211 OpModeNoTrace /* operator should not be traced */
212}; 211};
213 212
214extern const lu_byte luaP_opmodes[NUM_OPCODES]; 213extern const lu_byte luaP_opmodes[NUM_OPCODES];
diff --git a/lparser.c b/lparser.c
index 5148267d..d3b12da9 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.171 2002/03/18 14:49:46 roberto Exp roberto $ 2** $Id: lparser.c,v 1.172 2002/03/21 20:32:22 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*/
@@ -376,11 +376,9 @@ static void open_func (LexState *ls, FuncState *fs) {
376 fs->nk = 0; 376 fs->nk = 0;
377 fs->h = luaH_new(ls->L, 0, 0); 377 fs->h = luaH_new(ls->L, 0, 0);
378 fs->np = 0; 378 fs->np = 0;
379 fs->nlineinfo = 0;
380 fs->nlocvars = 0; 379 fs->nlocvars = 0;
381 fs->nactloc = 0; 380 fs->nactloc = 0;
382 fs->nactvar = 0; 381 fs->nactvar = 0;
383 fs->lastline = 0;
384 fs->defaultglob = NO_REG; /* default is free globals */ 382 fs->defaultglob = NO_REG; /* default is free globals */
385 fs->bl = NULL; 383 fs->bl = NULL;
386 f->code = NULL; 384 f->code = NULL;
@@ -402,6 +400,7 @@ static void close_func (LexState *ls) {
402 G(L)->roottable = fs->h->next; 400 G(L)->roottable = fs->h->next;
403 luaH_free(L, fs->h); 401 luaH_free(L, fs->h);
404 luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); 402 luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);
403 luaM_reallocvector(L, f->lineinfo, f->sizecode, fs->pc, int);
405 f->sizecode = fs->pc; 404 f->sizecode = fs->pc;
406 luaM_reallocvector(L, f->k, f->sizek, fs->nk, TObject); 405 luaM_reallocvector(L, f->k, f->sizek, fs->nk, TObject);
407 f->sizek = fs->nk; 406 f->sizek = fs->nk;
@@ -409,9 +408,6 @@ static void close_func (LexState *ls) {
409 f->sizep = fs->np; 408 f->sizep = fs->np;
410 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); 409 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
411 f->sizelocvars = fs->nlocvars; 410 f->sizelocvars = fs->nlocvars;
412 luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->nlineinfo+1, int);
413 f->lineinfo[fs->nlineinfo++] = MAX_INT; /* end flag */
414 f->sizelineinfo = fs->nlineinfo;
415 lua_assert(luaG_checkcode(f)); 411 lua_assert(luaG_checkcode(f));
416 lua_assert(fs->bl == NULL); 412 lua_assert(fs->bl == NULL);
417 ls->fs = fs->prev; 413 ls->fs = fs->prev;
@@ -999,10 +995,10 @@ static int exp1 (LexState *ls) {
999} 995}
1000 996
1001 997
1002static void fornum (LexState *ls, TString *varname) { 998static void fornum (LexState *ls, TString *varname, int line) {
1003 /* fornum -> NAME = exp1,exp1[,exp1] DO body */ 999 /* fornum -> NAME = exp1,exp1[,exp1] DO body */
1004 FuncState *fs = ls->fs; 1000 FuncState *fs = ls->fs;
1005 int prep; 1001 int prep, endfor;
1006 int base = fs->freereg; 1002 int base = fs->freereg;
1007 new_localvar(ls, varname, 0); 1003 new_localvar(ls, varname, 0);
1008 new_localvarstr(ls, "(for limit)", 1); 1004 new_localvarstr(ls, "(for limit)", 1);
@@ -1024,7 +1020,9 @@ static void fornum (LexState *ls, TString *varname) {
1024 check(ls, TK_DO); 1020 check(ls, TK_DO);
1025 block(ls); 1021 block(ls);
1026 luaK_patchtohere(fs, prep-1); 1022 luaK_patchtohere(fs, prep-1);
1027 luaK_patchlist(fs, luaK_codeAsBc(fs, OP_FORLOOP, base, NO_JUMP), prep); 1023 endfor = luaK_codeAsBc(fs, OP_FORLOOP, base, NO_JUMP);
1024 luaK_patchlist(fs, endfor, prep);
1025 fs->f->lineinfo[endfor] = line; /* pretend that `OP_FOR' starts the loop */
1028} 1026}
1029 1027
1030 1028
@@ -1065,7 +1063,7 @@ static void forstat (LexState *ls, int line) {
1065 varname = str_checkname(ls); /* first variable name */ 1063 varname = str_checkname(ls); /* first variable name */
1066 next(ls); /* skip var name */ 1064 next(ls); /* skip var name */
1067 switch (ls->t.token) { 1065 switch (ls->t.token) {
1068 case '=': fornum(ls, varname); break; 1066 case '=': fornum(ls, varname, line); break;
1069 case ',': case TK_IN: forlist(ls, varname); break; 1067 case ',': case TK_IN: forlist(ls, varname); break;
1070 default: luaK_error(ls, "`=' or `in' expected"); 1068 default: luaK_error(ls, "`=' or `in' expected");
1071 } 1069 }
diff --git a/lparser.h b/lparser.h
index 44f1759e..b0adda79 100644
--- a/lparser.h
+++ b/lparser.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.h,v 1.39 2002/02/08 22:42:41 roberto Exp roberto $ 2** $Id: lparser.h,v 1.40 2002/03/14 18:01:52 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*/
@@ -68,11 +68,9 @@ typedef struct FuncState {
68 int defaultglob; /* where to look for non-declared globals */ 68 int defaultglob; /* where to look for non-declared globals */
69 int nk; /* number of elements in `k' */ 69 int nk; /* number of elements in `k' */
70 int np; /* number of elements in `p' */ 70 int np; /* number of elements in `p' */
71 int nlineinfo; /* number of elements in `lineinfo' */
72 int nlocvars; /* number of elements in `locvars' */ 71 int nlocvars; /* number of elements in `locvars' */
73 int nactloc; /* number of active local variables */ 72 int nactloc; /* number of active local variables */
74 int nactvar; /* number of elements in array `actvar' */ 73 int nactvar; /* number of elements in array `actvar' */
75 int lastline; /* line where last `lineinfo' was generated */
76 expdesc upvalues[MAXUPVALUES]; /* upvalues */ 74 expdesc upvalues[MAXUPVALUES]; /* upvalues */
77 vardesc actvar[MAXVARS]; /* declared-variable stack */ 75 vardesc actvar[MAXVARS]; /* declared-variable stack */
78} FuncState; 76} FuncState;
diff --git a/lstate.h b/lstate.h
index af56ee40..ee91e853 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 1.78 2002/03/07 18:11:51 roberto Exp roberto $ 2** $Id: lstate.h,v 1.79 2002/03/11 12:45:00 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*/
@@ -91,16 +91,12 @@ typedef struct CallInfo {
91 StkId top; /* top for this function (when it's a Lua function) */ 91 StkId top; /* top for this function (when it's a Lua function) */
92 const Instruction **pc; /* points to `pc' variable in `luaV_execute' */ 92 const Instruction **pc; /* points to `pc' variable in `luaV_execute' */
93 StkId *pb; /* points to `base' variable in `luaV_execute' */ 93 StkId *pb; /* points to `base' variable in `luaV_execute' */
94 /* extra information for line tracing */
95 int lastpc; /* last pc traced */ 94 int lastpc; /* last pc traced */
96 int line; /* current line */ 95 int yield_results;
97 int refi; /* current index in `lineinfo' */
98} CallInfo; 96} CallInfo;
99 97
100#define ci_func(ci) (clvalue((ci)->base - 1)) 98#define ci_func(ci) (clvalue((ci)->base - 1))
101 99
102#define yield_results refi /* reuse this field */
103
104 100
105/* 101/*
106** `global state', shared by all threads of this state 102** `global state', shared by all threads of this state
diff --git a/ltests.c b/ltests.c
index 72487ad8..097f7d1b 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 1.112 2002/03/14 18:01:52 roberto Exp roberto $ 2** $Id: ltests.c,v 1.113 2002/03/20 12:54:08 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -144,7 +144,7 @@ static char *buildop (Proto *p, int pc, char *buff) {
144 Instruction i = p->code[pc]; 144 Instruction i = p->code[pc];
145 OpCode o = GET_OPCODE(i); 145 OpCode o = GET_OPCODE(i);
146 const char *name = luaP_opnames[o]; 146 const char *name = luaP_opnames[o];
147 int line = luaG_getline(p->lineinfo, pc, 1, NULL); 147 int line = p->lineinfo[pc];
148 sprintf(buff, "(%4d) %4d - ", line, pc); 148 sprintf(buff, "(%4d) %4d - ", line, pc);
149 switch (getOpMode(o)) { 149 switch (getOpMode(o)) {
150 case iABC: 150 case iABC:
diff --git a/lundump.c b/lundump.c
index 4906a8db..6b2bb759 100644
--- a/lundump.c
+++ b/lundump.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lundump.c,v 1.43 2001/07/24 21:57:19 roberto Exp $ 2** $Id: lundump.c,v 1.44 2001/11/28 20:13:13 roberto Exp roberto $
3** load pre-compiled Lua chunks 3** load pre-compiled Lua chunks
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -133,7 +133,6 @@ static void LoadLines (lua_State* L, Proto* f, ZIO* Z, int swap)
133 int n; 133 int n;
134 n=LoadInt(L,Z,swap); 134 n=LoadInt(L,Z,swap);
135 f->lineinfo=luaM_newvector(L,n,int); 135 f->lineinfo=luaM_newvector(L,n,int);
136 f->sizelineinfo=n;
137 LoadVector(L,f->lineinfo,n,sizeof(*f->lineinfo),Z,swap); 136 LoadVector(L,f->lineinfo,n,sizeof(*f->lineinfo),Z,swap);
138} 137}
139 138
diff --git a/lvm.c b/lvm.c
index 84a70fd5..7f358cca 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.221 2002/03/20 12:52:32 roberto Exp roberto $ 2** $Id: lvm.c,v 1.222 2002/03/22 16:54:31 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -62,33 +62,17 @@ int luaV_tostring (lua_State *L, TObject *obj) {
62} 62}
63 63
64 64
65static void traceexec (lua_State *L, lua_Hook linehook) { 65static void traceexec (lua_State *L) {
66 CallInfo *ci = L->ci; 66 CallInfo *ci = L->ci;
67 int *lineinfo = ci_func(ci)->l.p->lineinfo; 67 int *lineinfo = ci_func(ci)->l.p->lineinfo;
68 int pc = cast(int, *ci->pc - ci_func(ci)->l.p->code) - 1; 68 int pc = cast(int, *ci->pc - ci_func(ci)->l.p->code) - 1;
69 int newline; 69 int newline = lineinfo[pc];
70 if (testOpMode(GET_OPCODE(*(*ci->pc - 1)), OpModeNoTrace)) 70 if (pc == 0) /* tracing may be starting now? */
71 return; 71 ci->lastpc = 0; /* initialize `lastpc' */
72 if (ci->line == -1) return; /* no linehooks for this function */
73 else if (ci->line == 0) { /* first linehook? */
74 if (pc == 0) { /* function is starting now? */
75 ci->line = 1;
76 ci->refi = 0;
77 ci->lastpc = pc+1; /* make sure it will call linehook */
78 }
79 else { /* function started without hooks: */
80 ci->line = -1; /* keep it that way */
81 return;
82 }
83 }
84 newline = luaG_getline(lineinfo, pc, ci->line, &ci->refi);
85 /* calls linehook when enters a new line or jumps back (loop) */ 72 /* calls linehook when enters a new line or jumps back (loop) */
86 if (newline != ci->line || pc <= ci->lastpc) { 73 if (pc <= ci->lastpc || newline != lineinfo[ci->lastpc])
87 ci->line = newline; 74 luaD_lineHook(L, newline);
88 luaD_lineHook(L, newline, linehook); 75 L->ci->lastpc = pc;
89 ci = L->ci; /* previous call may realocate `ci' */
90 }
91 ci->lastpc = pc;
92} 76}
93 77
94 78
@@ -316,21 +300,17 @@ static void powOp (lua_State *L, StkId ra, StkId rb, StkId rc) {
316 300
317#define dojump(pc, i) ((pc) += (i)) 301#define dojump(pc, i) ((pc) += (i))
318 302
319/* 303
320** Executes current Lua function. Parameters are between [base,top).
321** Returns n such that the results are between [n,top).
322*/
323StkId luaV_execute (lua_State *L) { 304StkId luaV_execute (lua_State *L) {
324 StkId base; 305 StkId base;
325 LClosure *cl; 306 LClosure *cl;
326 TObject *k; 307 TObject *k;
327 const Instruction *pc; 308 const Instruction *pc;
328 lua_Hook linehook; 309 callentry: /* entry point when calling new functions */
329 reinit:
330 linehook = L->linehook;
331 L->ci->pc = &pc; 310 L->ci->pc = &pc;
332 pc = L->ci->savedpc;
333 L->ci->pb = &base; 311 L->ci->pb = &base;
312 pc = L->ci->savedpc;
313 retentry: /* entry point when returning to old functions */
334 base = L->ci->base; 314 base = L->ci->base;
335 cl = &clvalue(base - 1)->l; 315 cl = &clvalue(base - 1)->l;
336 k = cl->p->k; 316 k = cl->p->k;
@@ -338,13 +318,13 @@ StkId luaV_execute (lua_State *L) {
338 for (;;) { 318 for (;;) {
339 const Instruction i = *pc++; 319 const Instruction i = *pc++;
340 StkId ra; 320 StkId ra;
341 if (linehook) 321 if (L->linehook)
342 traceexec(L, linehook); 322 traceexec(L);
343 ra = RA(i); 323 ra = RA(i);
344 lua_assert(L->top <= L->stack + L->stacksize && L->top >= L->ci->base); 324 lua_assert(L->top <= L->stack + L->stacksize && L->top >= L->ci->base);
345 lua_assert(L->top == L->ci->top || GET_OPCODE(i) == OP_CALL || 325 lua_assert(L->top == L->ci->top ||
346 GET_OPCODE(i) == OP_TAILCALL || GET_OPCODE(i) == OP_RETURN || 326 GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL ||
347 GET_OPCODE(i) == OP_SETLISTO); 327 GET_OPCODE(i) == OP_RETURN || GET_OPCODE(i) == OP_SETLISTO);
348 switch (GET_OPCODE(i)) { 328 switch (GET_OPCODE(i)) {
349 case OP_MOVE: { 329 case OP_MOVE: {
350 setobj(ra, RB(i)); 330 setobj(ra, RB(i));
@@ -453,7 +433,6 @@ StkId luaV_execute (lua_State *L) {
453 break; 433 break;
454 } 434 }
455 case OP_JMP: { 435 case OP_JMP: {
456 linehook = L->linehook;
457 dojump(pc, GETARG_sBc(i)); 436 dojump(pc, GETARG_sBc(i));
458 break; 437 break;
459 } 438 }
@@ -511,7 +490,7 @@ StkId luaV_execute (lua_State *L) {
511 } 490 }
512 else { /* it is a Lua function: `call' it */ 491 else { /* it is a Lua function: `call' it */
513 (L->ci-1)->savedpc = pc; 492 (L->ci-1)->savedpc = pc;
514 goto reinit; 493 goto callentry;
515 } 494 }
516 break; 495 break;
517 } 496 }
@@ -521,7 +500,7 @@ StkId luaV_execute (lua_State *L) {
521 if (b != 0) L->top = ra+b; /* else previous instruction set top */ 500 if (b != 0) L->top = ra+b; /* else previous instruction set top */
522 luaD_poscall(L, LUA_MULTRET, ra); /* move down function and args. */ 501 luaD_poscall(L, LUA_MULTRET, ra); /* move down function and args. */
523 ra = luaD_precall(L, base-1); 502 ra = luaD_precall(L, base-1);
524 if (ra == NULL) goto reinit; /* it is a Lua function */ 503 if (ra == NULL) goto callentry; /* it is a Lua function */
525 else if (ra > L->top) return NULL; /* yield??? */ 504 else if (ra > L->top) return NULL; /* yield??? */
526 else goto ret; 505 else goto ret;
527 } 506 }
@@ -540,14 +519,12 @@ StkId luaV_execute (lua_State *L) {
540 else { /* yes: continue its execution */ 519 else { /* yes: continue its execution */
541 int nresults; 520 int nresults;
542 lua_assert(ttype(ci->base-1) == LUA_TFUNCTION); 521 lua_assert(ttype(ci->base-1) == LUA_TFUNCTION);
543 base = ci->base; /* restore previous values */
544 cl = &clvalue(base - 1)->l;
545 k = cl->p->k;
546 pc = ci->savedpc; 522 pc = ci->savedpc;
547 lua_assert(GET_OPCODE(*(pc-1)) == OP_CALL); 523 lua_assert(GET_OPCODE(*(pc-1)) == OP_CALL);
548 nresults = GETARG_C(*(pc-1)) - 1; 524 nresults = GETARG_C(*(pc-1)) - 1;
549 luaD_poscall(L, nresults, ra); 525 luaD_poscall(L, nresults, ra);
550 if (nresults >= 0) L->top = L->ci->top; 526 if (nresults >= 0) L->top = L->ci->top;
527 goto retentry;
551 } 528 }
552 break; 529 break;
553 } 530 }
@@ -556,7 +533,6 @@ StkId luaV_execute (lua_State *L) {
556 int j = GETARG_sBc(i); 533 int j = GETARG_sBc(i);
557 const TObject *plimit = ra+1; 534 const TObject *plimit = ra+1;
558 const TObject *pstep = ra+2; 535 const TObject *pstep = ra+2;
559 dojump(pc, j); /* jump back before tests (for error messages) */
560 if (ttype(ra) != LUA_TNUMBER) 536 if (ttype(ra) != LUA_TNUMBER)
561 luaD_error(L, "`for' initial value must be a number"); 537 luaD_error(L, "`for' initial value must be a number");
562 if (!tonumber(plimit, ra+1)) 538 if (!tonumber(plimit, ra+1))
@@ -567,11 +543,9 @@ StkId luaV_execute (lua_State *L) {
567 index = nvalue(ra) + step; /* increment index */ 543 index = nvalue(ra) + step; /* increment index */
568 limit = nvalue(plimit); 544 limit = nvalue(plimit);
569 if (step > 0 ? index <= limit : index >= limit) { 545 if (step > 0 ? index <= limit : index >= limit) {
546 dojump(pc, j); /* jump back */
570 chgnvalue(ra, index); /* update index */ 547 chgnvalue(ra, index); /* update index */
571 linehook = L->linehook;
572 } 548 }
573 else
574 dojump(pc, -j); /* undo jump */
575 break; 549 break;
576 } 550 }
577 case OP_TFORLOOP: { 551 case OP_TFORLOOP: {