diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1995-10-04 14:13:02 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1995-10-04 14:13:02 -0300 |
| commit | 68f337dfa617732646a4a974eb33b25daf45a1e2 (patch) | |
| tree | 81e72eaf0ada8a2246c6cf1af2d96ddaef41d117 /lua.stx | |
| parent | f132ac03bcaf0163f1f86b5114c93a753e17f28b (diff) | |
| download | lua-68f337dfa617732646a4a974eb33b25daf45a1e2.tar.gz lua-68f337dfa617732646a4a974eb33b25daf45a1e2.tar.bz2 lua-68f337dfa617732646a4a974eb33b25daf45a1e2.zip | |
Garbage collection of functions + header structure for functions
Diffstat (limited to 'lua.stx')
| -rw-r--r-- | lua.stx | 31 |
1 files changed, 18 insertions, 13 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | 2 | ||
| 3 | char *rcs_luastx = "$Id: lua.stx,v 3.18 1995/04/11 17:56:30 celes Exp roberto $"; | 3 | char *rcs_luastx = "$Id: lua.stx,v 3.19 1995/06/08 19:47:28 roberto Exp $"; |
| 4 | 4 | ||
| 5 | #include <stdio.h> | 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
| @@ -13,6 +13,7 @@ char *rcs_luastx = "$Id: lua.stx,v 3.18 1995/04/11 17:56:30 celes Exp roberto $" | |||
| 13 | #include "tree.h" | 13 | #include "tree.h" |
| 14 | #include "table.h" | 14 | #include "table.h" |
| 15 | #include "lua.h" | 15 | #include "lua.h" |
| 16 | #include "func.h" | ||
| 16 | 17 | ||
| 17 | /* to avoid warnings generated by yacc */ | 18 | /* to avoid warnings generated by yacc */ |
| 18 | int yyparse (void); | 19 | int yyparse (void); |
| @@ -84,10 +85,10 @@ static void code_float (float n) | |||
| 84 | code_byte(code.m.c4); | 85 | code_byte(code.m.c4); |
| 85 | } | 86 | } |
| 86 | 87 | ||
| 87 | static void code_code (Byte *b) | 88 | static void code_code (TFunc *tf) |
| 88 | { | 89 | { |
| 89 | CodeCode code; | 90 | CodeCode code; |
| 90 | code.b = b; | 91 | code.tf = tf; |
| 91 | code_byte(code.m.c1); | 92 | code_byte(code.m.c1); |
| 92 | code_byte(code.m.c2); | 93 | code_byte(code.m.c2); |
| 93 | code_byte(code.m.c3); | 94 | code_byte(code.m.c3); |
| @@ -246,7 +247,7 @@ static void init_function (TreeNode *func) | |||
| 246 | if (lua_debug) | 247 | if (lua_debug) |
| 247 | { | 248 | { |
| 248 | code_byte(SETFUNCTION); | 249 | code_byte(SETFUNCTION); |
| 249 | code_code((Byte *)luaI_strdup(lua_file[lua_nfile-1])); | 250 | code_code((TFunc *)luaI_strdup(lua_file[lua_nfile-1])); |
| 250 | code_word(luaI_findconstant(func)); | 251 | code_word(luaI_findconstant(func)); |
| 251 | } | 252 | } |
| 252 | } | 253 | } |
| @@ -353,14 +354,15 @@ static void yyerror (char *s) | |||
| 353 | /* | 354 | /* |
| 354 | ** Parse LUA code. | 355 | ** Parse LUA code. |
| 355 | */ | 356 | */ |
| 356 | void lua_parse (Byte **code) | 357 | void lua_parse (TFunc *tf) |
| 357 | { | 358 | { |
| 358 | initcode = code; | 359 | initcode = &(tf->code); |
| 359 | *initcode = newvector(CODE_BLOCK, Byte); | 360 | *initcode = newvector(CODE_BLOCK, Byte); |
| 360 | maincode = 0; | 361 | maincode = 0; |
| 361 | maxmain = CODE_BLOCK; | 362 | maxmain = CODE_BLOCK; |
| 362 | if (yyparse ()) lua_error("parse error"); | 363 | if (yyparse ()) lua_error("parse error"); |
| 363 | (*initcode)[maincode++] = RETCODE0; | 364 | (*initcode)[maincode++] = RETCODE0; |
| 365 | tf->size = maincode; | ||
| 364 | #if LISTING | 366 | #if LISTING |
| 365 | { static void PrintCode (Byte *c, Byte *end); | 367 | { static void PrintCode (Byte *c, Byte *end); |
| 366 | PrintCode(*initcode,*initcode+maincode); } | 368 | PrintCode(*initcode,*initcode+maincode); } |
| @@ -378,7 +380,7 @@ void lua_parse (Byte **code) | |||
| 378 | char *pChar; | 380 | char *pChar; |
| 379 | Word vWord; | 381 | Word vWord; |
| 380 | Long vLong; | 382 | Long vLong; |
| 381 | Byte *pByte; | 383 | TFunc *pFunc; |
| 382 | TreeNode *pNode; | 384 | TreeNode *pNode; |
| 383 | } | 385 | } |
| 384 | 386 | ||
| @@ -401,7 +403,7 @@ void lua_parse (Byte **code) | |||
| 401 | %type <vInt> ffieldlist, ffieldlist1, semicolonpart | 403 | %type <vInt> ffieldlist, ffieldlist1, semicolonpart |
| 402 | %type <vInt> lfieldlist, lfieldlist1 | 404 | %type <vInt> lfieldlist, lfieldlist1 |
| 403 | %type <vLong> var, singlevar | 405 | %type <vLong> var, singlevar |
| 404 | %type <pByte> body | 406 | %type <pFunc> body |
| 405 | 407 | ||
| 406 | %left AND OR | 408 | %left AND OR |
| 407 | %left EQ NE '>' '<' LE GE | 409 | %left EQ NE '>' '<' LE GE |
| @@ -437,8 +439,9 @@ function : FUNCTION NAME | |||
| 437 | body | 439 | body |
| 438 | { | 440 | { |
| 439 | Word func = luaI_findsymbol($2); | 441 | Word func = luaI_findsymbol($2); |
| 442 | luaI_insertfunction($4); /* may take part in GC */ | ||
| 440 | s_tag(func) = LUA_T_FUNCTION; | 443 | s_tag(func) = LUA_T_FUNCTION; |
| 441 | s_bvalue(func) = $4; | 444 | lua_table[func].object.value.tf = $4; |
| 442 | } | 445 | } |
| 443 | ; | 446 | ; |
| 444 | 447 | ||
| @@ -465,8 +468,10 @@ method : FUNCTION NAME ':' NAME | |||
| 465 | body : '(' parlist ')' block END | 468 | body : '(' parlist ')' block END |
| 466 | { | 469 | { |
| 467 | codereturn(); | 470 | codereturn(); |
| 468 | $$ = newvector(pc, Byte); | 471 | $$ = new(TFunc); |
| 469 | memcpy($$, basepc, pc*sizeof(Byte)); | 472 | $$->size = pc; |
| 473 | $$->code = newvector(pc, Byte); | ||
| 474 | memcpy($$->code, basepc, pc*sizeof(Byte)); | ||
| 470 | funcCode = basepc; maxcode=maxcurr; | 475 | funcCode = basepc; maxcode=maxcurr; |
| 471 | #if LISTING | 476 | #if LISTING |
| 472 | PrintCode(funcCode,funcCode+pc); | 477 | PrintCode(funcCode,funcCode+pc); |
| @@ -805,7 +810,7 @@ static void PrintCode (Byte *code, Byte *end) | |||
| 805 | int n = p-code; | 810 | int n = p-code; |
| 806 | p++; | 811 | p++; |
| 807 | get_code(c,p); | 812 | get_code(c,p); |
| 808 | printf ("%d PUSHFUNCTION %p\n", n, c.b); | 813 | printf ("%d PUSHFUNCTION %p\n", n, c.tf); |
| 809 | } | 814 | } |
| 810 | break; | 815 | break; |
| 811 | 816 | ||
| @@ -969,7 +974,7 @@ static void PrintCode (Byte *code, Byte *end) | |||
| 969 | p++; | 974 | p++; |
| 970 | get_code(c1,p); | 975 | get_code(c1,p); |
| 971 | get_word(c2,p); | 976 | get_word(c2,p); |
| 972 | printf ("%d SETFUNCTION %s %d\n", n, (char *)c1.b, c2.w); | 977 | printf ("%d SETFUNCTION %s %d\n", n, (char *)c1.tf, c2.w); |
| 973 | } | 978 | } |
| 974 | break; | 979 | break; |
| 975 | case SETLINE: | 980 | case SETLINE: |
