aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua.stx101
1 files changed, 36 insertions, 65 deletions
diff --git a/lua.stx b/lua.stx
index 1b365942..c1f54df0 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,11 +1,12 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 3.5 1994/11/13 14:54:18 roberto Exp roberto $"; 3char *rcs_luastx = "$Id: lua.stx,v 3.6 1994/11/14 21:40:14 roberto Exp $";
4 4
5#include <stdio.h> 5#include <stdio.h>
6#include <stdlib.h> 6#include <stdlib.h>
7#include <string.h> 7#include <string.h>
8 8
9#include "mem.h"
9#include "opcode.h" 10#include "opcode.h"
10#include "hash.h" 11#include "hash.h"
11#include "inout.h" 12#include "inout.h"
@@ -14,7 +15,7 @@ char *rcs_luastx = "$Id: lua.stx,v 3.5 1994/11/13 14:54:18 roberto Exp roberto $
14#include "lua.h" 15#include "lua.h"
15 16
16#ifndef LISTING 17#ifndef LISTING
17#define LISTING 0 18#define LISTING 1
18#endif 19#endif
19 20
20#ifndef CODE_BLOCK 21#ifndef CODE_BLOCK
@@ -49,9 +50,7 @@ static void code_byte (Byte c)
49 if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */ 50 if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */
50 { 51 {
51 maxcurr *= 2; 52 maxcurr *= 2;
52 basepc = (Byte *)realloc(basepc, maxcurr*sizeof(Byte)); 53 basepc = growvector(basepc, maxcurr, Byte);
53 if (basepc == NULL)
54 lua_error ("not enough memory");
55 } 54 }
56 basepc[pc++] = c; 55 basepc[pc++] = c;
57} 56}
@@ -271,10 +270,8 @@ method : FUNCTION NAME ':' NAME
271body : '(' parlist ')' block END 270body : '(' parlist ')' block END
272 { 271 {
273 codereturn(); 272 codereturn();
274 $$ = calloc (pc, sizeof(Byte)); 273 $$ = newvector(pc, Byte);
275 if ($$ == NULL) 274 memcpy($$, basepc, pc*sizeof(Byte));
276 lua_error("not enough memory");
277 memcpy ($$, basepc, pc*sizeof(Byte));
278 funcCode = basepc; maxcode=maxcurr; 275 funcCode = basepc; maxcode=maxcurr;
279 } 276 }
280 ; 277 ;
@@ -283,49 +280,29 @@ statlist : /* empty */
283 | statlist stat sc 280 | statlist stat sc
284 ; 281 ;
285 282
286stat : { codedebugline(); } stat1 ;
287
288sc : /* empty */ | ';' ; 283sc : /* empty */ | ';' ;
289 284
290cond : { codedebugline(); } expr1 ; 285stat : { codedebugline(); } stat1 ;
291 286
292stat1 : IF cond THEN PrepJump block PrepJump elsepart END 287cond : { codedebugline(); } expr1 ;
293 { 288
294 { 289stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END
295 Long elseinit = $6+sizeof(Word)+1; 290 { codeIf($4, $6); }
296 if (pc - elseinit == 0) /* no else */ 291
297 { 292 | WHILE {$<vLong>$=pc;} expr1 DO PrepJump block PrepJump END
298 pc -= sizeof(Word)+1;
299 elseinit = pc;
300 }
301 else
302 {
303 basepc[$6] = JMP;
304 code_word_at(basepc+$6+1, pc - elseinit);
305 }
306 basepc[$4] = IFFJMP;
307 code_word_at(basepc+$4+1,elseinit-($4+sizeof(Word)+1));
308 }
309 }
310
311 | WHILE {$<vLong>$=pc;} cond DO PrepJump block PrepJump END
312
313 { 293 {
314 basepc[$5] = IFFJMP; 294 basepc[$5] = IFFJMP;
315 code_word_at(basepc+$5+1, pc - ($5 + sizeof(Word)+1)); 295 code_word_at(basepc+$5+1, pc - ($5 + sizeof(Word)+1));
316
317 basepc[$7] = UPJMP; 296 basepc[$7] = UPJMP;
318 code_word_at(basepc+$7+1, pc - ($<vLong>2)); 297 code_word_at(basepc+$7+1, pc - ($<vLong>2));
319 } 298 }
320 299
321 | REPEAT {$<vLong>$=pc;} block UNTIL expr1 PrepJump 300 | REPEAT {$<vLong>$=pc;} block UNTIL cond PrepJump
322
323 { 301 {
324 basepc[$6] = IFFUPJMP; 302 basepc[$6] = IFFUPJMP;
325 code_word_at(basepc+$6+1, pc - ($<vLong>2)); 303 code_word_at(basepc+$6+1, pc - ($<vLong>2));
326 } 304 }
327 305
328
329 | varlist1 '=' exprlist1 306 | varlist1 '=' exprlist1
330 { 307 {
331 { 308 {
@@ -338,7 +315,7 @@ stat1 : IF cond THEN PrepJump block PrepJump elsepart END
338 } 315 }
339 } 316 }
340 | functioncall { code_byte(0); } 317 | functioncall { code_byte(0); }
341 | LOCAL localdeclist decinit 318 | LOCAL localdeclist decinit
342 { add_nlocalvar($2); 319 { add_nlocalvar($2);
343 adjust_mult_assign($2, $3, 0); 320 adjust_mult_assign($2, $3, 0);
344 } 321 }
@@ -346,24 +323,8 @@ stat1 : IF cond THEN PrepJump block PrepJump elsepart END
346 323
347elsepart : /* empty */ 324elsepart : /* empty */
348 | ELSE block 325 | ELSE block
349 | ELSEIF expr1 THEN PrepJump block PrepJump elsepart 326 | ELSEIF cond THEN PrepJump block PrepJump elsepart
350 { 327 { codeIf($4, $6); }
351 {
352 Long elseinit = $6+sizeof(Word)+1;
353 if (pc - elseinit == 0) /* no else */
354 {
355 pc -= sizeof(Word)+1;
356 elseinit = pc;
357 }
358 else
359 {
360 basepc[$6] = JMP;
361 code_word_at(basepc+$6+1, pc - elseinit);
362 }
363 basepc[$4] = IFFJMP;
364 code_word_at(basepc+$4+1, elseinit - ($4 + sizeof(Word)+1));
365 }
366 }
367 ; 328 ;
368 329
369block : {$<vInt>$ = nlocalvar;} statlist ret 330block : {$<vInt>$ = nlocalvar;} statlist ret
@@ -377,9 +338,8 @@ block : {$<vInt>$ = nlocalvar;} statlist ret
377 ; 338 ;
378 339
379ret : /* empty */ 340ret : /* empty */
380 | { codedebugline(); } 341 | RETURN { codedebugline(); } exprlist sc
381 RETURN exprlist sc 342 {
382 {
383 if ($3 < 0) code_byte(MULT_RET); 343 if ($3 < 0) code_byte(MULT_RET);
384 codereturn(); 344 codereturn();
385 } 345 }
@@ -642,9 +602,7 @@ static void init_function (TreeNode *func)
642{ 602{
643 if (funcCode == NULL) /* first function */ 603 if (funcCode == NULL) /* first function */
644 { 604 {
645 funcCode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); 605 funcCode = newvector(CODE_BLOCK, Byte);
646 if (funcCode == NULL)
647 lua_error("not enough memory");
648 maxcode = CODE_BLOCK; 606 maxcode = CODE_BLOCK;
649 } 607 }
650 pc=0; basepc=funcCode; maxcurr=maxcode; 608 pc=0; basepc=funcCode; maxcurr=maxcode;
@@ -730,6 +688,20 @@ static void lua_codestore (int i)
730 } 688 }
731} 689}
732 690
691static void codeIf (Long thenAdd, Long elseAdd)
692{
693 Long elseinit = elseAdd+sizeof(Word)+1;
694 if (pc == elseinit) /* no else */
695 pc -= sizeof(Word)+1;
696 else
697 {
698 basepc[elseAdd] = JMP;
699 code_word_at(basepc+elseAdd+1, pc-elseinit);
700 }
701 basepc[thenAdd] = IFFJMP;
702 code_word_at(basepc+thenAdd+1,elseinit-(thenAdd+sizeof(Word)+1));
703}
704
733void yyerror (char *s) 705void yyerror (char *s)
734{ 706{
735 static char msg[256]; 707 static char msg[256];
@@ -750,14 +722,13 @@ int yywrap (void)
750void lua_parse (Byte **code) 722void lua_parse (Byte **code)
751{ 723{
752 initcode = code; 724 initcode = code;
753 *initcode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); 725 *initcode = newvector(CODE_BLOCK, Byte);
754 maincode = 0; 726 maincode = 0;
755 maxmain = CODE_BLOCK; 727 maxmain = CODE_BLOCK;
756 if (*initcode == NULL) lua_error("not enough memory");
757 if (yyparse ()) lua_error("parse error"); 728 if (yyparse ()) lua_error("parse error");
758 (*initcode)[maincode++] = RETCODE0; 729 (*initcode)[maincode++] = RETCODE0;
759#if LISTING 730#if LISTING
760{ static void PrintCode (Byte *code, Byte *end); 731{ static void PrintCode (Byte *c, Byte *end);
761 PrintCode(*initcode,*initcode+maincode); } 732 PrintCode(*initcode,*initcode+maincode); }
762#endif 733#endif
763} 734}