diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-11-22 11:12:07 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-11-22 11:12:07 -0200 |
commit | 29ede6aa13144ff7b69c57a87be1ee93f57ae896 (patch) | |
tree | adcfb5dcff7db55481cd675349e23dec0e63c939 /lparser.c | |
parent | 951897c09319ae5474a4b86bb7d615136577caa0 (diff) | |
download | lua-29ede6aa13144ff7b69c57a87be1ee93f57ae896.tar.gz lua-29ede6aa13144ff7b69c57a87be1ee93f57ae896.tar.bz2 lua-29ede6aa13144ff7b69c57a87be1ee93f57ae896.zip |
first implementation of multiple states (reentrant code).
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 117 |
1 files changed, 61 insertions, 56 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 1.41 1999/09/20 14:15:18 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.42 1999/11/04 17:23:12 roberto Exp roberto $ |
3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -147,14 +147,15 @@ static void checklimit (LexState *ls, int val, int limit, const char *msg) { | |||
147 | } | 147 | } |
148 | 148 | ||
149 | 149 | ||
150 | static void check_pc (FuncState *fs, int n) { | 150 | static void check_pc (LexState *ls, int n) { |
151 | luaM_growvector(fs->f->code, fs->pc, n, Byte, codeEM, MAX_INT); | 151 | luaM_growvector(ls->L, ls->fs->f->code, ls->fs->pc, n, |
152 | Byte, codeEM, MAX_INT); | ||
152 | } | 153 | } |
153 | 154 | ||
154 | 155 | ||
155 | static void code_byte (FuncState *fs, Byte c) { | 156 | static void code_byte (LexState *ls, Byte c) { |
156 | check_pc(fs, 1); | 157 | check_pc(ls, 1); |
157 | fs->f->code[fs->pc++] = c; | 158 | ls->fs->f->code[ls->fs->pc++] = c; |
158 | } | 159 | } |
159 | 160 | ||
160 | 161 | ||
@@ -204,7 +205,7 @@ static int fix_opcode (LexState *ls, int pc, OpCode op, int arg) { | |||
204 | if (tomove > 0) { /* need to open space? */ | 205 | if (tomove > 0) { /* need to open space? */ |
205 | FuncState *fs = ls->fs; | 206 | FuncState *fs = ls->fs; |
206 | TProtoFunc *f = fs->f; | 207 | TProtoFunc *f = fs->f; |
207 | check_pc(fs, tomove); | 208 | check_pc(ls, tomove); |
208 | luaO_memup(f->code+pc+tomove, f->code+pc, fs->pc-pc); | 209 | luaO_memup(f->code+pc+tomove, f->code+pc, fs->pc-pc); |
209 | fs->pc += tomove; | 210 | fs->pc += tomove; |
210 | } | 211 | } |
@@ -215,7 +216,7 @@ static int fix_opcode (LexState *ls, int pc, OpCode op, int arg) { | |||
215 | 216 | ||
216 | static void code_oparg (LexState *ls, OpCode op, int arg, int delta) { | 217 | static void code_oparg (LexState *ls, OpCode op, int arg, int delta) { |
217 | int size = codesize(arg); | 218 | int size = codesize(arg); |
218 | check_pc(ls->fs, size); | 219 | check_pc(ls, size); |
219 | code_oparg_at(ls, ls->fs->pc, op, arg, delta); | 220 | code_oparg_at(ls, ls->fs->pc, op, arg, delta); |
220 | ls->fs->pc += size; | 221 | ls->fs->pc += size; |
221 | } | 222 | } |
@@ -223,7 +224,7 @@ static void code_oparg (LexState *ls, OpCode op, int arg, int delta) { | |||
223 | 224 | ||
224 | static void code_opcode (LexState *ls, OpCode op, int delta) { | 225 | static void code_opcode (LexState *ls, OpCode op, int delta) { |
225 | deltastack(ls, delta); | 226 | deltastack(ls, delta); |
226 | code_byte(ls->fs, (Byte)op); | 227 | code_byte(ls, (Byte)op); |
227 | } | 228 | } |
228 | 229 | ||
229 | 230 | ||
@@ -234,24 +235,24 @@ static void code_constant (LexState *ls, int c) { | |||
234 | 235 | ||
235 | static void assertglobal (LexState *ls, int index) { | 236 | static void assertglobal (LexState *ls, int index) { |
236 | TObject *o = &ls->fs->f->consts[index]; | 237 | TObject *o = &ls->fs->f->consts[index]; |
237 | LUA_ASSERT(ttype(o) == LUA_T_STRING, "global name is not a string"); | 238 | LUA_ASSERT(ls->L, ttype(o) == LUA_T_STRING, "global name is not a string"); |
238 | luaS_assertglobal(tsvalue(o)); | 239 | luaS_assertglobal(ls->L, tsvalue(o)); |
239 | } | 240 | } |
240 | 241 | ||
241 | 242 | ||
242 | static int next_constant (FuncState *fs) { | 243 | static int next_constant (LexState *ls, TProtoFunc *f) { |
243 | TProtoFunc *f = fs->f; | 244 | luaM_growvector(ls->L, f->consts, f->nconsts, 1, |
244 | luaM_growvector(f->consts, f->nconsts, 1, TObject, constantEM, MAX_ARG); | 245 | TObject, constantEM, MAX_ARG); |
245 | return f->nconsts++; | 246 | return f->nconsts++; |
246 | } | 247 | } |
247 | 248 | ||
248 | 249 | ||
249 | static int string_constant (FuncState *fs, TaggedString *s) { | 250 | static int string_constant (LexState *ls, FuncState *fs, TaggedString *s) { |
250 | TProtoFunc *f = fs->f; | 251 | TProtoFunc *f = fs->f; |
251 | int c = s->constindex; | 252 | int c = s->constindex; |
252 | if (!(c < f->nconsts && | 253 | if (!(c < f->nconsts && |
253 | ttype(&f->consts[c]) == LUA_T_STRING && tsvalue(&f->consts[c]) == s)) { | 254 | ttype(&f->consts[c]) == LUA_T_STRING && tsvalue(&f->consts[c]) == s)) { |
254 | c = next_constant(fs); | 255 | c = next_constant(ls, f); |
255 | ttype(&f->consts[c]) = LUA_T_STRING; | 256 | ttype(&f->consts[c]) = LUA_T_STRING; |
256 | tsvalue(&f->consts[c]) = s; | 257 | tsvalue(&f->consts[c]) = s; |
257 | s->constindex = c; /* hint for next time */ | 258 | s->constindex = c; /* hint for next time */ |
@@ -261,23 +262,24 @@ static int string_constant (FuncState *fs, TaggedString *s) { | |||
261 | 262 | ||
262 | 263 | ||
263 | static void code_string (LexState *ls, TaggedString *s) { | 264 | static void code_string (LexState *ls, TaggedString *s) { |
264 | code_constant(ls, string_constant(ls->fs, s)); | 265 | code_constant(ls, string_constant(ls, ls->fs, s)); |
265 | } | 266 | } |
266 | 267 | ||
267 | 268 | ||
268 | #define LIM 20 | 269 | #define LIM 20 |
269 | static int real_constant (FuncState *fs, real r) { | 270 | static int real_constant (LexState *ls, real r) { |
270 | /* check whether 'r' has appeared within the last LIM entries */ | 271 | /* check whether 'r' has appeared within the last LIM entries */ |
271 | TObject *cnt = fs->f->consts; | 272 | TProtoFunc *f = ls->fs->f; |
272 | int c = fs->f->nconsts; | 273 | TObject *cnt = f->consts; |
274 | int c = f->nconsts; | ||
273 | int lim = c < LIM ? 0 : c-LIM; | 275 | int lim = c < LIM ? 0 : c-LIM; |
274 | while (--c >= lim) { | 276 | while (--c >= lim) { |
275 | if (ttype(&cnt[c]) == LUA_T_NUMBER && nvalue(&cnt[c]) == r) | 277 | if (ttype(&cnt[c]) == LUA_T_NUMBER && nvalue(&cnt[c]) == r) |
276 | return c; | 278 | return c; |
277 | } | 279 | } |
278 | /* not found; create a new entry */ | 280 | /* not found; create a new entry */ |
279 | c = next_constant(fs); | 281 | c = next_constant(ls, f); |
280 | cnt = fs->f->consts; /* 'next_constant' may have reallocated this vector */ | 282 | cnt = f->consts; /* 'next_constant' may reallocate this vector */ |
281 | ttype(&cnt[c]) = LUA_T_NUMBER; | 283 | ttype(&cnt[c]) = LUA_T_NUMBER; |
282 | nvalue(&cnt[c]) = r; | 284 | nvalue(&cnt[c]) = r; |
283 | return c; | 285 | return c; |
@@ -291,7 +293,7 @@ static void code_number (LexState *ls, real f) { | |||
291 | code_oparg(ls, (f<0) ? PUSHNUMBERNEG : PUSHNUMBER, (int)af, 1); | 293 | code_oparg(ls, (f<0) ? PUSHNUMBERNEG : PUSHNUMBER, (int)af, 1); |
292 | } | 294 | } |
293 | else | 295 | else |
294 | code_constant(ls, real_constant(ls->fs, f)); | 296 | code_constant(ls, real_constant(ls, f)); |
295 | } | 297 | } |
296 | 298 | ||
297 | 299 | ||
@@ -304,16 +306,17 @@ static void flush_record (LexState *ls, int n) { | |||
304 | static void flush_list (LexState *ls, int m, int n) { | 306 | static void flush_list (LexState *ls, int m, int n) { |
305 | if (n > 0) { | 307 | if (n > 0) { |
306 | code_oparg(ls, SETLIST, m, -n); | 308 | code_oparg(ls, SETLIST, m, -n); |
307 | code_byte(ls->fs, (Byte)n); | 309 | code_byte(ls, (Byte)n); |
308 | } | 310 | } |
309 | } | 311 | } |
310 | 312 | ||
311 | 313 | ||
312 | static void luaI_registerlocalvar (FuncState *fs, TaggedString *varname, | 314 | static void luaI_registerlocalvar (LexState *ls, TaggedString *varname, |
313 | int line) { | 315 | int line) { |
316 | FuncState *fs = ls->fs; | ||
314 | if (fs->nvars != -1) { /* debug information? */ | 317 | if (fs->nvars != -1) { /* debug information? */ |
315 | TProtoFunc *f = fs->f; | 318 | TProtoFunc *f = fs->f; |
316 | luaM_growvector(f->locvars, fs->nvars, 1, LocVar, "", MAX_INT); | 319 | luaM_growvector(ls->L, f->locvars, fs->nvars, 1, LocVar, "", MAX_INT); |
317 | f->locvars[fs->nvars].varname = varname; | 320 | f->locvars[fs->nvars].varname = varname; |
318 | f->locvars[fs->nvars].line = line; | 321 | f->locvars[fs->nvars].line = line; |
319 | fs->nvars++; | 322 | fs->nvars++; |
@@ -321,8 +324,8 @@ static void luaI_registerlocalvar (FuncState *fs, TaggedString *varname, | |||
321 | } | 324 | } |
322 | 325 | ||
323 | 326 | ||
324 | static void luaI_unregisterlocalvar (FuncState *fs, int line) { | 327 | static void luaI_unregisterlocalvar (LexState *ls, int line) { |
325 | luaI_registerlocalvar(fs, NULL, line); | 328 | luaI_registerlocalvar(ls, NULL, line); |
326 | } | 329 | } |
327 | 330 | ||
328 | 331 | ||
@@ -330,7 +333,7 @@ static void store_localvar (LexState *ls, TaggedString *name, int n) { | |||
330 | FuncState *fs = ls->fs; | 333 | FuncState *fs = ls->fs; |
331 | checklimit(ls, fs->nlocalvar+n+1, MAXLOCALS, "local variables"); | 334 | checklimit(ls, fs->nlocalvar+n+1, MAXLOCALS, "local variables"); |
332 | fs->localvar[fs->nlocalvar+n] = name; | 335 | fs->localvar[fs->nlocalvar+n] = name; |
333 | luaI_registerlocalvar(fs, name, ls->linenumber); | 336 | luaI_registerlocalvar(ls, name, ls->linenumber); |
334 | } | 337 | } |
335 | 338 | ||
336 | 339 | ||
@@ -371,7 +374,7 @@ static void singlevar (LexState *ls, TaggedString *n, vardesc *var, int prev) { | |||
371 | if (aux_localname(level, n) >= 0) | 374 | if (aux_localname(level, n) >= 0) |
372 | luaX_syntaxerror(ls, "cannot access a variable in outer scope", n->str); | 375 | luaX_syntaxerror(ls, "cannot access a variable in outer scope", n->str); |
373 | var->k = VGLOBAL; | 376 | var->k = VGLOBAL; |
374 | var->info = string_constant(fs, n); | 377 | var->info = string_constant(ls, fs, n); |
375 | } | 378 | } |
376 | } | 379 | } |
377 | 380 | ||
@@ -404,7 +407,7 @@ static void pushupvalue (LexState *ls, TaggedString *n) { | |||
404 | 407 | ||
405 | 408 | ||
406 | static void check_debugline (LexState *ls) { | 409 | static void check_debugline (LexState *ls) { |
407 | if (L->debug && ls->linenumber != ls->fs->lastsetline) { | 410 | if (ls->L->debug && ls->linenumber != ls->fs->lastsetline) { |
408 | code_oparg(ls, SETLINE, ls->linenumber, 0); | 411 | code_oparg(ls, SETLINE, ls->linenumber, 0); |
409 | ls->fs->lastsetline = ls->linenumber; | 412 | ls->fs->lastsetline = ls->linenumber; |
410 | } | 413 | } |
@@ -464,7 +467,7 @@ static void code_args (LexState *ls, int nparams, int dots) { | |||
464 | else { | 467 | else { |
465 | fs->f->code[1] = (Byte)(nparams+ZEROVARARG); | 468 | fs->f->code[1] = (Byte)(nparams+ZEROVARARG); |
466 | deltastack(ls, nparams+1); | 469 | deltastack(ls, nparams+1); |
467 | add_localvar(ls, luaS_new("arg")); | 470 | add_localvar(ls, luaS_new(ls->L, "arg")); |
468 | } | 471 | } |
469 | } | 472 | } |
470 | 473 | ||
@@ -515,7 +518,7 @@ static void storevar (LexState *ls, const vardesc *var) { | |||
515 | code_opcode(ls, SETTABLEPOP, -3); | 518 | code_opcode(ls, SETTABLEPOP, -3); |
516 | break; | 519 | break; |
517 | default: | 520 | default: |
518 | LUA_INTERNALERROR("invalid var kind to store"); | 521 | LUA_INTERNALERROR(ls->L, "invalid var kind to store"); |
519 | } | 522 | } |
520 | } | 523 | } |
521 | 524 | ||
@@ -548,7 +551,7 @@ static void codeIf (LexState *ls, int thenAdd, int elseAdd) { | |||
548 | static void func_onstack (LexState *ls, FuncState *func) { | 551 | static void func_onstack (LexState *ls, FuncState *func) { |
549 | FuncState *fs = ls->fs; | 552 | FuncState *fs = ls->fs; |
550 | int i; | 553 | int i; |
551 | int c = next_constant(fs); | 554 | int c = next_constant(ls, fs->f); |
552 | ttype(&fs->f->consts[c]) = LUA_T_PROTO; | 555 | ttype(&fs->f->consts[c]) = LUA_T_PROTO; |
553 | fs->f->consts[c].value.tf = func->f; | 556 | fs->f->consts[c].value.tf = func->f; |
554 | if (func->nupvalues == 0) | 557 | if (func->nupvalues == 0) |
@@ -558,13 +561,14 @@ static void func_onstack (LexState *ls, FuncState *func) { | |||
558 | lua_pushvar(ls, &func->upvalues[i]); | 561 | lua_pushvar(ls, &func->upvalues[i]); |
559 | deltastack(ls, 1); /* CLOSURE puts one extra element (before poping) */ | 562 | deltastack(ls, 1); /* CLOSURE puts one extra element (before poping) */ |
560 | code_oparg(ls, CLOSURE, c, -func->nupvalues); | 563 | code_oparg(ls, CLOSURE, c, -func->nupvalues); |
561 | code_byte(fs, (Byte)func->nupvalues); | 564 | code_byte(ls, (Byte)func->nupvalues); |
562 | } | 565 | } |
563 | } | 566 | } |
564 | 567 | ||
565 | 568 | ||
566 | static void init_state (LexState *ls, FuncState *fs, TaggedString *source) { | 569 | static void init_state (LexState *ls, FuncState *fs, TaggedString *source) { |
567 | TProtoFunc *f = luaF_newproto(); | 570 | lua_State *L = ls->L; |
571 | TProtoFunc *f = luaF_newproto(ls->L); | ||
568 | fs->prev = ls->fs; /* linked list of funcstates */ | 572 | fs->prev = ls->fs; /* linked list of funcstates */ |
569 | ls->fs = fs; | 573 | ls->fs = fs; |
570 | fs->stacksize = 0; | 574 | fs->stacksize = 0; |
@@ -577,10 +581,11 @@ static void init_state (LexState *ls, FuncState *fs, TaggedString *source) { | |||
577 | fs->pc = 0; | 581 | fs->pc = 0; |
578 | f->code = NULL; | 582 | f->code = NULL; |
579 | fs->nvars = (L->debug) ? 0 : -1; /* flag no debug information? */ | 583 | fs->nvars = (L->debug) ? 0 : -1; /* flag no debug information? */ |
580 | code_byte(fs, 0); /* to be filled with maxstacksize */ | 584 | code_byte(ls, 0); /* to be filled with maxstacksize */ |
581 | code_byte(fs, 0); /* to be filled with arg information */ | 585 | code_byte(ls, 0); /* to be filled with arg information */ |
582 | /* push function (to avoid GC) */ | 586 | /* push function (to avoid GC) */ |
583 | tfvalue(L->stack.top) = f; ttype(L->stack.top) = LUA_T_PROTO; | 587 | tfvalue(L->stack.top) = f; |
588 | ttype(L->stack.top) = LUA_T_PROTO; | ||
584 | incr_top; | 589 | incr_top; |
585 | } | 590 | } |
586 | 591 | ||
@@ -590,14 +595,14 @@ static void close_func (LexState *ls) { | |||
590 | TProtoFunc *f = fs->f; | 595 | TProtoFunc *f = fs->f; |
591 | code_opcode(ls, ENDCODE, 0); | 596 | code_opcode(ls, ENDCODE, 0); |
592 | f->code[0] = (Byte)fs->maxstacksize; | 597 | f->code[0] = (Byte)fs->maxstacksize; |
593 | luaM_reallocvector(f->code, fs->pc, Byte); | 598 | luaM_reallocvector(ls->L, f->code, fs->pc, Byte); |
594 | luaM_reallocvector(f->consts, f->nconsts, TObject); | 599 | luaM_reallocvector(ls->L, f->consts, f->nconsts, TObject); |
595 | if (fs->nvars != -1) { /* debug information? */ | 600 | if (fs->nvars != -1) { /* debug information? */ |
596 | luaI_registerlocalvar(fs, NULL, -1); /* flag end of vector */ | 601 | luaI_registerlocalvar(ls, NULL, -1); /* flag end of vector */ |
597 | luaM_reallocvector(f->locvars, fs->nvars, LocVar); | 602 | luaM_reallocvector(ls->L, f->locvars, fs->nvars, LocVar); |
598 | } | 603 | } |
599 | ls->fs = fs->prev; | 604 | ls->fs = fs->prev; |
600 | L->stack.top--; /* pop function */ | 605 | ls->L->stack.top--; /* pop function */ |
601 | } | 606 | } |
602 | 607 | ||
603 | 608 | ||
@@ -664,7 +669,7 @@ static int checkname (LexState *ls) { | |||
664 | int sc; | 669 | int sc; |
665 | if (ls->token != NAME) | 670 | if (ls->token != NAME) |
666 | luaX_error(ls, "`NAME' expected"); | 671 | luaX_error(ls, "`NAME' expected"); |
667 | sc = string_constant(ls->fs, ls->seminfo.ts); | 672 | sc = string_constant(ls, ls->fs, ls->seminfo.ts); |
668 | next(ls); | 673 | next(ls); |
669 | return sc; | 674 | return sc; |
670 | } | 675 | } |
@@ -685,11 +690,11 @@ static int optional (LexState *ls, int c) { | |||
685 | } | 690 | } |
686 | 691 | ||
687 | 692 | ||
688 | TProtoFunc *luaY_parser (ZIO *z) { | 693 | TProtoFunc *luaY_parser (lua_State *L, ZIO *z) { |
689 | struct LexState lexstate; | 694 | struct LexState lexstate; |
690 | struct FuncState funcstate; | 695 | struct FuncState funcstate; |
691 | luaX_setinput(&lexstate, z); | 696 | luaX_setinput(L, &lexstate, z); |
692 | init_state(&lexstate, &funcstate, luaS_new(zname(z))); | 697 | init_state(&lexstate, &funcstate, luaS_new(L, zname(z))); |
693 | next(&lexstate); /* read first token */ | 698 | next(&lexstate); /* read first token */ |
694 | chunk(&lexstate); | 699 | chunk(&lexstate); |
695 | if (lexstate.token != EOS) | 700 | if (lexstate.token != EOS) |
@@ -708,7 +713,7 @@ TProtoFunc *luaY_parser (ZIO *z) { | |||
708 | static void chunk (LexState *ls) { | 713 | static void chunk (LexState *ls) { |
709 | /* chunk -> { stat [;] } ret */ | 714 | /* chunk -> { stat [;] } ret */ |
710 | while (stat(ls)) { | 715 | while (stat(ls)) { |
711 | LUA_ASSERT(ls->fs->stacksize == ls->fs->nlocalvar, | 716 | LUA_ASSERT(ls->L, ls->fs->stacksize == ls->fs->nlocalvar, |
712 | "stack size != # local vars"); | 717 | "stack size != # local vars"); |
713 | optional(ls, ';'); | 718 | optional(ls, ';'); |
714 | } | 719 | } |
@@ -728,7 +733,7 @@ static void whilestat (LexState *ls, int line) { | |||
728 | block(ls); | 733 | block(ls); |
729 | check_match(ls, END, WHILE, line); | 734 | check_match(ls, END, WHILE, line); |
730 | cond_size = cond_end-while_init; | 735 | cond_size = cond_end-while_init; |
731 | check_pc(fs, cond_size); | 736 | check_pc(ls, cond_size); |
732 | memcpy(f->code+fs->pc, f->code+while_init, cond_size); | 737 | memcpy(f->code+fs->pc, f->code+while_init, cond_size); |
733 | luaO_memdown(f->code+while_init, f->code+cond_end, fs->pc-while_init); | 738 | luaO_memdown(f->code+while_init, f->code+cond_end, fs->pc-while_init); |
734 | while_init += JMPSIZE + fix_jump(ls, while_init, JMP, fs->pc-cond_size); | 739 | while_init += JMPSIZE + fix_jump(ls, while_init, JMP, fs->pc-cond_size); |
@@ -841,7 +846,7 @@ static int stat (LexState *ls) { | |||
841 | 846 | ||
842 | static int SaveWord (LexState *ls) { | 847 | static int SaveWord (LexState *ls) { |
843 | int res = ls->fs->pc; | 848 | int res = ls->fs->pc; |
844 | check_pc(ls->fs, JMPSIZE); | 849 | check_pc(ls, JMPSIZE); |
845 | ls->fs->pc += JMPSIZE; /* open space */ | 850 | ls->fs->pc += JMPSIZE; /* open space */ |
846 | return res; | 851 | return res; |
847 | } | 852 | } |
@@ -864,7 +869,7 @@ static void block (LexState *ls) { | |||
864 | chunk(ls); | 869 | chunk(ls); |
865 | adjuststack(ls, fs->nlocalvar - nlocalvar); | 870 | adjuststack(ls, fs->nlocalvar - nlocalvar); |
866 | for (; fs->nlocalvar > nlocalvar; fs->nlocalvar--) | 871 | for (; fs->nlocalvar > nlocalvar; fs->nlocalvar--) |
867 | luaI_unregisterlocalvar(fs, fs->lastsetline); | 872 | luaI_unregisterlocalvar(ls, fs->lastsetline); |
868 | } | 873 | } |
869 | 874 | ||
870 | static int funcname (LexState *ls, vardesc *v) { | 875 | static int funcname (LexState *ls, vardesc *v) { |
@@ -888,7 +893,7 @@ static void body (LexState *ls, int needself, int line) { | |||
888 | newfs.f->lineDefined = line; | 893 | newfs.f->lineDefined = line; |
889 | check(ls, '('); | 894 | check(ls, '('); |
890 | if (needself) | 895 | if (needself) |
891 | add_localvar(ls, luaS_new("self")); | 896 | add_localvar(ls, luaS_new(ls->L, "self")); |
892 | parlist(ls); | 897 | parlist(ls); |
893 | check(ls, ')'); | 898 | check(ls, ')'); |
894 | chunk(ls); | 899 | chunk(ls); |
@@ -1173,9 +1178,9 @@ static int funcparams (LexState *ls, int slf) { | |||
1173 | luaX_error(ls, "function arguments expected"); | 1178 | luaX_error(ls, "function arguments expected"); |
1174 | break; | 1179 | break; |
1175 | } | 1180 | } |
1176 | code_byte(fs, CALL); | 1181 | code_byte(ls, CALL); |
1177 | code_byte(fs, 0); /* save space for nresult */ | 1182 | code_byte(ls, 0); /* save space for nresult */ |
1178 | code_byte(fs, (Byte)(nparams+slf)); | 1183 | code_byte(ls, (Byte)(nparams+slf)); |
1179 | return fs->pc-1; | 1184 | return fs->pc-1; |
1180 | } | 1185 | } |
1181 | 1186 | ||