summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lopcodes.h46
-rw-r--r--lparser.c54
-rw-r--r--lvm.c78
3 files changed, 111 insertions, 67 deletions
diff --git a/lopcodes.h b/lopcodes.h
index 810d1ebe..66af79f1 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lopcodes.h,v 1.18 1998/06/25 14:37:00 roberto Exp roberto $ 2** $Id: lopcodes.h,v 1.19 1999/02/02 17:57:49 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*/
@@ -12,7 +12,7 @@
12 12
13/* 13/*
14** NOTICE: variants of the same opcode must be consecutive: First, those 14** NOTICE: variants of the same opcode must be consecutive: First, those
15** with byte parameter, then with word parameter. 15** with word parameter, then with byte parameter.
16*/ 16*/
17 17
18 18
@@ -20,49 +20,55 @@ typedef enum {
20/* name parm before after side effect 20/* name parm before after side effect
21-----------------------------------------------------------------------------*/ 21-----------------------------------------------------------------------------*/
22ENDCODE,/* - - - */ 22ENDCODE,/* - - - */
23RETCODE,/* b - - */
23 24
24PUSHNIL,/* b - nil_0...nil_b */ 25PUSHNIL,/* b - nil_0...nil_b */
26POP,/* b - - TOP-=(b+1) */
25 27
26PUSHNUMBER,/* b - (float)(b-NUMOFFSET) */
27PUSHNUMBERW,/* w - (float)(w-NUMOFFSET) */ 28PUSHNUMBERW,/* w - (float)(w-NUMOFFSET) */
29PUSHNUMBER,/* b - (float)(b-NUMOFFSET) */
28 30
29PUSHCONSTANT,/* b - CNST[b] */
30PUSHCONSTANTW,/*w - CNST[w] */ 31PUSHCONSTANTW,/*w - CNST[w] */
32PUSHCONSTANT,/* b - CNST[b] */
31 33
32PUSHUPVALUE,/* b - Closure[b] */ 34PUSHUPVALUE,/* b - Closure[b] */
33 35
34PUSHLOCAL,/* b - LOC[b] */ 36PUSHLOCAL,/* b - LOC[b] */
35 37
36GETGLOBAL,/* b - VAR[CNST[b]] */
37GETGLOBALW,/* w - VAR[CNST[w]] */ 38GETGLOBALW,/* w - VAR[CNST[w]] */
39GETGLOBAL,/* b - VAR[CNST[b]] */
38 40
39GETTABLE,/* - i t t[i] */ 41GETTABLE,/* - i t t[i] */
40 42
41GETDOTTED,/* b t t[CNST[b]] */
42GETDOTTEDW,/* w t t[CNST[w]] */ 43GETDOTTEDW,/* w t t[CNST[w]] */
44GETDOTTED,/* b t t[CNST[b]] */
43 45
44PUSHSELF,/* b t t t[CNST[b]] */
45PUSHSELFW,/* w t t t[CNST[w]] */ 46PUSHSELFW,/* w t t t[CNST[w]] */
47PUSHSELF,/* b t t t[CNST[b]] */
46 48
47CREATEARRAY,/* b - newarray(size = b) */
48CREATEARRAYW,/* w - newarray(size = w) */ 49CREATEARRAYW,/* w - newarray(size = w) */
50CREATEARRAY,/* b - newarray(size = b) */
49 51
50SETLOCAL,/* b x - LOC[b]=x */ 52SETLOCAL,/* b x - LOC[b]=x */
53SETLOCALDUP,/* b x x LOC[b]=x */
51 54
52SETGLOBAL,/* b x - VAR[CNST[b]]=x */
53SETGLOBALW,/* w x - VAR[CNST[w]]=x */ 55SETGLOBALW,/* w x - VAR[CNST[w]]=x */
56SETGLOBAL,/* b x - VAR[CNST[b]]=x */
57SETGLOBALDUPW,/*w x x VAR[CNST[w]]=x */
58SETGLOBALDUP,/* b x x VAR[CNST[b]]=x */
54 59
55SETTABLE0,/* - v i t - t[i]=v */ 60SETTABLE0,/* - v i t - t[i]=v */
61SETTABLEDUP,/* - v i t v t[i]=v */
56 62
57SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */ 63SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */
58 64
59SETLIST,/* b c v_c...v_1 t - t[i+b*FPF]=v_i */
60SETLISTW,/* w c v_c...v_1 t - t[i+w*FPF]=v_i */ 65SETLISTW,/* w c v_c...v_1 t - t[i+w*FPF]=v_i */
66SETLIST,/* b c v_c...v_1 t - t[i+b*FPF]=v_i */
61 67
62SETMAP,/* b v_b k_b ...v_0 k_0 t t t[k_i]=v_i */ 68SETMAP,/* b v_b k_b ...v_0 k_0 t t t[k_i]=v_i */
63 69
64EQOP,/* - y x (x==y)? 1 : nil */
65NEQOP,/* - y x (x~=y)? 1 : nil */ 70NEQOP,/* - y x (x~=y)? 1 : nil */
71EQOP,/* - y x (x==y)? 1 : nil */
66LTOP,/* - y x (x<y)? 1 : nil */ 72LTOP,/* - y x (x<y)? 1 : nil */
67LEOP,/* - y x (x<y)? 1 : nil */ 73LEOP,/* - y x (x<y)? 1 : nil */
68GTOP,/* - y x (x>y)? 1 : nil */ 74GTOP,/* - y x (x>y)? 1 : nil */
@@ -76,29 +82,25 @@ CONCOP,/* - y x x..y */
76MINUSOP,/* - x -x */ 82MINUSOP,/* - x -x */
77NOTOP,/* - x (x==nil)? 1 : nil */ 83NOTOP,/* - x (x==nil)? 1 : nil */
78 84
79ONTJMP,/* b x (x!=nil)? x : - (x!=nil)? PC+=b */
80ONTJMPW,/* w x (x!=nil)? x : - (x!=nil)? PC+=w */ 85ONTJMPW,/* w x (x!=nil)? x : - (x!=nil)? PC+=w */
81ONFJMP,/* b x (x==nil)? x : - (x==nil)? PC+=b */ 86ONTJMP,/* b x (x!=nil)? x : - (x!=nil)? PC+=b */
82ONFJMPW,/* w x (x==nil)? x : - (x==nil)? PC+=w */ 87ONFJMPW,/* w x (x==nil)? x : - (x==nil)? PC+=w */
83JMP,/* b - - PC+=b */ 88ONFJMP,/* b x (x==nil)? x : - (x==nil)? PC+=b */
84JMPW,/* w - - PC+=w */ 89JMPW,/* w - - PC+=w */
85IFFJMP,/* b x - (x==nil)? PC+=b */ 90JMP,/* b - - PC+=b */
86IFFJMPW,/* w x - (x==nil)? PC+=w */ 91IFFJMPW,/* w x - (x==nil)? PC+=w */
87IFTUPJMP,/* b x - (x!=nil)? PC-=b */ 92IFFJMP,/* b x - (x==nil)? PC+=b */
88IFTUPJMPW,/* w x - (x!=nil)? PC-=w */ 93IFTUPJMPW,/* w x - (x!=nil)? PC-=w */
89IFFUPJMP,/* b x - (x==nil)? PC-=b */ 94IFTUPJMP,/* b x - (x!=nil)? PC-=b */
90IFFUPJMPW,/* w x - (x==nil)? PC-=w */ 95IFFUPJMPW,/* w x - (x==nil)? PC-=w */
96IFFUPJMP,/* b x - (x==nil)? PC-=b */
91 97
92CLOSURE,/* b c v_c...v_1 closure(CNST[b], v_c...v_1) */ 98CLOSURE,/* b c v_c...v_1 closure(CNST[b], v_c...v_1) */
93 99
94CALLFUNC,/* b c v_c...v_1 f r_b...r_1 f(v1,...,v_c) */ 100CALLFUNC,/* b c v_c...v_1 f r_b...r_1 f(v1,...,v_c) */
95 101
96RETCODE,/* b - - */
97
98SETLINE,/* b - - LINE=b */
99SETLINEW,/* w - - LINE=w */ 102SETLINEW,/* w - - LINE=w */
100 103SETLINE /* b - - LINE=b */
101POP /* b - - TOP-=(b+1) */
102 104
103} OpCode; 105} OpCode;
104 106
diff --git a/lparser.c b/lparser.c
index 8d632038..a960dc13 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.12 1999/02/02 13:47:31 roberto Exp roberto $ 2** $Id: lparser.c,v 1.13 1999/02/02 17:57:49 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*/
@@ -114,6 +114,7 @@ static void chunk (LexState *ls);
114static void constructor (LexState *ls); 114static void constructor (LexState *ls);
115static void decinit (LexState *ls, listdesc *d); 115static void decinit (LexState *ls, listdesc *d);
116static void exp0 (LexState *ls, vardesc *v); 116static void exp0 (LexState *ls, vardesc *v);
117static void Gexp (LexState *ls, vardesc *v);
117static void exp1 (LexState *ls); 118static void exp1 (LexState *ls);
118static void exp2 (LexState *ls, vardesc *v); 119static void exp2 (LexState *ls, vardesc *v);
119static void explist (LexState *ls, listdesc *e); 120static void explist (LexState *ls, listdesc *e);
@@ -162,7 +163,7 @@ static int code_oparg_at (LexState *ls, int pc, OpCode op, int arg, int delta) {
162 return 2; /* code size (opcode + 1 byte) */ 163 return 2; /* code size (opcode + 1 byte) */
163 } 164 }
164 else if (arg <= MAX_WORD) { 165 else if (arg <= MAX_WORD) {
165 code[pc] = (Byte)(op+1); 166 code[pc] = (Byte)(op-1);
166 code[pc+1] = (Byte)(arg>>8); 167 code[pc+1] = (Byte)(arg>>8);
167 code[pc+2] = (Byte)(arg&0xFF); 168 code[pc+2] = (Byte)(arg&0xFF);
168 return 3; /* code size (opcode + 1 word) */ 169 return 3; /* code size (opcode + 1 word) */
@@ -429,6 +430,15 @@ static void code_args (LexState *ls, int nparams, int dots) {
429} 430}
430 431
431 432
433static void unloaddot (LexState *ls, vardesc *v) {
434 /* dotted variables <a.x> must be stored like regular indexed vars <a["x"]> */
435 if (v->k == VDOT) {
436 code_constant(ls, v->info);
437 v->k = VINDEXED;
438 }
439}
440
441
432static void lua_pushvar (LexState *ls, vardesc *var) { 442static void lua_pushvar (LexState *ls, vardesc *var) {
433 switch (var->k) { 443 switch (var->k) {
434 case VLOCAL: 444 case VLOCAL:
@@ -452,16 +462,16 @@ static void lua_pushvar (LexState *ls, vardesc *var) {
452} 462}
453 463
454 464
455static void storevar (LexState *ls, vardesc *var) { 465static void genstorevar (LexState *ls, vardesc *var, OpCode *codes) {
456 switch (var->k) { 466 switch (var->k) {
457 case VLOCAL: 467 case VLOCAL:
458 code_oparg(ls, SETLOCAL, var->info, -1); 468 code_oparg(ls, codes[0], var->info, -1);
459 break; 469 break;
460 case VGLOBAL: 470 case VGLOBAL:
461 code_oparg(ls, SETGLOBAL, var->info, -1); 471 code_oparg(ls, codes[1], var->info, -1);
462 break; 472 break;
463 case VINDEXED: 473 case VINDEXED:
464 code_opcode(ls, SETTABLE0, -3); 474 code_opcode(ls, codes[2], -3);
465 break; 475 break;
466 default: 476 default:
467 LUA_INTERNALERROR("invalid var kind to store"); 477 LUA_INTERNALERROR("invalid var kind to store");
@@ -469,6 +479,12 @@ static void storevar (LexState *ls, vardesc *var) {
469} 479}
470 480
471 481
482static void storevar (LexState *ls, vardesc *var) {
483 static OpCode codes[] = {SETLOCAL, SETGLOBAL, SETTABLE0};
484 genstorevar(ls, var, codes);
485}
486
487
472static int fix_jump (LexState *ls, int pc, OpCode op, int n) { 488static int fix_jump (LexState *ls, int pc, OpCode op, int n) {
473 /* jump is relative to position following jump instruction */ 489 /* jump is relative to position following jump instruction */
474 return fix_opcode(ls, pc, op, n-(pc+JMPSIZE)); 490 return fix_opcode(ls, pc, op, n-(pc+JMPSIZE));
@@ -932,6 +948,21 @@ static void exp0 (LexState *ls, vardesc *v) {
932} 948}
933 949
934 950
951static void Gexp (LexState *ls, vardesc *v) {
952 /* Gexp -> exp0 | var '=' exp1 */
953 static OpCode codes[] = {SETLOCALDUP, SETGLOBALDUP, SETTABLEDUP};
954 exp0(ls, v);
955 if (ls->token == '=' && v->k != VEXP) { /* assignment expression? */
956 next(ls); /* skip '=' */
957 unloaddot(ls, v);
958 exp1(ls);
959 genstorevar(ls, v, codes);
960 deltastack(ls, 1); /* DUP operations push an extra value */
961 v->k = VEXP; v->info = 0;
962 }
963}
964
965
935static void push (LexState *ls, stack_op *s, int op) { 966static void push (LexState *ls, stack_op *s, int op) {
936 if (s->top == MAXOPS) 967 if (s->top == MAXOPS)
937 luaX_error(ls, "expression too complex"); 968 luaX_error(ls, "expression too complex");
@@ -993,9 +1024,9 @@ static void simpleexp (LexState *ls, vardesc *v, stack_op *s) {
993 ifpart(ls, 1, ls->linenumber); 1024 ifpart(ls, 1, ls->linenumber);
994 break; 1025 break;
995 1026
996 case '(': /* simpleexp -> '(' exp0 ')' */ 1027 case '(': /* simpleexp -> '(' Gexp ')' */
997 next(ls); 1028 next(ls);
998 exp0(ls, v); 1029 Gexp(ls, v);
999 check(ls, ')'); 1030 check(ls, ')');
1000 return; 1031 return;
1001 1032
@@ -1206,13 +1237,10 @@ static void decinit (LexState *ls, listdesc *d) {
1206 } 1237 }
1207} 1238}
1208 1239
1240
1209static int assignment (LexState *ls, vardesc *v, int nvars) { 1241static int assignment (LexState *ls, vardesc *v, int nvars) {
1210 int left = 0; 1242 int left = 0;
1211 /* dotted variables <a.x> must be stored like regular indexed vars <a["x"]> */ 1243 unloaddot(ls, v);
1212 if (v->k == VDOT) {
1213 code_constant(ls, v->info);
1214 v->k = VINDEXED;
1215 }
1216 if (ls->token == ',') { /* assignment -> ',' NAME assignment */ 1244 if (ls->token == ',') { /* assignment -> ',' NAME assignment */
1217 vardesc nv; 1245 vardesc nv;
1218 next(ls); 1246 next(ls);
diff --git a/lvm.c b/lvm.c
index 082c7e8f..d10dae92 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.41 1999/01/25 17:39:28 roberto Exp roberto $ 2** $Id: lvm.c,v 1.42 1999/02/02 17:57:49 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*/
@@ -330,12 +330,24 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
330 register int aux = 0; 330 register int aux = 0;
331 switch ((OpCode)*pc++) { 331 switch ((OpCode)*pc++) {
332 332
333 case ENDCODE: aux = 1;
334 S->top = S->stack + base;
335 /* goes through */
336 case RETCODE:
337 if (lua_callhook)
338 luaD_callHook(base, NULL, 1);
339 return base + (aux ? 0 : *pc);
340
333 case PUSHNIL: aux = *pc++; 341 case PUSHNIL: aux = *pc++;
334 do { 342 do {
335 ttype(S->top++) = LUA_T_NIL; 343 ttype(S->top++) = LUA_T_NIL;
336 } while (aux--); 344 } while (aux--);
337 break; 345 break;
338 346
347 case POP: aux = *pc++;
348 S->top -= (aux+1);
349 break;
350
339 case PUSHNUMBERW: aux = highbyte(*pc++); 351 case PUSHNUMBERW: aux = highbyte(*pc++);
340 case PUSHNUMBER: aux += *pc++; 352 case PUSHNUMBER: aux += *pc++;
341 ttype(S->top) = LUA_T_NUMBER; 353 ttype(S->top) = LUA_T_NUMBER;
@@ -343,6 +355,15 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
343 S->top++; 355 S->top++;
344 break; 356 break;
345 357
358 case PUSHCONSTANTW: aux = highbyte(*pc++);
359 case PUSHCONSTANT: aux += *pc++;
360 *S->top++ = consts[aux];
361 break;
362
363 case PUSHUPVALUE: aux = *pc++;
364 *S->top++ = cl->consts[aux+1];
365 break;
366
346 case PUSHLOCAL: aux = *pc++; 367 case PUSHLOCAL: aux = *pc++;
347 *S->top++ = *((S->stack+base) + aux); 368 *S->top++ = *((S->stack+base) + aux);
348 break; 369 break;
@@ -371,28 +392,45 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
371 break; 392 break;
372 } 393 }
373 394
374 case PUSHCONSTANTW: aux = highbyte(*pc++); 395 case CREATEARRAYW: aux = highbyte(*pc++);
375 case PUSHCONSTANT: aux += *pc++; 396 case CREATEARRAY: aux += *pc++;
376 *S->top++ = consts[aux]; 397 luaC_checkGC();
377 break; 398 avalue(S->top) = luaH_new(aux);
378 399 ttype(S->top) = LUA_T_ARRAY;
379 case PUSHUPVALUE: aux = *pc++; 400 S->top++;
380 *S->top++ = cl->consts[aux+1];
381 break; 401 break;
382 402
383 case SETLOCAL: aux = *pc++; 403 case SETLOCAL: aux = *pc++;
384 *((S->stack+base) + aux) = *(--S->top); 404 *((S->stack+base) + aux) = *(--S->top);
385 break; 405 break;
386 406
407 case SETLOCALDUP: aux = *pc++;
408 *((S->stack+base) + aux) = *(S->top-1);
409 break;
410
387 case SETGLOBALW: aux = highbyte(*pc++); 411 case SETGLOBALW: aux = highbyte(*pc++);
388 case SETGLOBAL: aux += *pc++; 412 case SETGLOBAL: aux += *pc++;
389 luaV_setglobal(tsvalue(&consts[aux])); 413 luaV_setglobal(tsvalue(&consts[aux]));
390 break; 414 break;
391 415
416 case SETGLOBALDUPW: aux = highbyte(*pc++);
417 case SETGLOBALDUP: aux += *pc++;
418 *S->top = *(S->top-1);
419 S->top++;
420 luaV_setglobal(tsvalue(&consts[aux]));
421 break;
422
392 case SETTABLE0: 423 case SETTABLE0:
393 luaV_settable(S->top-3, 0); 424 luaV_settable(S->top-3, 0);
394 break; 425 break;
395 426
427 case SETTABLEDUP: {
428 TObject temp = *(S->top-1);
429 luaV_settable(S->top-3, 0);
430 *(S->top++) = temp;
431 break;
432 }
433
396 case SETTABLE: 434 case SETTABLE:
397 luaV_settable(S->top-3-(*pc++), 1); 435 luaV_settable(S->top-3-(*pc++), 1);
398 break; 436 break;
@@ -416,18 +454,6 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
416 break; 454 break;
417 } 455 }
418 456
419 case POP: aux = *pc++;
420 S->top -= (aux+1);
421 break;
422
423 case CREATEARRAYW: aux = highbyte(*pc++);
424 case CREATEARRAY: aux += *pc++;
425 luaC_checkGC();
426 avalue(S->top) = luaH_new(aux);
427 ttype(S->top) = LUA_T_ARRAY;
428 S->top++;
429 break;
430
431 case NEQOP: aux = 1; 457 case NEQOP: aux = 1;
432 case EQOP: { 458 case EQOP: {
433 int res = luaO_equalObj(S->top-2, S->top-1); 459 int res = luaO_equalObj(S->top-2, S->top-1);
@@ -579,14 +605,6 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
579 break; 605 break;
580 } 606 }
581 607
582 case ENDCODE: aux = 1;
583 S->top = S->stack + base;
584 /* goes through */
585 case RETCODE:
586 if (lua_callhook)
587 luaD_callHook(base, NULL, 1);
588 return base + (aux ? 0 : *pc);
589
590 case SETLINEW: aux = highbyte(*pc++); 608 case SETLINEW: aux = highbyte(*pc++);
591 case SETLINE: aux += *pc++; 609 case SETLINE: aux += *pc++;
592 if ((S->stack+base-1)->ttype != LUA_T_LINE) { 610 if ((S->stack+base-1)->ttype != LUA_T_LINE) {
@@ -600,10 +618,6 @@ StkId luaV_execute (Closure *cl, TProtoFunc *tf, StkId base) {
600 luaD_lineHook(aux); 618 luaD_lineHook(aux);
601 break; 619 break;
602 620
603#ifdef DEBUG
604 default:
605 LUA_INTERNALERROR("opcode doesn't match");
606#endif
607 } 621 }
608 } 622 }
609} 623}