diff options
| author | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-07-19 18:27:18 -0300 |
|---|---|---|
| committer | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-07-19 18:27:18 -0300 |
| commit | 493d718b7fe0f1075072a44d7946e38ca7d773d3 (patch) | |
| tree | 3239639a562d742002342166cce005f7d70cc503 | |
| parent | 1c749a3059051c52c3bc24540e27b0ccbcfff273 (diff) | |
| download | lua-493d718b7fe0f1075072a44d7946e38ca7d773d3.tar.gz lua-493d718b7fe0f1075072a44d7946e38ca7d773d3.tar.bz2 lua-493d718b7fe0f1075072a44d7946e38ca7d773d3.zip | |
Uso de arvores binarias para armazenar nomes e realocacao dinamica
de tabelas (pilhas, hashtable, globais, codigo, etc.)
Diffstat (limited to '')
| -rw-r--r-- | hash.c | 5 | ||||
| -rw-r--r-- | inout.c | 7 | ||||
| -rw-r--r-- | lua.stx | 49 | ||||
| -rw-r--r-- | opcode.c | 131 | ||||
| -rw-r--r-- | opcode.h | 6 | ||||
| -rw-r--r-- | table.c | 314 | ||||
| -rw-r--r-- | table.h | 14 |
7 files changed, 251 insertions, 275 deletions
| @@ -4,7 +4,7 @@ | |||
| 4 | ** Luiz Henrique de Figueiredo - 17 Aug 90 | 4 | ** Luiz Henrique de Figueiredo - 17 Aug 90 |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | char *rcs_hash="$Id: hash.c,v 1.2 1994/03/28 15:14:02 celes Exp celes $"; | 7 | char *rcs_hash="$Id: hash.c,v 2.1 1994/04/20 22:07:57 celes Exp celes $"; |
| 8 | 8 | ||
| 9 | #include <string.h> | 9 | #include <string.h> |
| 10 | #include <stdlib.h> | 10 | #include <stdlib.h> |
| @@ -31,9 +31,6 @@ char *rcs_hash="$Id: hash.c,v 1.2 1994/03/28 15:14:02 celes Exp celes $"; | |||
| 31 | #define ref_nvalue(n) (nvalue(&(n)->ref)) | 31 | #define ref_nvalue(n) (nvalue(&(n)->ref)) |
| 32 | #define ref_svalue(n) (svalue(&(n)->ref)) | 32 | #define ref_svalue(n) (svalue(&(n)->ref)) |
| 33 | 33 | ||
| 34 | #ifndef ARRAYBLOCK | ||
| 35 | #define ARRAYBLOCK 50 | ||
| 36 | #endif | ||
| 37 | 34 | ||
| 38 | typedef struct ArrayList | 35 | typedef struct ArrayList |
| 39 | { | 36 | { |
| @@ -4,7 +4,7 @@ | |||
| 4 | ** facilities. | 4 | ** facilities. |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | char *rcs_inout="$Id: inout.c,v 1.1 1993/12/17 18:41:19 celes Exp roberto $"; | 7 | char *rcs_inout="$Id: inout.c,v 1.2 1993/12/22 21:15:16 roberto Exp celes $"; |
| 8 | 8 | ||
| 9 | #include <stdio.h> | 9 | #include <stdio.h> |
| 10 | #include <string.h> | 10 | #include <string.h> |
| @@ -13,6 +13,7 @@ char *rcs_inout="$Id: inout.c,v 1.1 1993/12/17 18:41:19 celes Exp roberto $"; | |||
| 13 | #include "hash.h" | 13 | #include "hash.h" |
| 14 | #include "inout.h" | 14 | #include "inout.h" |
| 15 | #include "table.h" | 15 | #include "table.h" |
| 16 | #include "tree.h" | ||
| 16 | 17 | ||
| 17 | /* Exported variables */ | 18 | /* Exported variables */ |
| 18 | int lua_linenumber; | 19 | int lua_linenumber; |
| @@ -157,12 +158,12 @@ void lua_reportbug (char *s) | |||
| 157 | { | 158 | { |
| 158 | sprintf (strchr(msg,0), | 159 | sprintf (strchr(msg,0), |
| 159 | "\n\tin statement begining at line %d in function \"%s\" of file \"%s\"", | 160 | "\n\tin statement begining at line %d in function \"%s\" of file \"%s\"", |
| 160 | lua_debugline, s_name(funcstack[nfuncstack-1].function), | 161 | lua_debugline, lua_varname(funcstack[nfuncstack-1].function), |
| 161 | lua_file[funcstack[nfuncstack-1].file]); | 162 | lua_file[funcstack[nfuncstack-1].file]); |
| 162 | sprintf (strchr(msg,0), "\n\tactive stack\n"); | 163 | sprintf (strchr(msg,0), "\n\tactive stack\n"); |
| 163 | for (i=nfuncstack-1; i>=0; i--) | 164 | for (i=nfuncstack-1; i>=0; i--) |
| 164 | sprintf (strchr(msg,0), "\t-> function \"%s\" of file \"%s\"\n", | 165 | sprintf (strchr(msg,0), "\t-> function \"%s\" of file \"%s\"\n", |
| 165 | s_name(funcstack[i].function), | 166 | lua_varname(funcstack[i].function), |
| 166 | lua_file[funcstack[i].file]); | 167 | lua_file[funcstack[i].file]); |
| 167 | } | 168 | } |
| 168 | else | 169 | else |
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | 2 | ||
| 3 | char *rcs_luastx = "$Id: lua.stx,v 2.3 1994/04/19 19:06:15 celes Exp celes $"; | 3 | char *rcs_luastx = "$Id: lua.stx,v 2.4 1994/04/20 16:22:21 celes Exp celes $"; |
| 4 | 4 | ||
| 5 | #include <stdio.h> | 5 | #include <stdio.h> |
| 6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
| @@ -16,17 +16,17 @@ char *rcs_luastx = "$Id: lua.stx,v 2.3 1994/04/19 19:06:15 celes Exp celes $"; | |||
| 16 | 16 | ||
| 17 | #define LISTING 0 | 17 | #define LISTING 0 |
| 18 | 18 | ||
| 19 | #ifndef GAPCODE | 19 | #ifndef CODE_BLOCK |
| 20 | #define GAPCODE 50 | 20 | #define CODE_BLOCK 256 |
| 21 | #endif | 21 | #endif |
| 22 | static Word maxcode; | 22 | static Long maxcode; |
| 23 | static Word maxmain; | 23 | static Long maxmain; |
| 24 | static Word maxcurr ; | 24 | static Long maxcurr ; |
| 25 | static Byte *code = NULL; | 25 | static Byte *code = NULL; |
| 26 | static Byte *initcode; | 26 | static Byte *initcode; |
| 27 | static Byte *basepc; | 27 | static Byte *basepc; |
| 28 | static Word maincode; | 28 | static Long maincode; |
| 29 | static Word pc; | 29 | static Long pc; |
| 30 | 30 | ||
| 31 | #define MAXVAR 32 | 31 | #define MAXVAR 32 |
| 32 | static long varbuffer[MAXVAR]; /* variables in an assignment list; | 32 | static long varbuffer[MAXVAR]; /* variables in an assignment list; |
| @@ -48,7 +48,7 @@ static void code_byte (Byte c) | |||
| 48 | { | 48 | { |
| 49 | if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */ | 49 | if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */ |
| 50 | { | 50 | { |
| 51 | maxcurr += GAPCODE; | 51 | maxcurr *= 2; |
| 52 | basepc = (Byte *)realloc(basepc, maxcurr*sizeof(Byte)); | 52 | basepc = (Byte *)realloc(basepc, maxcurr*sizeof(Byte)); |
| 53 | if (basepc == NULL) | 53 | if (basepc == NULL) |
| 54 | { | 54 | { |
| @@ -155,7 +155,8 @@ static void incr_nvarbuffer (void) | |||
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | static void code_number (float f) | 157 | static void code_number (float f) |
| 158 | { Word i = (Word)f; | 158 | { |
| 159 | Word i = (Word)f; | ||
| 159 | if (f == (float)i) /* f has an (short) integer value */ | 160 | if (f == (float)i) /* f has an (short) integer value */ |
| 160 | { | 161 | { |
| 161 | if (i <= 2) code_byte(PUSH0 + i); | 162 | if (i <= 2) code_byte(PUSH0 + i); |
| @@ -184,10 +185,10 @@ static void code_number (float f) | |||
| 184 | %union | 185 | %union |
| 185 | { | 186 | { |
| 186 | int vInt; | 187 | int vInt; |
| 187 | long vLong; | ||
| 188 | float vFloat; | 188 | float vFloat; |
| 189 | char *pChar; | 189 | char *pChar; |
| 190 | Word vWord; | 190 | Word vWord; |
| 191 | Long vLong; | ||
| 191 | Byte *pByte; | 192 | Byte *pByte; |
| 192 | } | 193 | } |
| 193 | 194 | ||
| @@ -203,7 +204,7 @@ static void code_number (float f) | |||
| 203 | %token <pChar> NAME | 204 | %token <pChar> NAME |
| 204 | %token <vInt> DEBUG | 205 | %token <vInt> DEBUG |
| 205 | 206 | ||
| 206 | %type <vWord> PrepJump | 207 | %type <vLong> PrepJump |
| 207 | %type <vInt> expr, exprlist, exprlist1, varlist1, typeconstructor | 208 | %type <vInt> expr, exprlist, exprlist1, varlist1, typeconstructor |
| 208 | %type <vInt> fieldlist, localdeclist | 209 | %type <vInt> fieldlist, localdeclist |
| 209 | %type <vInt> ffieldlist, ffieldlist1 | 210 | %type <vInt> ffieldlist, ffieldlist1 |
| @@ -240,13 +241,13 @@ function : FUNCTION NAME | |||
| 240 | { | 241 | { |
| 241 | if (code == NULL) /* first function */ | 242 | if (code == NULL) /* first function */ |
| 242 | { | 243 | { |
| 243 | code = (Byte *) calloc(GAPCODE, sizeof(Byte)); | 244 | code = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); |
| 244 | if (code == NULL) | 245 | if (code == NULL) |
| 245 | { | 246 | { |
| 246 | lua_error("not enough memory"); | 247 | lua_error("not enough memory"); |
| 247 | err = 1; | 248 | err = 1; |
| 248 | } | 249 | } |
| 249 | maxcode = GAPCODE; | 250 | maxcode = CODE_BLOCK; |
| 250 | } | 251 | } |
| 251 | pc=0; basepc=code; maxcurr=maxcode; | 252 | pc=0; basepc=code; maxcurr=maxcode; |
| 252 | nlocalvar=0; | 253 | nlocalvar=0; |
| @@ -301,7 +302,7 @@ sc : /* empty */ | ';' ; | |||
| 301 | stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END | 302 | stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END |
| 302 | { | 303 | { |
| 303 | { | 304 | { |
| 304 | Word elseinit = $6+sizeof(Word)+1; | 305 | Long elseinit = $6+sizeof(Word)+1; |
| 305 | if (pc - elseinit == 0) /* no else */ | 306 | if (pc - elseinit == 0) /* no else */ |
| 306 | { | 307 | { |
| 307 | pc -= sizeof(Word)+1; | 308 | pc -= sizeof(Word)+1; |
| @@ -317,21 +318,21 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END | |||
| 317 | } | 318 | } |
| 318 | } | 319 | } |
| 319 | 320 | ||
| 320 | | WHILE {$<vWord>$=pc;} expr1 DO PrepJump block PrepJump END | 321 | | WHILE {$<vLong>$=pc;} expr1 DO PrepJump block PrepJump END |
| 321 | 322 | ||
| 322 | { | 323 | { |
| 323 | basepc[$5] = IFFJMP; | 324 | basepc[$5] = IFFJMP; |
| 324 | code_word_at(basepc+$5+1, pc - ($5 + sizeof(Word)+1)); | 325 | code_word_at(basepc+$5+1, pc - ($5 + sizeof(Word)+1)); |
| 325 | 326 | ||
| 326 | basepc[$7] = UPJMP; | 327 | basepc[$7] = UPJMP; |
| 327 | code_word_at(basepc+$7+1, pc - ($<vWord>2)); | 328 | code_word_at(basepc+$7+1, pc - ($<vLong>2)); |
| 328 | } | 329 | } |
| 329 | 330 | ||
| 330 | | REPEAT {$<vWord>$=pc;} block UNTIL expr1 PrepJump | 331 | | REPEAT {$<vLong>$=pc;} block UNTIL expr1 PrepJump |
| 331 | 332 | ||
| 332 | { | 333 | { |
| 333 | basepc[$6] = IFFUPJMP; | 334 | basepc[$6] = IFFUPJMP; |
| 334 | code_word_at(basepc+$6+1, pc - ($<vWord>2)); | 335 | code_word_at(basepc+$6+1, pc - ($<vLong>2)); |
| 335 | } | 336 | } |
| 336 | 337 | ||
| 337 | 338 | ||
| @@ -357,7 +358,7 @@ elsepart : /* empty */ | |||
| 357 | | ELSEIF expr1 THEN PrepJump block PrepJump elsepart | 358 | | ELSEIF expr1 THEN PrepJump block PrepJump elsepart |
| 358 | { | 359 | { |
| 359 | { | 360 | { |
| 360 | Word elseinit = $6+sizeof(Word)+1; | 361 | Long elseinit = $6+sizeof(Word)+1; |
| 361 | if (pc - elseinit == 0) /* no else */ | 362 | if (pc - elseinit == 0) /* no else */ |
| 362 | { | 363 | { |
| 363 | pc -= sizeof(Word)+1; | 364 | pc -= sizeof(Word)+1; |
| @@ -459,13 +460,13 @@ expr : '(' expr ')' { $$ = $2; } | |||
| 459 | typeconstructor: '@' | 460 | typeconstructor: '@' |
| 460 | { | 461 | { |
| 461 | code_byte(PUSHBYTE); | 462 | code_byte(PUSHBYTE); |
| 462 | $<vWord>$ = pc; code_byte(0); | 463 | $<vLong>$ = pc; code_byte(0); |
| 463 | incr_ntemp(); | 464 | incr_ntemp(); |
| 464 | code_byte(CREATEARRAY); | 465 | code_byte(CREATEARRAY); |
| 465 | } | 466 | } |
| 466 | objectname fieldlist | 467 | objectname fieldlist |
| 467 | { | 468 | { |
| 468 | basepc[$<vWord>2] = $4; | 469 | basepc[$<vLong>2] = $4; |
| 469 | if ($3 < 0) /* there is no function to be called */ | 470 | if ($3 < 0) /* there is no function to be called */ |
| 470 | { | 471 | { |
| 471 | $$ = 1; | 472 | $$ = 1; |
| @@ -725,9 +726,9 @@ int yywrap (void) | |||
| 725 | */ | 726 | */ |
| 726 | int lua_parse (void) | 727 | int lua_parse (void) |
| 727 | { | 728 | { |
| 728 | Byte *init = initcode = (Byte *) calloc(GAPCODE, sizeof(Byte)); | 729 | Byte *init = initcode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); |
| 729 | maincode = 0; | 730 | maincode = 0; |
| 730 | maxmain = GAPCODE; | 731 | maxmain = CODE_BLOCK; |
| 731 | if (init == NULL) | 732 | if (init == NULL) |
| 732 | { | 733 | { |
| 733 | lua_error("not enough memory"); | 734 | lua_error("not enough memory"); |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_opcode="$Id: opcode.c,v 1.4 1994/04/13 21:37:20 celes Exp celes $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 2.1 1994/04/20 22:07:57 celes Exp celes $"; |
| 7 | 7 | ||
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
| @@ -23,43 +23,71 @@ char *rcs_opcode="$Id: opcode.c,v 1.4 1994/04/13 21:37:20 celes Exp celes $"; | |||
| 23 | #define tonumber(o) ((tag(o) != T_NUMBER) && (lua_tonumber(o) != 0)) | 23 | #define tonumber(o) ((tag(o) != T_NUMBER) && (lua_tonumber(o) != 0)) |
| 24 | #define tostring(o) ((tag(o) != T_STRING) && (lua_tostring(o) != 0)) | 24 | #define tostring(o) ((tag(o) != T_STRING) && (lua_tostring(o) != 0)) |
| 25 | 25 | ||
| 26 | #ifndef MAXSTACK | 26 | |
| 27 | #define MAXSTACK 256 | 27 | #define STACK_BUFFER (STACKGAP+128) |
| 28 | #endif | 28 | |
| 29 | static Object stack[MAXSTACK] = {{T_MARK, {NULL}}}; | 29 | static Word maxstack; |
| 30 | static Object *top=stack+1, *base=stack+1; | 30 | static Object *stack=NULL; |
| 31 | static Object *top, *base; | ||
| 31 | 32 | ||
| 32 | 33 | ||
| 33 | /* | 34 | /* |
| 34 | ** Concatenate two given string, creating a mark space at the beginning. | 35 | ** Init stack |
| 35 | ** Return the new string pointer. | ||
| 36 | */ | 36 | */ |
| 37 | static char *lua_strconc (char *l, char *r) | 37 | static int lua_initstack (void) |
| 38 | { | 38 | { |
| 39 | char *s = calloc (strlen(l)+strlen(r)+2, sizeof(char)); | 39 | maxstack = STACK_BUFFER; |
| 40 | if (s == NULL) | 40 | stack = (Object *)calloc(maxstack, sizeof(Object)); |
| 41 | if (stack == NULL) | ||
| 41 | { | 42 | { |
| 42 | lua_error ("not enough memory"); | 43 | lua_error("stack - not enough memory"); |
| 43 | return NULL; | 44 | return 1; |
| 44 | } | 45 | } |
| 45 | *s++ = 0; /* create mark space */ | 46 | tag(stack) = T_MARK; |
| 46 | return strcat(strcpy(s,l),r); | 47 | top = base = stack+1; |
| 48 | return 0; | ||
| 47 | } | 49 | } |
| 48 | 50 | ||
| 51 | |||
| 49 | /* | 52 | /* |
| 50 | ** Duplicate a string, creating a mark space at the beginning. | 53 | ** Check stack overflow and, if necessary, realloc vector |
| 54 | */ | ||
| 55 | static int lua_checkstack (Word n) | ||
| 56 | { | ||
| 57 | if (stack == NULL) | ||
| 58 | return lua_initstack(); | ||
| 59 | if (n > maxstack) | ||
| 60 | { | ||
| 61 | Word t = top-stack; | ||
| 62 | Word b = base-stack; | ||
| 63 | maxstack *= 2; | ||
| 64 | stack = (Object *)realloc(stack, maxstack*sizeof(Object)); | ||
| 65 | if (stack == NULL) | ||
| 66 | { | ||
| 67 | lua_error("stack - not enough memory"); | ||
| 68 | return 1; | ||
| 69 | } | ||
| 70 | top = stack + t; | ||
| 71 | base = stack + b; | ||
| 72 | } | ||
| 73 | return 0; | ||
| 74 | } | ||
| 75 | |||
| 76 | |||
| 77 | /* | ||
| 78 | ** Concatenate two given string, creating a mark space at the beginning. | ||
| 51 | ** Return the new string pointer. | 79 | ** Return the new string pointer. |
| 52 | */ | 80 | */ |
| 53 | char *lua_strdup (char *l) | 81 | static char *lua_strconc (char *l, char *r) |
| 54 | { | 82 | { |
| 55 | char *s = calloc (strlen(l)+2, sizeof(char)); | 83 | static char buffer[1024]; |
| 56 | if (s == NULL) | 84 | int n = strlen(l)+strlen(r)+1; |
| 85 | if (n > 1024) | ||
| 57 | { | 86 | { |
| 58 | lua_error ("not enough memory"); | 87 | lua_error ("string too large"); |
| 59 | return NULL; | 88 | return NULL; |
| 60 | } | 89 | } |
| 61 | *s++ = 0; /* create mark space */ | 90 | return strcat(strcpy(buffer,l),r); |
| 62 | return strcpy(s,l); | ||
| 63 | } | 91 | } |
| 64 | 92 | ||
| 65 | /* | 93 | /* |
| @@ -127,7 +155,7 @@ static int lua_tostring (Object *obj) | |||
| 127 | sprintf (s, "%d", (int) nvalue(obj)); | 155 | sprintf (s, "%d", (int) nvalue(obj)); |
| 128 | else | 156 | else |
| 129 | sprintf (s, "%g", nvalue(obj)); | 157 | sprintf (s, "%g", nvalue(obj)); |
| 130 | svalue(obj) = lua_createstring(lua_strdup(s)); | 158 | svalue(obj) = lua_createstring(s); |
| 131 | if (svalue(obj) == NULL) | 159 | if (svalue(obj) == NULL) |
| 132 | return 1; | 160 | return 1; |
| 133 | tag(obj) = T_STRING; | 161 | tag(obj) = T_STRING; |
| @@ -140,7 +168,12 @@ static int lua_tostring (Object *obj) | |||
| 140 | */ | 168 | */ |
| 141 | int lua_execute (Byte *pc) | 169 | int lua_execute (Byte *pc) |
| 142 | { | 170 | { |
| 143 | Object *oldbase = base; | 171 | Word oldbase; |
| 172 | |||
| 173 | if (stack == NULL) | ||
| 174 | lua_initstack(); | ||
| 175 | |||
| 176 | oldbase = base-stack; | ||
| 144 | base = top; | 177 | base = top; |
| 145 | while (1) | 178 | while (1) |
| 146 | { | 179 | { |
| @@ -516,11 +549,8 @@ int lua_execute (Byte *pc) | |||
| 516 | nvalue(b) = (base-stack); /* store base value */ | 549 | nvalue(b) = (base-stack); /* store base value */ |
| 517 | base = b+1; | 550 | base = b+1; |
| 518 | pc = newpc; | 551 | pc = newpc; |
| 519 | if (MAXSTACK-(base-stack) < STACKGAP) | 552 | if (lua_checkstack(STACKGAP+(base-stack))) |
| 520 | { | ||
| 521 | lua_error ("stack overflow"); | ||
| 522 | return 1; | 553 | return 1; |
| 523 | } | ||
| 524 | } | 554 | } |
| 525 | else if (tag(b-1) == T_CFUNCTION) | 555 | else if (tag(b-1) == T_CFUNCTION) |
| 526 | { | 556 | { |
| @@ -569,7 +599,7 @@ int lua_execute (Byte *pc) | |||
| 569 | break; | 599 | break; |
| 570 | 600 | ||
| 571 | case HALT: | 601 | case HALT: |
| 572 | base = oldbase; | 602 | base = stack+oldbase; |
| 573 | return 0; /* success */ | 603 | return 0; /* success */ |
| 574 | 604 | ||
| 575 | case SETFUNCTION: | 605 | case SETFUNCTION: |
| @@ -726,7 +756,7 @@ Object *lua_getfield (Object *object, char *field) | |||
| 726 | { | 756 | { |
| 727 | Object ref; | 757 | Object ref; |
| 728 | tag(&ref) = T_STRING; | 758 | tag(&ref) = T_STRING; |
| 729 | svalue(&ref) = lua_createstring(lua_strdup(field)); | 759 | svalue(&ref) = lua_createstring(field); |
| 730 | return (lua_hashdefine(avalue(object), &ref)); | 760 | return (lua_hashdefine(avalue(object), &ref)); |
| 731 | } | 761 | } |
| 732 | } | 762 | } |
| @@ -774,12 +804,9 @@ Object *lua_pop (void) | |||
| 774 | */ | 804 | */ |
| 775 | int lua_pushnil (void) | 805 | int lua_pushnil (void) |
| 776 | { | 806 | { |
| 777 | if ((top-stack) >= MAXSTACK-1) | 807 | if (lua_checkstack(top-stack+1) == 1) |
| 778 | { | ||
| 779 | lua_error ("stack overflow"); | ||
| 780 | return 1; | 808 | return 1; |
| 781 | } | 809 | tag(top++) = T_NIL; |
| 782 | tag(top) = T_NIL; | ||
| 783 | return 0; | 810 | return 0; |
| 784 | } | 811 | } |
| 785 | 812 | ||
| @@ -788,11 +815,8 @@ int lua_pushnil (void) | |||
| 788 | */ | 815 | */ |
| 789 | int lua_pushnumber (real n) | 816 | int lua_pushnumber (real n) |
| 790 | { | 817 | { |
| 791 | if ((top-stack) >= MAXSTACK-1) | 818 | if (lua_checkstack(top-stack+1) == 1) |
| 792 | { | ||
| 793 | lua_error ("stack overflow"); | ||
| 794 | return 1; | 819 | return 1; |
| 795 | } | ||
| 796 | tag(top) = T_NUMBER; nvalue(top++) = n; | 820 | tag(top) = T_NUMBER; nvalue(top++) = n; |
| 797 | return 0; | 821 | return 0; |
| 798 | } | 822 | } |
| @@ -802,13 +826,10 @@ int lua_pushnumber (real n) | |||
| 802 | */ | 826 | */ |
| 803 | int lua_pushstring (char *s) | 827 | int lua_pushstring (char *s) |
| 804 | { | 828 | { |
| 805 | if ((top-stack) >= MAXSTACK-1) | 829 | if (lua_checkstack(top-stack+1) == 1) |
| 806 | { | ||
| 807 | lua_error ("stack overflow"); | ||
| 808 | return 1; | 830 | return 1; |
| 809 | } | ||
| 810 | tag(top) = T_STRING; | 831 | tag(top) = T_STRING; |
| 811 | svalue(top++) = lua_createstring(lua_strdup(s)); | 832 | svalue(top++) = lua_createstring(s); |
| 812 | return 0; | 833 | return 0; |
| 813 | } | 834 | } |
| 814 | 835 | ||
| @@ -817,11 +838,8 @@ int lua_pushstring (char *s) | |||
| 817 | */ | 838 | */ |
| 818 | int lua_pushcfunction (lua_CFunction fn) | 839 | int lua_pushcfunction (lua_CFunction fn) |
| 819 | { | 840 | { |
| 820 | if ((top-stack) >= MAXSTACK-1) | 841 | if (lua_checkstack(top-stack+1) == 1) |
| 821 | { | ||
| 822 | lua_error ("stack overflow"); | ||
| 823 | return 1; | 842 | return 1; |
| 824 | } | ||
| 825 | tag(top) = T_CFUNCTION; fvalue(top++) = fn; | 843 | tag(top) = T_CFUNCTION; fvalue(top++) = fn; |
| 826 | return 0; | 844 | return 0; |
| 827 | } | 845 | } |
| @@ -831,11 +849,8 @@ int lua_pushcfunction (lua_CFunction fn) | |||
| 831 | */ | 849 | */ |
| 832 | int lua_pushuserdata (void *u) | 850 | int lua_pushuserdata (void *u) |
| 833 | { | 851 | { |
| 834 | if ((top-stack) >= MAXSTACK-1) | 852 | if (lua_checkstack(top-stack+1) == 1) |
| 835 | { | ||
| 836 | lua_error ("stack overflow"); | ||
| 837 | return 1; | 853 | return 1; |
| 838 | } | ||
| 839 | tag(top) = T_USERDATA; uvalue(top++) = u; | 854 | tag(top) = T_USERDATA; uvalue(top++) = u; |
| 840 | return 0; | 855 | return 0; |
| 841 | } | 856 | } |
| @@ -845,11 +860,8 @@ int lua_pushuserdata (void *u) | |||
| 845 | */ | 860 | */ |
| 846 | int lua_pushobject (Object *o) | 861 | int lua_pushobject (Object *o) |
| 847 | { | 862 | { |
| 848 | if ((top-stack) >= MAXSTACK-1) | 863 | if (lua_checkstack(top-stack+1) == 1) |
| 849 | { | ||
| 850 | lua_error ("stack overflow"); | ||
| 851 | return 1; | 864 | return 1; |
| 852 | } | ||
| 853 | *top++ = *o; | 865 | *top++ = *o; |
| 854 | return 0; | 866 | return 0; |
| 855 | } | 867 | } |
| @@ -878,7 +890,7 @@ int lua_storefield (lua_Object object, char *field) | |||
| 878 | { | 890 | { |
| 879 | Object ref, *h; | 891 | Object ref, *h; |
| 880 | tag(&ref) = T_STRING; | 892 | tag(&ref) = T_STRING; |
| 881 | svalue(&ref) = lua_createstring(lua_strdup(field)); | 893 | svalue(&ref) = lua_createstring(field); |
| 882 | h = lua_hashdefine(avalue(object), &ref); | 894 | h = lua_hashdefine(avalue(object), &ref); |
| 883 | if (h == NULL) return 1; | 895 | if (h == NULL) return 1; |
| 884 | if (tag(top-1) == T_MARK) return 1; | 896 | if (tag(top-1) == T_MARK) return 1; |
| @@ -963,6 +975,9 @@ int lua_isuserdata (Object *object) | |||
| 963 | void lua_type (void) | 975 | void lua_type (void) |
| 964 | { | 976 | { |
| 965 | Object *o = lua_getparam(1); | 977 | Object *o = lua_getparam(1); |
| 978 | |||
| 979 | if (lua_constant == NULL) | ||
| 980 | lua_initconstant(); | ||
| 966 | lua_pushstring (lua_constant[tag(o)]); | 981 | lua_pushstring (lua_constant[tag(o)]); |
| 967 | } | 982 | } |
| 968 | 983 | ||
| @@ -981,7 +996,7 @@ void lua_obj2number (void) | |||
| 981 | void lua_print (void) | 996 | void lua_print (void) |
| 982 | { | 997 | { |
| 983 | int i=1; | 998 | int i=1; |
| 984 | void *obj; | 999 | Object *obj; |
| 985 | while ((obj=lua_getparam (i++)) != NULL) | 1000 | while ((obj=lua_getparam (i++)) != NULL) |
| 986 | { | 1001 | { |
| 987 | if (lua_isnumber(obj)) printf("%g\n",lua_getnumber (obj)); | 1002 | if (lua_isnumber(obj)) printf("%g\n",lua_getnumber (obj)); |
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** TeCGraf - PUC-Rio | 2 | ** TeCGraf - PUC-Rio |
| 3 | ** $Id: opcode.h,v 1.4 1994/04/13 21:37:20 celes Exp celes $ | 3 | ** $Id: opcode.h,v 2.1 1994/04/20 22:07:57 celes Exp celes $ |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #ifndef opcode_h | 6 | #ifndef opcode_h |
| @@ -20,6 +20,8 @@ typedef unsigned char Byte; | |||
| 20 | 20 | ||
| 21 | typedef unsigned short Word; | 21 | typedef unsigned short Word; |
| 22 | 22 | ||
| 23 | typedef signed long Long; | ||
| 24 | |||
| 23 | typedef union | 25 | typedef union |
| 24 | { | 26 | { |
| 25 | struct {char c1; char c2;} m; | 27 | struct {char c1; char c2;} m; |
| @@ -116,7 +118,6 @@ typedef struct Object | |||
| 116 | 118 | ||
| 117 | typedef struct | 119 | typedef struct |
| 118 | { | 120 | { |
| 119 | char *name; | ||
| 120 | Object object; | 121 | Object object; |
| 121 | } Symbol; | 122 | } Symbol; |
| 122 | 123 | ||
| @@ -130,7 +131,6 @@ typedef struct | |||
| 130 | #define uvalue(o) ((o)->value.u) | 131 | #define uvalue(o) ((o)->value.u) |
| 131 | 132 | ||
| 132 | /* Macros to access symbol table */ | 133 | /* Macros to access symbol table */ |
| 133 | #define s_name(i) (lua_table[i].name) | ||
| 134 | #define s_object(i) (lua_table[i].object) | 134 | #define s_object(i) (lua_table[i].object) |
| 135 | #define s_tag(i) (tag(&s_object(i))) | 135 | #define s_tag(i) (tag(&s_object(i))) |
| 136 | #define s_nvalue(i) (nvalue(&s_object(i))) | 136 | #define s_nvalue(i) (nvalue(&s_object(i))) |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** Module to control static tables | 3 | ** Module to control static tables |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_table="$Id: table.c,v 1.5 1994/04/13 22:10:21 celes Exp celes $"; | 6 | char *rcs_table="$Id: table.c,v 2.1 1994/04/20 22:07:57 celes Exp celes $"; |
| 7 | 7 | ||
| 8 | #include <stdlib.h> | 8 | #include <stdlib.h> |
| 9 | #include <string.h> | 9 | #include <string.h> |
| @@ -11,6 +11,7 @@ char *rcs_table="$Id: table.c,v 1.5 1994/04/13 22:10:21 celes Exp celes $"; | |||
| 11 | #include "mm.h" | 11 | #include "mm.h" |
| 12 | 12 | ||
| 13 | #include "opcode.h" | 13 | #include "opcode.h" |
| 14 | #include "tree.h" | ||
| 14 | #include "hash.h" | 15 | #include "hash.h" |
| 15 | #include "inout.h" | 16 | #include "inout.h" |
| 16 | #include "table.h" | 17 | #include "table.h" |
| @@ -18,144 +19,159 @@ char *rcs_table="$Id: table.c,v 1.5 1994/04/13 22:10:21 celes Exp celes $"; | |||
| 18 | 19 | ||
| 19 | #define streq(s1,s2) (s1[0]==s2[0]&&strcmp(s1+1,s2+1)==0) | 20 | #define streq(s1,s2) (s1[0]==s2[0]&&strcmp(s1+1,s2+1)==0) |
| 20 | 21 | ||
| 21 | #ifndef MAXSYMBOL | 22 | #define BUFFER_BLOCK 256 |
| 22 | #define MAXSYMBOL 512 | 23 | |
| 23 | #endif | 24 | Symbol *lua_table; |
| 24 | static Symbol tablebuffer[MAXSYMBOL] = { | 25 | static Word lua_ntable = 0; |
| 25 | {"type",{T_CFUNCTION,{lua_type}}}, | 26 | static Word lua_maxsymbol = 0; |
| 26 | {"tonumber",{T_CFUNCTION,{lua_obj2number}}}, | 27 | |
| 27 | {"next",{T_CFUNCTION,{lua_next}}}, | 28 | char **lua_constant; |
| 28 | {"nextvar",{T_CFUNCTION,{lua_nextvar}}}, | 29 | static Word lua_nconstant = 0; |
| 29 | {"print",{T_CFUNCTION,{lua_print}}}, | 30 | static Word lua_maxconstant = 0; |
| 30 | {"dofile",{T_CFUNCTION,{lua_internaldofile}}}, | 31 | |
| 31 | {"dostring",{T_CFUNCTION,{lua_internaldostring}}} | 32 | |
| 32 | }; | ||
| 33 | Symbol *lua_table=tablebuffer; | ||
| 34 | Word lua_ntable=7; | ||
| 35 | |||
| 36 | struct List | ||
| 37 | { | ||
| 38 | Symbol *s; | ||
| 39 | struct List *next; | ||
| 40 | }; | ||
| 41 | |||
| 42 | static struct List o6={ tablebuffer+6, 0}; | ||
| 43 | static struct List o5={ tablebuffer+5, &o6 }; | ||
| 44 | static struct List o4={ tablebuffer+4, &o5 }; | ||
| 45 | static struct List o3={ tablebuffer+3, &o4 }; | ||
| 46 | static struct List o2={ tablebuffer+2, &o3 }; | ||
| 47 | static struct List o1={ tablebuffer+1, &o2 }; | ||
| 48 | static struct List o0={ tablebuffer+0, &o1 }; | ||
| 49 | static struct List *searchlist=&o0; | ||
| 50 | |||
| 51 | #ifndef MAXCONSTANT | ||
| 52 | #define MAXCONSTANT 256 | ||
| 53 | #endif | ||
| 54 | /* pre-defined constants need garbage collection extra byte */ | ||
| 55 | static char tm[] = " mark"; | ||
| 56 | static char ti[] = " nil"; | ||
| 57 | static char tn[] = " number"; | ||
| 58 | static char ts[] = " string"; | ||
| 59 | static char tt[] = " table"; | ||
| 60 | static char tf[] = " function"; | ||
| 61 | static char tc[] = " cfunction"; | ||
| 62 | static char tu[] = " userdata"; | ||
| 63 | static char *constantbuffer[MAXCONSTANT] = {tm+1, ti+1, | ||
| 64 | tn+1, ts+1, | ||
| 65 | tt+1, tf+1, | ||
| 66 | tc+1, tu+1 | ||
| 67 | }; | ||
| 68 | char **lua_constant = constantbuffer; | ||
| 69 | Word lua_nconstant=T_USERDATA+1; | ||
| 70 | |||
| 71 | #ifndef MAXSTRING | ||
| 72 | #define MAXSTRING 512 | ||
| 73 | #endif | ||
| 74 | static char *stringbuffer[MAXSTRING]; | ||
| 75 | char **lua_string = stringbuffer; | ||
| 76 | Word lua_nstring=0; | ||
| 77 | 33 | ||
| 78 | #define MAXFILE 20 | 34 | #define MAXFILE 20 |
| 79 | char *lua_file[MAXFILE]; | 35 | char *lua_file[MAXFILE]; |
| 80 | int lua_nfile; | 36 | int lua_nfile; |
| 81 | 37 | ||
| 38 | /* Variables to controll garbage collection */ | ||
| 39 | #define GARBAGE_BLOCK 256 | ||
| 40 | Word lua_block=GARBAGE_BLOCK; /* when garbage collector will be called */ | ||
| 41 | Word lua_nentity; /* counter of new entities (strings and arrays) */ | ||
| 82 | 42 | ||
| 83 | #define markstring(s) (*((s)-1)) | ||
| 84 | 43 | ||
| 44 | /* | ||
| 45 | ** Initialise symbol table with internal functions | ||
| 46 | */ | ||
| 47 | static void lua_initsymbol (void) | ||
| 48 | { | ||
| 49 | int n; | ||
| 50 | lua_maxsymbol = BUFFER_BLOCK; | ||
| 51 | lua_table = (Symbol *) calloc(lua_maxsymbol, sizeof(Symbol)); | ||
| 52 | if (lua_table == NULL) | ||
| 53 | { | ||
| 54 | lua_error ("symbol table: not enough memory"); | ||
| 55 | return; | ||
| 56 | } | ||
| 57 | n = lua_findsymbol("type"); | ||
| 58 | s_tag(n) = T_CFUNCTION; s_fvalue(n) = lua_type; | ||
| 59 | n = lua_findsymbol("tonumber"); | ||
| 60 | s_tag(n) = T_CFUNCTION; s_fvalue(n) = lua_obj2number; | ||
| 61 | n = lua_findsymbol("next"); | ||
| 62 | s_tag(n) = T_CFUNCTION; s_fvalue(n) = lua_next; | ||
| 63 | n = lua_findsymbol("nextvar"); | ||
| 64 | s_tag(n) = T_CFUNCTION; s_fvalue(n) = lua_nextvar; | ||
| 65 | n = lua_findsymbol("print"); | ||
| 66 | s_tag(n) = T_CFUNCTION; s_fvalue(n) = lua_print; | ||
| 67 | n = lua_findsymbol("dofile"); | ||
| 68 | s_tag(n) = T_CFUNCTION; s_fvalue(n) = lua_internaldofile; | ||
| 69 | n = lua_findsymbol("dostring"); | ||
| 70 | s_tag(n) = T_CFUNCTION; s_fvalue(n) = lua_internaldostring; | ||
| 71 | } | ||
| 85 | 72 | ||
| 86 | /* Variables to controll garbage collection */ | ||
| 87 | Word lua_block=10; /* to check when garbage collector will be called */ | ||
| 88 | Word lua_nentity; /* counter of new entities (strings and arrays) */ | ||
| 89 | 73 | ||
| 74 | /* | ||
| 75 | ** Initialise constant table with pre-defined constants | ||
| 76 | */ | ||
| 77 | void lua_initconstant (void) | ||
| 78 | { | ||
| 79 | lua_maxconstant = BUFFER_BLOCK; | ||
| 80 | lua_constant = (char **) calloc(lua_maxconstant, sizeof(char *)); | ||
| 81 | if (lua_constant == NULL) | ||
| 82 | { | ||
| 83 | lua_error ("constant table: not enough memory"); | ||
| 84 | return; | ||
| 85 | } | ||
| 86 | lua_findconstant("mark"); | ||
| 87 | lua_findconstant("nil"); | ||
| 88 | lua_findconstant("number"); | ||
| 89 | lua_findconstant("string"); | ||
| 90 | lua_findconstant("table"); | ||
| 91 | lua_findconstant("function"); | ||
| 92 | lua_findconstant("cfunction"); | ||
| 93 | lua_findconstant("userdata"); | ||
| 94 | } | ||
| 90 | 95 | ||
| 91 | /* | 96 | /* |
| 92 | ** Given a name, search it at symbol table and return its index. If not | 97 | ** Given a name, search it at symbol table and return its index. If not |
| 93 | ** found, allocate at end of table, checking oveflow and return its index. | 98 | ** found, allocate it. |
| 94 | ** On error, return -1. | 99 | ** On error, return -1. |
| 95 | */ | 100 | */ |
| 96 | int lua_findsymbol (char *s) | 101 | int lua_findsymbol (char *s) |
| 97 | { | 102 | { |
| 98 | struct List *l, *p; | 103 | char *n; |
| 99 | for (p=NULL, l=searchlist; l!=NULL; p=l, l=l->next) | 104 | if (lua_table == NULL) |
| 100 | if (streq(s,l->s->name)) | 105 | lua_initsymbol(); |
| 101 | { | 106 | n = lua_varcreate(s); |
| 102 | if (p!=NULL) | 107 | if (n == NULL) |
| 103 | { | ||
| 104 | p->next = l->next; | ||
| 105 | l->next = searchlist; | ||
| 106 | searchlist = l; | ||
| 107 | } | ||
| 108 | return (l->s-lua_table); | ||
| 109 | } | ||
| 110 | |||
| 111 | if (lua_ntable >= MAXSYMBOL-1) | ||
| 112 | { | 108 | { |
| 113 | lua_error ("symbol table overflow"); | 109 | lua_error ("create symbol: not enough memory"); |
| 114 | return -1; | 110 | return -1; |
| 115 | } | 111 | } |
| 116 | s_name(lua_ntable) = strdup(s); | 112 | if (indexstring(n) == UNMARKED_STRING) |
| 117 | if (s_name(lua_ntable) == NULL) | ||
| 118 | { | 113 | { |
| 119 | lua_error ("not enough memory"); | 114 | if (lua_ntable == lua_maxsymbol) |
| 120 | return -1; | 115 | { |
| 116 | lua_maxsymbol *= 2; | ||
| 117 | if (lua_maxsymbol > MAX_WORD) | ||
| 118 | { | ||
| 119 | lua_error("symbol table overflow"); | ||
| 120 | return -1; | ||
| 121 | } | ||
| 122 | lua_table = (Symbol *)realloc(lua_table, lua_maxsymbol*sizeof(Symbol)); | ||
| 123 | if (lua_table == NULL) | ||
| 124 | { | ||
| 125 | lua_error ("symbol table: not enough memory"); | ||
| 126 | return -1; | ||
| 127 | } | ||
| 128 | } | ||
| 129 | indexstring(n) = lua_ntable; | ||
| 130 | s_tag(lua_ntable) = T_NIL; | ||
| 131 | lua_ntable++; | ||
| 121 | } | 132 | } |
| 122 | s_tag(lua_ntable) = T_NIL; | 133 | return indexstring(n); |
| 123 | p = malloc(sizeof(*p)); | ||
| 124 | p->s = lua_table+lua_ntable; | ||
| 125 | p->next = searchlist; | ||
| 126 | searchlist = p; | ||
| 127 | |||
| 128 | return lua_ntable++; | ||
| 129 | } | 134 | } |
| 130 | 135 | ||
| 136 | |||
| 131 | /* | 137 | /* |
| 132 | ** Given a constant string, search it at constant table and return its index. | 138 | ** Given a name, search it at constant table and return its index. If not |
| 133 | ** If not found, allocate at end of the table, checking oveflow and return | 139 | ** found, allocate it. |
| 134 | ** its index. | 140 | ** On error, return -1. |
| 135 | ** | ||
| 136 | ** For each allocation, the function allocate a extra char to be used to | ||
| 137 | ** mark used string (it's necessary to deal with constant and string | ||
| 138 | ** uniformily). The function store at the table the second position allocated, | ||
| 139 | ** that represents the beginning of the real string. On error, return -1. | ||
| 140 | ** | ||
| 141 | */ | 141 | */ |
| 142 | int lua_findconstant (char *s) | 142 | int lua_findconstant (char *s) |
| 143 | { | 143 | { |
| 144 | int i; | 144 | char *n; |
| 145 | for (i=0; i<lua_nconstant; i++) | 145 | if (lua_constant == NULL) |
| 146 | if (streq(s,lua_constant[i])) | 146 | lua_initconstant(); |
| 147 | return i; | 147 | n = lua_constcreate(s); |
| 148 | if (lua_nconstant >= MAXCONSTANT-1) | 148 | if (n == NULL) |
| 149 | { | 149 | { |
| 150 | lua_error ("lua: constant string table overflow"); | 150 | lua_error ("create constant: not enough memory"); |
| 151 | return -1; | 151 | return -1; |
| 152 | } | 152 | } |
| 153 | if (indexstring(n) == UNMARKED_STRING) | ||
| 153 | { | 154 | { |
| 154 | char *c = calloc(strlen(s)+2,sizeof(char)); | 155 | if (lua_nconstant == lua_maxconstant) |
| 155 | c++; /* create mark space */ | 156 | { |
| 156 | lua_constant[lua_nconstant++] = strcpy(c,s); | 157 | lua_maxconstant *= 2; |
| 158 | if (lua_maxconstant > MAX_WORD) | ||
| 159 | { | ||
| 160 | lua_error("constant table overflow"); | ||
| 161 | return -1; | ||
| 162 | } | ||
| 163 | lua_constant = (char**)realloc(lua_constant,lua_maxconstant*sizeof(char*)); | ||
| 164 | if (lua_constant == NULL) | ||
| 165 | { | ||
| 166 | lua_error ("constant table: not enough memory"); | ||
| 167 | return -1; | ||
| 168 | } | ||
| 169 | } | ||
| 170 | indexstring(n) = lua_nconstant; | ||
| 171 | lua_constant[lua_nconstant] = n; | ||
| 172 | lua_nconstant++; | ||
| 157 | } | 173 | } |
| 158 | return (lua_nconstant-1); | 174 | return indexstring(n); |
| 159 | } | 175 | } |
| 160 | 176 | ||
| 161 | 177 | ||
| @@ -175,10 +191,10 @@ void lua_travsymbol (void (*fn)(Object *)) | |||
| 175 | */ | 191 | */ |
| 176 | void lua_markobject (Object *o) | 192 | void lua_markobject (Object *o) |
| 177 | { | 193 | { |
| 178 | if (tag(o) == T_STRING) | 194 | if (tag(o) == T_STRING && indexstring(svalue(o)) == UNMARKED_STRING) |
| 179 | markstring (svalue(o)) = 1; | 195 | indexstring(svalue(o)) = MARKED_STRING; |
| 180 | else if (tag(o) == T_ARRAY) | 196 | else if (tag(o) == T_ARRAY) |
| 181 | lua_hashmark (avalue(o)); | 197 | lua_hashmark (avalue(o)); |
| 182 | } | 198 | } |
| 183 | 199 | ||
| 184 | 200 | ||
| @@ -194,63 +210,27 @@ void lua_pack (void) | |||
| 194 | /* mark symbol table strings */ | 210 | /* mark symbol table strings */ |
| 195 | lua_travsymbol(lua_markobject); | 211 | lua_travsymbol(lua_markobject); |
| 196 | 212 | ||
| 197 | lua_stringcollector(); | 213 | lua_strcollector(); |
| 198 | lua_hashcollector(); | 214 | lua_hashcollector(); |
| 199 | 215 | ||
| 200 | lua_nentity = 0; /* reset counter */ | 216 | lua_nentity = 0; /* reset counter */ |
| 201 | } | 217 | } |
| 202 | 218 | ||
| 203 | /* | ||
| 204 | ** Garbage collection to atrings. | ||
| 205 | ** Delete all unmarked strings | ||
| 206 | */ | ||
| 207 | void lua_stringcollector (void) | ||
| 208 | { | ||
| 209 | int i, j; | ||
| 210 | for (i=j=0; i<lua_nstring; i++) | ||
| 211 | if (markstring(lua_string[i]) == 1) | ||
| 212 | { | ||
| 213 | lua_string[j++] = lua_string[i]; | ||
| 214 | markstring(lua_string[i]) = 0; | ||
| 215 | } | ||
| 216 | else | ||
| 217 | { | ||
| 218 | free (lua_string[i]-1); | ||
| 219 | } | ||
| 220 | lua_nstring = j; | ||
| 221 | } | ||
| 222 | 219 | ||
| 223 | /* | 220 | /* |
| 224 | ** Allocate a new string at string table. The given string is already | 221 | ** If the string isn't allocated, allocate a new string at string tree. |
| 225 | ** allocated with mark space and the function puts it at the end of the | ||
| 226 | ** table, checking overflow, and returns its own pointer, or NULL on error. | ||
| 227 | */ | 222 | */ |
| 228 | char *lua_createstring (char *s) | 223 | char *lua_createstring (char *s) |
| 229 | { | 224 | { |
| 230 | int i; | ||
| 231 | if (s == NULL) return NULL; | 225 | if (s == NULL) return NULL; |
| 232 | 226 | ||
| 233 | for (i=0; i<lua_nstring; i++) | 227 | if (lua_nentity == lua_block) |
| 234 | if (streq(s,lua_string[i])) | ||
| 235 | { | ||
| 236 | free(s-1); | ||
| 237 | return lua_string[i]; | ||
| 238 | } | ||
| 239 | |||
| 240 | if (lua_nentity == lua_block || lua_nstring >= MAXSTRING-1) | ||
| 241 | { | ||
| 242 | lua_pack (); | 228 | lua_pack (); |
| 243 | if (lua_nstring >= MAXSTRING-1) | ||
| 244 | { | ||
| 245 | lua_error ("string table overflow"); | ||
| 246 | return NULL; | ||
| 247 | } | ||
| 248 | } | ||
| 249 | lua_string[lua_nstring++] = s; | ||
| 250 | lua_nentity++; | 229 | lua_nentity++; |
| 251 | return s; | 230 | return lua_strcreate(s); |
| 252 | } | 231 | } |
| 253 | 232 | ||
| 233 | |||
| 254 | /* | 234 | /* |
| 255 | ** Add a file name at file table, checking overflow. This function also set | 235 | ** Add a file name at file table, checking overflow. This function also set |
| 256 | ** the external variable "lua_filename" with the function filename set. | 236 | ** the external variable "lua_filename" with the function filename set. |
| @@ -293,7 +273,7 @@ char *lua_filename (void) | |||
| 293 | */ | 273 | */ |
| 294 | void lua_nextvar (void) | 274 | void lua_nextvar (void) |
| 295 | { | 275 | { |
| 296 | int index; | 276 | char *varname, *next; |
| 297 | Object *o = lua_getparam (1); | 277 | Object *o = lua_getparam (1); |
| 298 | if (o == NULL) | 278 | if (o == NULL) |
| 299 | { lua_error ("too few arguments to function `nextvar'"); return; } | 279 | { lua_error ("too few arguments to function `nextvar'"); return; } |
| @@ -301,7 +281,7 @@ void lua_nextvar (void) | |||
| 301 | { lua_error ("too many arguments to function `nextvar'"); return; } | 281 | { lua_error ("too many arguments to function `nextvar'"); return; } |
| 302 | if (tag(o) == T_NIL) | 282 | if (tag(o) == T_NIL) |
| 303 | { | 283 | { |
| 304 | index = 0; | 284 | varname = 0; |
| 305 | } | 285 | } |
| 306 | else if (tag(o) != T_STRING) | 286 | else if (tag(o) != T_STRING) |
| 307 | { | 287 | { |
| @@ -310,28 +290,20 @@ void lua_nextvar (void) | |||
| 310 | } | 290 | } |
| 311 | else | 291 | else |
| 312 | { | 292 | { |
| 313 | for (index=0; index<lua_ntable; index++) | 293 | varname = svalue(o); |
| 314 | if (streq(s_name(index),svalue(o))) break; | 294 | } |
| 315 | if (index == lua_ntable) | 295 | next = lua_varnext(varname); |
| 316 | { | 296 | if (next == NULL) |
| 317 | lua_error ("name not found in function `nextvar'"); | 297 | { |
| 318 | return; | 298 | lua_pushnil(); |
| 319 | } | 299 | lua_pushnil(); |
| 320 | index++; | ||
| 321 | while (index < lua_ntable && tag(&s_object(index)) == T_NIL) index++; | ||
| 322 | |||
| 323 | if (index == lua_ntable) | ||
| 324 | { | ||
| 325 | lua_pushnil(); | ||
| 326 | lua_pushnil(); | ||
| 327 | return; | ||
| 328 | } | ||
| 329 | } | 300 | } |
| 301 | else | ||
| 330 | { | 302 | { |
| 331 | Object name; | 303 | Object name; |
| 332 | tag(&name) = T_STRING; | 304 | tag(&name) = T_STRING; |
| 333 | svalue(&name) = lua_createstring(lua_strdup(s_name(index))); | 305 | svalue(&name) = next; |
| 334 | if (lua_pushobject (&name)) return; | 306 | if (lua_pushobject (&name)) return; |
| 335 | if (lua_pushobject (&s_object(index))) return; | 307 | if (lua_pushobject (&s_object(indexstring(next)))) return; |
| 336 | } | 308 | } |
| 337 | } | 309 | } |
| @@ -1,23 +1,14 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** Module to control static tables | 2 | ** Module to control static tables |
| 3 | ** TeCGraf - PUC-Rio | 3 | ** TeCGraf - PUC-Rio |
| 4 | ** $Id: table.h,v 1.2 1993/12/22 21:15:16 roberto Exp celes $ | 4 | ** $Id: table.h,v 2.1 1994/04/20 22:07:57 celes Exp celes $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #ifndef table_h | 7 | #ifndef table_h |
| 8 | #define table_h | 8 | #define table_h |
| 9 | 9 | ||
| 10 | extern Symbol *lua_table; | 10 | extern Symbol *lua_table; |
| 11 | extern Word lua_ntable; | ||
| 12 | |||
| 13 | extern char **lua_constant; | 11 | extern char **lua_constant; |
| 14 | extern Word lua_nconstant; | ||
| 15 | |||
| 16 | extern char **lua_string; | ||
| 17 | extern Word lua_nstring; | ||
| 18 | |||
| 19 | extern Hash **lua_array; | ||
| 20 | extern Word lua_narray; | ||
| 21 | 12 | ||
| 22 | extern char *lua_file[]; | 13 | extern char *lua_file[]; |
| 23 | extern int lua_nfile; | 14 | extern int lua_nfile; |
| @@ -26,13 +17,12 @@ extern Word lua_block; | |||
| 26 | extern Word lua_nentity; | 17 | extern Word lua_nentity; |
| 27 | 18 | ||
| 28 | 19 | ||
| 29 | 20 | void lua_initconstant (void); | |
| 30 | int lua_findsymbol (char *s); | 21 | int lua_findsymbol (char *s); |
| 31 | int lua_findconstant (char *s); | 22 | int lua_findconstant (char *s); |
| 32 | void lua_travsymbol (void (*fn)(Object *)); | 23 | void lua_travsymbol (void (*fn)(Object *)); |
| 33 | void lua_markobject (Object *o); | 24 | void lua_markobject (Object *o); |
| 34 | void lua_pack (void); | 25 | void lua_pack (void); |
| 35 | void lua_stringcollector (void); | ||
| 36 | char *lua_createstring (char *s); | 26 | char *lua_createstring (char *s); |
| 37 | int lua_addfile (char *fn); | 27 | int lua_addfile (char *fn); |
| 38 | int lua_delfile (void); | 28 | int lua_delfile (void); |
