aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-02-13 18:38:20 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-02-13 18:38:20 -0200
commit7f3d01c200df33b67d1f4b0198adae7ea7af8e10 (patch)
tree2b40697bd4f825e913c9bcac2905f49f6c8d64cf
parent0ea84a3e799b45ea4a0e3dc2274e6034f0d2fb06 (diff)
downloadlua-7f3d01c200df33b67d1f4b0198adae7ea7af8e10.tar.gz
lua-7f3d01c200df33b67d1f4b0198adae7ea7af8e10.tar.bz2
lua-7f3d01c200df33b67d1f4b0198adae7ea7af8e10.zip
otimizacao do codigo para construtores.
correcao do tamanho do buffer de codigo.
-rw-r--r--lua.stx173
1 files changed, 115 insertions, 58 deletions
diff --git a/lua.stx b/lua.stx
index a3660736..437f1f88 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 1.2 1993/12/22 21:19:23 roberto Exp roberto $"; 3char *rcs_luastx = "$Id: lua.stx,v 1.3 1993/12/28 16:42:29 roberto Exp roberto $";
4 4
5#include <stdio.h> 5#include <stdio.h>
6#include <stdlib.h> 6#include <stdlib.h>
@@ -12,6 +12,8 @@ char *rcs_luastx = "$Id: lua.stx,v 1.2 1993/12/22 21:19:23 roberto Exp roberto $
12#include "table.h" 12#include "table.h"
13#include "lua.h" 13#include "lua.h"
14 14
15#define LISTING 0
16
15#ifndef ALIGNMENT 17#ifndef ALIGNMENT
16#define ALIGNMENT (sizeof(void *)) 18#define ALIGNMENT (sizeof(void *))
17#endif 19#endif
@@ -19,7 +21,7 @@ char *rcs_luastx = "$Id: lua.stx,v 1.2 1993/12/22 21:19:23 roberto Exp roberto $
19#ifndef MAXCODE 21#ifndef MAXCODE
20#define MAXCODE 1024 22#define MAXCODE 1024
21#endif 23#endif
22static long buffer[MAXCODE]; 24static long buffer[MAXCODE*sizeof(Byte)/sizeof(long)];
23static Byte *code = (Byte *)buffer; 25static Byte *code = (Byte *)buffer;
24static long mainbuffer[MAXCODE]; 26static long mainbuffer[MAXCODE];
25static Byte *maincode = (Byte *)mainbuffer; 27static Byte *maincode = (Byte *)mainbuffer;
@@ -27,16 +29,20 @@ static Byte *basepc;
27static Byte *pc; 29static Byte *pc;
28 30
29#define MAXVAR 32 31#define MAXVAR 32
30static long varbuffer[MAXVAR]; 32static long varbuffer[MAXVAR]; /* variables in an assignment list;
31static Byte nvarbuffer=0; /* number of variables at a list */ 33 it's long to store negative Word values */
34static int nvarbuffer=0; /* number of variables at a list */
35
36static Word localvar[STACKGAP]; /* store local variable names */
37static int nlocalvar=0; /* number of local variables */
32 38
33static Word localvar[STACKGAP]; 39#define MAXFIELDS FIELDS_PER_FLUSH*2
34static Byte nlocalvar=0; /* number of local variables */ 40static Word fields[MAXFIELDS]; /* fieldnames to be flushed */
41static int nfields=0;
35static int ntemp; /* number of temporary var into stack */ 42static int ntemp; /* number of temporary var into stack */
36static int err; /* flag to indicate error */ 43static int err; /* flag to indicate error */
37 44
38/* Internal functions */ 45/* Internal functions */
39#define align(n) align_n(sizeof(n))
40 46
41static void code_byte (Byte c) 47static void code_byte (Byte c)
42{ 48{
@@ -48,6 +54,14 @@ static void code_byte (Byte c)
48 *pc++ = c; 54 *pc++ = c;
49} 55}
50 56
57#define align(t,n) align_n(sizeof(t),n)
58static void align_n (unsigned size, int gap)
59{
60 if (size > ALIGNMENT) size = ALIGNMENT;
61 while (((pc+gap-code)%size) != 0) /* +gap to include BYTECODEs */
62 code_byte (NOP);
63}
64
51static void code_word (Word n) 65static void code_word (Word n)
52{ 66{
53 if (pc-basepc>MAXCODE-sizeof(Word)) 67 if (pc-basepc>MAXCODE-sizeof(Word))
@@ -70,6 +84,43 @@ static void code_float (float n)
70 pc += sizeof(float); 84 pc += sizeof(float);
71} 85}
72 86
87static void push_field (Word name)
88{
89 if (nfields < STACKGAP-1)
90 fields[nfields++] = name;
91 else
92 {
93 lua_error ("too many fields in a constructor");
94 err = 1;
95 }
96}
97
98static void flush_record (int n)
99{
100 int i;
101 if (n == 0) return;
102 align(Word,2); /* two bytes before the actual word */
103 code_byte(STORERECORD);
104 code_byte(n);
105 for (i=0; i<n; i++)
106 code_word(lua_findconstant(s_name(fields[--nfields])));
107 ntemp -= n;
108}
109
110static void flush_list (int m, int n)
111{
112 if (n == 0) return;
113 if (m == 0)
114 code_byte(STORELIST0);
115 else
116 {
117 code_byte(STORELIST);
118 code_byte(m);
119 }
120 code_byte(n);
121 ntemp-=n;
122}
123
73static void incr_ntemp (void) 124static void incr_ntemp (void)
74{ 125{
75 if (ntemp+nlocalvar+MAXVAR+1 < STACKGAP) 126 if (ntemp+nlocalvar+MAXVAR+1 < STACKGAP)
@@ -103,13 +154,6 @@ static void incr_nvarbuffer (void)
103 } 154 }
104} 155}
105 156
106static void align_n (unsigned size)
107{
108 if (size > ALIGNMENT) size = ALIGNMENT;
109 while (((pc+1-code)%size) != 0) /* +1 to include BYTECODE */
110 code_byte (NOP);
111}
112
113static void code_number (float f) 157static void code_number (float f)
114{ Word i = (Word)f; 158{ Word i = (Word)f;
115 if (f == (float)i) /* f has an (short) integer value */ 159 if (f == (float)i) /* f has an (short) integer value */
@@ -122,14 +166,14 @@ static void code_number (float f)
122 } 166 }
123 else 167 else
124 { 168 {
125 align(Word); 169 align(Word,1);
126 code_byte(PUSHWORD); 170 code_byte(PUSHWORD);
127 code_word(i); 171 code_word(i);
128 } 172 }
129 } 173 }
130 else 174 else
131 { 175 {
132 align(float); 176 align(float,1);
133 code_byte(PUSHFLOAT); 177 code_byte(PUSHFLOAT);
134 code_float(f); 178 code_float(f);
135 } 179 }
@@ -179,7 +223,13 @@ static void code_number (float f)
179 223
180 224
181functionlist : /* empty */ 225functionlist : /* empty */
182 | functionlist {pc=basepc=maincode; nlocalvar=0;} stat sc {maincode=pc;} 226 | functionlist { pc=basepc=maincode; nlocalvar=0;} stat sc
227 {
228 maincode=pc;
229#if LISTING
230 PrintCode(basepc,maincode);
231#endif
232 }
183 | functionlist function 233 | functionlist function
184 | functionlist setdebug 234 | functionlist setdebug
185 ; 235 ;
@@ -188,7 +238,7 @@ function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')'
188 { 238 {
189 if (lua_debug) 239 if (lua_debug)
190 { 240 {
191 align(Word); 241 align(Word,1);
192 code_byte(SETFUNCTION); 242 code_byte(SETFUNCTION);
193 code_word($1); 243 code_word($1);
194 code_word($2); 244 code_word($2);
@@ -203,6 +253,9 @@ function : FUNCTION NAME {pc=basepc=code; nlocalvar=0;} '(' parlist ')'
203 s_tag($2) = T_FUNCTION; 253 s_tag($2) = T_FUNCTION;
204 s_bvalue($2) = calloc (pc-code, sizeof(Byte)); 254 s_bvalue($2) = calloc (pc-code, sizeof(Byte));
205 memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte)); 255 memcpy (s_bvalue($2), code, (pc-code)*sizeof(Byte));
256#if LISTING
257PrintCode(code,pc);
258#endif
206 } 259 }
207 ; 260 ;
208 261
@@ -214,7 +267,7 @@ stat : {
214 ntemp = 0; 267 ntemp = 0;
215 if (lua_debug) 268 if (lua_debug)
216 { 269 {
217 align(Word); code_byte(SETLINE); code_word(lua_linenumber); 270 align(Word,1); code_byte(SETLINE); code_word(lua_linenumber);
218 } 271 }
219 } 272 }
220 stat1 273 stat1
@@ -311,7 +364,7 @@ block : {$<vInt>$ = nlocalvar;} statlist {ntemp = 0;} ret
311 ; 364 ;
312 365
313ret : /* empty */ 366ret : /* empty */
314 | { if (lua_debug){align(Word);code_byte(SETLINE);code_word(lua_linenumber);}} 367 | { if (lua_debug){align(Word,1);code_byte(SETLINE);code_word(lua_linenumber);}}
315 RETURN exprlist sc 368 RETURN exprlist sc
316 { 369 {
317 if (lua_debug) code_byte(RESET); 370 if (lua_debug) code_byte(RESET);
@@ -321,7 +374,7 @@ ret : /* empty */
321 374
322PrepJump : /* empty */ 375PrepJump : /* empty */
323 { 376 {
324 align(Word); 377 align(Word,1);
325 $$ = pc; 378 $$ = pc;
326 code_byte(0); /* open space */ 379 code_byte(0); /* open space */
327 code_word (0); 380 code_word (0);
@@ -354,7 +407,7 @@ expr : '(' expr ')' { $$ = $2; }
354 | NUMBER { code_number($1); $$ = 1; } 407 | NUMBER { code_number($1); $$ = 1; }
355 | STRING 408 | STRING
356 { 409 {
357 align(Word); 410 align(Word,1);
358 code_byte(PUSHSTRING); 411 code_byte(PUSHSTRING);
359 code_word($1); 412 code_word($1);
360 $$ = 1; 413 $$ = 1;
@@ -366,7 +419,7 @@ expr : '(' expr ')' { $$ = $2; }
366 $$ = 0; 419 $$ = 0;
367 if (lua_debug) 420 if (lua_debug)
368 { 421 {
369 align(Word); code_byte(SETLINE); code_word(lua_linenumber); 422 align(Word,1); code_byte(SETLINE); code_word(lua_linenumber);
370 } 423 }
371 } 424 }
372 | NOT expr1 { code_byte(NOTOP); $$ = 1;} 425 | NOT expr1 { code_byte(NOTOP); $$ = 1;}
@@ -410,7 +463,7 @@ typeconstructor: '@'
410 $$ = 0; 463 $$ = 0;
411 if (lua_debug) 464 if (lua_debug)
412 { 465 {
413 align(Word); code_byte(SETLINE); code_word(lua_linenumber); 466 align(Word,1); code_byte(SETLINE); code_word(lua_linenumber);
414 } 467 }
415 } 468 }
416 } 469 }
@@ -447,8 +500,12 @@ objectname : /* empty */ {$$=-1;}
447 | NAME {$$=$1;} 500 | NAME {$$=$1;}
448 ; 501 ;
449 502
450fieldlist : '{' ffieldlist '}' { $$ = $2; } 503fieldlist : '{' ffieldlist '}' { flush_record($2%FIELDS_PER_FLUSH); $$ = $2; }
451 | '[' lfieldlist ']' { $$ = $2; } 504 | '[' lfieldlist ']'
505 {
506 flush_list($2/FIELDS_PER_FLUSH, $2%FIELDS_PER_FLUSH);
507 $$ = $2;
508 }
452 ; 509 ;
453 510
454ffieldlist : /* empty */ { $$ = 0; } 511ffieldlist : /* empty */ { $$ = 0; }
@@ -456,39 +513,29 @@ ffieldlist : /* empty */ { $$ = 0; }
456 ; 513 ;
457 514
458ffieldlist1 : ffield {$$=1;} 515ffieldlist1 : ffield {$$=1;}
459 | ffieldlist1 ',' ffield {$$=$1+1;} 516 | ffieldlist1 ',' ffield
517 {
518 $$=$1+1;
519 if ($$%FIELDS_PER_FLUSH == 0) flush_record(FIELDS_PER_FLUSH);
520 }
460 ; 521 ;
461 522
462ffield : NAME 523ffield : NAME '=' expr1 { push_field($1); }
463 {
464 align(Word);
465 code_byte(PUSHSTRING);
466 code_word(lua_findconstant (s_name($1)));
467 incr_ntemp();
468 }
469 '=' expr1
470 {
471 code_byte(STOREFIELD);
472 ntemp-=2;
473 }
474 ; 524 ;
475 525
476lfieldlist : /* empty */ { $$ = 0; } 526lfieldlist : /* empty */ { $$ = 0; }
477 | lfieldlist1 { $$ = $1; } 527 | lfieldlist1 { $$ = $1; }
478 ; 528 ;
479 529
480lfieldlist1 : { code_number(1); } lfield {$$=1;} 530lfieldlist1 : expr1 {$$=1;}
481 | lfieldlist1 ',' { code_number($1+1); } lfield 531 | lfieldlist1 ',' expr1
482 {$$=$1+1;} 532 {
533 $$=$1+1;
534 if ($$%FIELDS_PER_FLUSH == 0)
535 flush_list($$/FIELDS_PER_FLUSH - 1, FIELDS_PER_FLUSH);
536 }
483 ; 537 ;
484 538
485lfield : expr1
486 {
487 code_byte(STOREFIELD);
488 ntemp-=2;
489 }
490 ;
491
492varlist1 : var 539varlist1 : var
493 { 540 {
494 nvarbuffer = 0; 541 nvarbuffer = 0;
@@ -517,7 +564,7 @@ var : NAME
517 } 564 }
518 | var {lua_pushvar ($1);} '.' NAME 565 | var {lua_pushvar ($1);} '.' NAME
519 { 566 {
520 align(Word); 567 align(Word,1);
521 code_byte(PUSHSTRING); 568 code_byte(PUSHSTRING);
522 code_word(lua_findconstant (s_name($4))); incr_ntemp(); 569 code_word(lua_findconstant (s_name($4))); incr_ntemp();
523 $$ = 0; /* indexed variable */ 570 $$ = 0; /* indexed variable */
@@ -556,7 +603,7 @@ static void lua_pushvar (long number)
556{ 603{
557 if (number > 0) /* global var */ 604 if (number > 0) /* global var */
558 { 605 {
559 align(Word); 606 align(Word,1);
560 code_byte(PUSHGLOBAL); 607 code_byte(PUSHGLOBAL);
561 code_word(number-1); 608 code_word(number-1);
562 incr_ntemp(); 609 incr_ntemp();
@@ -589,7 +636,7 @@ static void lua_codestore (int i)
589{ 636{
590 if (varbuffer[i] > 0) /* global var */ 637 if (varbuffer[i] > 0) /* global var */
591 { 638 {
592 align(Word); 639 align(Word,1);
593 code_byte(STOREGLOBAL); 640 code_byte(STOREGLOBAL);
594 code_word(varbuffer[i]-1); 641 code_word(varbuffer[i]-1);
595 } 642 }
@@ -652,13 +699,12 @@ int lua_parse (void)
652} 699}
653 700
654 701
655#if 0 702#if LISTING
656 703
657static void PrintCode (void) 704static void PrintCode (Byte *p, Byte *end)
658{ 705{
659 Byte *p = code;
660 printf ("\n\nCODE\n"); 706 printf ("\n\nCODE\n");
661 while (p != pc) 707 while (p != end)
662 { 708 {
663 switch ((OpCode)*p) 709 switch ((OpCode)*p)
664 { 710 {
@@ -707,7 +753,7 @@ static void PrintCode (void)
707 p++; 753 p++;
708 break; 754 break;
709 case STORELOCAL: 755 case STORELOCAL:
710 printf ("%d STORELOCAK %d\n", p-code, *(++p)); 756 printf ("%d STORELOCAL %d\n", p-code, *(++p));
711 p++; 757 p++;
712 break; 758 break;
713 case STOREGLOBAL: 759 case STOREGLOBAL:
@@ -718,7 +764,18 @@ static void PrintCode (void)
718 case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p)); 764 case STOREINDEXED: printf ("%d STOREINDEXED %d\n", p-code, *(++p));
719 p++; 765 p++;
720 break; 766 break;
721 case STOREFIELD: printf ("%d STOREFIELD\n", (p++)-code); break; 767 case STORELIST0:
768 printf("%d STORELIST0 %d\n", p-code, *(++p));
769 p++;
770 break;
771 case STORELIST:
772 printf("%d STORELIST %d %d\n", p-code, *(p+1), *(p+2));
773 p+=3;
774 break;
775 case STORERECORD:
776 printf("%d STORERECORD %d\n", p-code, *(++p));
777 p += *p*sizeof(Word) + 1;
778 break;
722 case ADJUST: 779 case ADJUST:
723 printf ("%d ADJUST %d\n", p-code, *(++p)); 780 printf ("%d ADJUST %d\n", p-code, *(++p));
724 p++; 781 p++;