diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-23 12:32:00 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-23 12:32:00 -0200 |
| commit | d490555ec9d5efb886211f735694d4e7dd0c166d (patch) | |
| tree | f9b75cdc3a6d4132dddc884280ae218a7f9beb5c | |
| parent | ad0ec203f60df5e2f8a3b294c9e8c1014280b8f1 (diff) | |
| download | lua-d490555ec9d5efb886211f735694d4e7dd0c166d.tar.gz lua-d490555ec9d5efb886211f735694d4e7dd0c166d.tar.bz2 lua-d490555ec9d5efb886211f735694d4e7dd0c166d.zip | |
garbage collection tag for strings organized in struct TaggedString
| -rw-r--r-- | inout.c | 4 | ||||
| -rw-r--r-- | opcode.c | 14 | ||||
| -rw-r--r-- | opcode.h | 8 | ||||
| -rw-r--r-- | table.c | 24 | ||||
| -rw-r--r-- | table.h | 5 | ||||
| -rw-r--r-- | tree.c | 31 | ||||
| -rw-r--r-- | tree.h | 23 |
7 files changed, 56 insertions, 53 deletions
| @@ -5,7 +5,7 @@ | |||
| 5 | ** Also provides some predefined lua functions. | 5 | ** Also provides some predefined lua functions. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | char *rcs_inout="$Id: inout.c,v 2.11 1994/11/14 21:40:14 roberto Exp roberto $"; | 8 | char *rcs_inout="$Id: inout.c,v 2.12 1994/11/21 21:41:09 roberto Exp $"; |
| 9 | 9 | ||
| 10 | #include <stdio.h> | 10 | #include <stdio.h> |
| 11 | #include <stdlib.h> | 11 | #include <stdlib.h> |
| @@ -166,7 +166,7 @@ void lua_reportbug (char *s) | |||
| 166 | { | 166 | { |
| 167 | sprintf (strchr(msg,0), | 167 | sprintf (strchr(msg,0), |
| 168 | "\t-> function \"%s\" at file \"%s\":%d\n", | 168 | "\t-> function \"%s\" at file \"%s\":%d\n", |
| 169 | lua_constant[func->function], func->file, line); | 169 | lua_constant[func->function]->str, func->file, line); |
| 170 | line = func->line; | 170 | line = func->line; |
| 171 | func = func->next; | 171 | func = func->next; |
| 172 | lua_popfunction(); | 172 | lua_popfunction(); |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_opcode="$Id: opcode.c,v 3.20 1994/11/21 18:22:58 roberto Exp roberto $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 3.21 1994/11/22 16:02:53 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <setjmp.h> | 8 | #include <setjmp.h> |
| 9 | #include <stdio.h> | 9 | #include <stdio.h> |
| @@ -165,8 +165,8 @@ static int lua_tostring (Object *obj) | |||
| 165 | sprintf (s, "%d", (int) nvalue(obj)); | 165 | sprintf (s, "%d", (int) nvalue(obj)); |
| 166 | else | 166 | else |
| 167 | sprintf (s, "%g", nvalue(obj)); | 167 | sprintf (s, "%g", nvalue(obj)); |
| 168 | svalue(obj) = lua_createstring(s); | 168 | tsvalue(obj) = lua_createstring(s); |
| 169 | if (svalue(obj) == NULL) | 169 | if (tsvalue(obj) == NULL) |
| 170 | return 1; | 170 | return 1; |
| 171 | tag(obj) = LUA_T_STRING; | 171 | tag(obj) = LUA_T_STRING; |
| 172 | return 0; | 172 | return 0; |
| @@ -637,7 +637,7 @@ int lua_pushnumber (real n) | |||
| 637 | int lua_pushstring (char *s) | 637 | int lua_pushstring (char *s) |
| 638 | { | 638 | { |
| 639 | lua_checkstack(top-stack+1); | 639 | lua_checkstack(top-stack+1); |
| 640 | svalue(top) = lua_createstring(s); | 640 | tsvalue(top) = lua_createstring(s); |
| 641 | tag(top) = LUA_T_STRING; | 641 | tag(top) = LUA_T_STRING; |
| 642 | top++; | 642 | top++; |
| 643 | return 0; | 643 | return 0; |
| @@ -770,7 +770,7 @@ static int lua_execute (Byte *pc, int base) | |||
| 770 | { | 770 | { |
| 771 | CodeWord code; | 771 | CodeWord code; |
| 772 | get_word(code,pc); | 772 | get_word(code,pc); |
| 773 | tag(top) = LUA_T_STRING; svalue(top++) = lua_constant[code.w]; | 773 | tag(top) = LUA_T_STRING; tsvalue(top++) = lua_constant[code.w]; |
| 774 | } | 774 | } |
| 775 | break; | 775 | break; |
| 776 | 776 | ||
| @@ -877,7 +877,7 @@ static int lua_execute (Byte *pc, int base) | |||
| 877 | { | 877 | { |
| 878 | CodeWord code; | 878 | CodeWord code; |
| 879 | get_word(code,pc); | 879 | get_word(code,pc); |
| 880 | tag(top) = LUA_T_STRING; svalue(top) = lua_constant[code.w]; | 880 | tag(top) = LUA_T_STRING; tsvalue(top) = lua_constant[code.w]; |
| 881 | *(lua_hashdefine (avalue(arr), top)) = *(top-1); | 881 | *(lua_hashdefine (avalue(arr), top)) = *(top-1); |
| 882 | top--; | 882 | top--; |
| 883 | n--; | 883 | n--; |
| @@ -996,7 +996,7 @@ static int lua_execute (Byte *pc, int base) | |||
| 996 | do_call(&luaI_fallBacks[FB_CONCAT].function, (top-stack)-2, 1, (top-stack)-2); | 996 | do_call(&luaI_fallBacks[FB_CONCAT].function, (top-stack)-2, 1, (top-stack)-2); |
| 997 | else | 997 | else |
| 998 | { | 998 | { |
| 999 | svalue(l) = lua_createstring (lua_strconc(svalue(l),svalue(r))); | 999 | tsvalue(l) = lua_createstring (lua_strconc(svalue(l),svalue(r))); |
| 1000 | --top; | 1000 | --top; |
| 1001 | } | 1001 | } |
| 1002 | } | 1002 | } |
| @@ -1,12 +1,13 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** TeCGraf - PUC-Rio | 2 | ** TeCGraf - PUC-Rio |
| 3 | ** $Id: opcode.h,v 3.7 1994/11/10 17:11:52 roberto Exp roberto $ | 3 | ** $Id: opcode.h,v 3.8 1994/11/10 17:36:54 roberto Exp roberto $ |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | #ifndef opcode_h | 6 | #ifndef opcode_h |
| 7 | #define opcode_h | 7 | #define opcode_h |
| 8 | 8 | ||
| 9 | #include "lua.h" | 9 | #include "lua.h" |
| 10 | #include "tree.h" | ||
| 10 | 11 | ||
| 11 | #ifndef STACKGAP | 12 | #ifndef STACKGAP |
| 12 | #define STACKGAP 128 | 13 | #define STACKGAP 128 |
| @@ -109,7 +110,7 @@ typedef union | |||
| 109 | { | 110 | { |
| 110 | Cfunction f; | 111 | Cfunction f; |
| 111 | real n; | 112 | real n; |
| 112 | char *s; | 113 | TaggedString *ts; |
| 113 | Byte *b; | 114 | Byte *b; |
| 114 | struct Hash *a; | 115 | struct Hash *a; |
| 115 | void *u; | 116 | void *u; |
| @@ -129,7 +130,8 @@ typedef struct | |||
| 129 | /* Macros to access structure members */ | 130 | /* Macros to access structure members */ |
| 130 | #define tag(o) ((o)->tag) | 131 | #define tag(o) ((o)->tag) |
| 131 | #define nvalue(o) ((o)->value.n) | 132 | #define nvalue(o) ((o)->value.n) |
| 132 | #define svalue(o) ((o)->value.s) | 133 | #define svalue(o) ((o)->value.ts->str) |
| 134 | #define tsvalue(o) ((o)->value.ts) | ||
| 133 | #define bvalue(o) ((o)->value.b) | 135 | #define bvalue(o) ((o)->value.b) |
| 134 | #define avalue(o) ((o)->value.a) | 136 | #define avalue(o) ((o)->value.a) |
| 135 | #define fvalue(o) ((o)->value.f) | 137 | #define fvalue(o) ((o)->value.f) |
| @@ -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 2.21 1994/11/18 19:27:38 roberto Exp roberto $"; | 6 | char *rcs_table="$Id: table.c,v 2.22 1994/11/21 21:41:09 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <string.h> | 8 | #include <string.h> |
| 9 | 9 | ||
| @@ -17,13 +17,15 @@ char *rcs_table="$Id: table.c,v 2.21 1994/11/18 19:27:38 roberto Exp roberto $"; | |||
| 17 | #include "fallback.h" | 17 | #include "fallback.h" |
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | #define MAX_WORD 0xFFFD | ||
| 21 | |||
| 20 | #define BUFFER_BLOCK 256 | 22 | #define BUFFER_BLOCK 256 |
| 21 | 23 | ||
| 22 | Symbol *lua_table; | 24 | Symbol *lua_table; |
| 23 | static Word lua_ntable = 0; | 25 | static Word lua_ntable = 0; |
| 24 | static Long lua_maxsymbol = 0; | 26 | static Long lua_maxsymbol = 0; |
| 25 | 27 | ||
| 26 | char **lua_constant; | 28 | TaggedString **lua_constant; |
| 27 | static Word lua_nconstant = 0; | 29 | static Word lua_nconstant = 0; |
| 28 | static Long lua_maxconstant = 0; | 30 | static Long lua_maxconstant = 0; |
| 29 | 31 | ||
| @@ -79,7 +81,7 @@ static void lua_initsymbol (void) | |||
| 79 | void lua_initconstant (void) | 81 | void lua_initconstant (void) |
| 80 | { | 82 | { |
| 81 | lua_maxconstant = BUFFER_BLOCK; | 83 | lua_maxconstant = BUFFER_BLOCK; |
| 82 | lua_constant = newvector(lua_maxconstant, char *); | 84 | lua_constant = newvector(lua_maxconstant, TaggedString *); |
| 83 | } | 85 | } |
| 84 | 86 | ||
| 85 | 87 | ||
| @@ -92,7 +94,7 @@ int luaI_findsymbol (TreeNode *t) | |||
| 92 | { | 94 | { |
| 93 | if (lua_table == NULL) | 95 | if (lua_table == NULL) |
| 94 | lua_initsymbol(); | 96 | lua_initsymbol(); |
| 95 | if (t->varindex == UNMARKED_STRING) | 97 | if (t->varindex == NOT_USED) |
| 96 | { | 98 | { |
| 97 | if (lua_ntable == lua_maxsymbol) | 99 | if (lua_ntable == lua_maxsymbol) |
| 98 | { | 100 | { |
| @@ -124,17 +126,17 @@ int luaI_findconstant (TreeNode *t) | |||
| 124 | { | 126 | { |
| 125 | if (lua_constant == NULL) | 127 | if (lua_constant == NULL) |
| 126 | lua_initconstant(); | 128 | lua_initconstant(); |
| 127 | if (t->constindex == UNMARKED_STRING) | 129 | if (t->constindex == NOT_USED) |
| 128 | { | 130 | { |
| 129 | if (lua_nconstant == lua_maxconstant) | 131 | if (lua_nconstant == lua_maxconstant) |
| 130 | { | 132 | { |
| 131 | lua_maxconstant *= 2; | 133 | lua_maxconstant *= 2; |
| 132 | if (lua_maxconstant > MAX_WORD) | 134 | if (lua_maxconstant > MAX_WORD) |
| 133 | lua_error("constant table overflow"); | 135 | lua_error("constant table overflow"); |
| 134 | lua_constant = growvector(lua_constant, lua_maxconstant, char*); | 136 | lua_constant = growvector(lua_constant, lua_maxconstant, TaggedString *); |
| 135 | } | 137 | } |
| 136 | t->constindex = lua_nconstant; | 138 | t->constindex = lua_nconstant; |
| 137 | lua_constant[lua_nconstant] = t->str; | 139 | lua_constant[lua_nconstant] = &(t->ts); |
| 138 | lua_nconstant++; | 140 | lua_nconstant++; |
| 139 | } | 141 | } |
| 140 | return t->constindex; | 142 | return t->constindex; |
| @@ -157,10 +159,10 @@ void lua_travsymbol (void (*fn)(Object *)) | |||
| 157 | */ | 159 | */ |
| 158 | void lua_markobject (Object *o) | 160 | void lua_markobject (Object *o) |
| 159 | { | 161 | { |
| 160 | if (tag(o) == LUA_T_STRING && indexstring(svalue(o)) == UNMARKED_STRING) | 162 | if (tag(o) == LUA_T_STRING && !tsvalue(o)->marked) |
| 161 | indexstring(svalue(o)) = MARKED_STRING; | 163 | tsvalue(o)->marked = 1; |
| 162 | else if (tag(o) == LUA_T_ARRAY) | 164 | else if (tag(o) == LUA_T_ARRAY) |
| 163 | lua_hashmark (avalue(o)); | 165 | lua_hashmark (avalue(o)); |
| 164 | } | 166 | } |
| 165 | 167 | ||
| 166 | 168 | ||
| @@ -247,7 +249,7 @@ static void lua_nextvar (void) | |||
| 247 | { | 249 | { |
| 248 | Object name; | 250 | Object name; |
| 249 | tag(&name) = LUA_T_STRING; | 251 | tag(&name) = LUA_T_STRING; |
| 250 | svalue(&name) = next->str; | 252 | tsvalue(&name) = &(next->ts); |
| 251 | luaI_pushobject(&name); | 253 | luaI_pushobject(&name); |
| 252 | luaI_pushobject(&s_object(next->varindex)); | 254 | luaI_pushobject(&s_object(next->varindex)); |
| 253 | } | 255 | } |
| @@ -1,16 +1,17 @@ | |||
| 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 2.7 1994/11/17 13:58:57 roberto Exp roberto $ | 4 | ** $Id: table.h,v 2.8 1994/11/18 19:27:38 roberto Exp roberto $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #ifndef table_h | 7 | #ifndef table_h |
| 8 | #define table_h | 8 | #define table_h |
| 9 | 9 | ||
| 10 | #include "tree.h" | 10 | #include "tree.h" |
| 11 | #include "opcode.h" | ||
| 11 | 12 | ||
| 12 | extern Symbol *lua_table; | 13 | extern Symbol *lua_table; |
| 13 | extern char **lua_constant; | 14 | extern TaggedString **lua_constant; |
| 14 | 15 | ||
| 15 | extern char *lua_file[]; | 16 | extern char *lua_file[]; |
| 16 | extern int lua_nfile; | 17 | extern int lua_nfile; |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_tree="$Id: tree.c,v 1.8 1994/11/17 13:58:57 roberto Exp roberto $"; | 6 | char *rcs_tree="$Id: tree.c,v 1.9 1994/11/18 19:27:38 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | #include <string.h> | 9 | #include <string.h> |
| @@ -19,13 +19,11 @@ char *rcs_tree="$Id: tree.c,v 1.8 1994/11/17 13:58:57 roberto Exp roberto $"; | |||
| 19 | 19 | ||
| 20 | typedef struct StringNode { | 20 | typedef struct StringNode { |
| 21 | struct StringNode *next; | 21 | struct StringNode *next; |
| 22 | Word mark; | 22 | TaggedString ts; |
| 23 | char str[1]; | ||
| 24 | } StringNode; | 23 | } StringNode; |
| 25 | 24 | ||
| 26 | static StringNode *string_root = NULL; | 25 | static StringNode *string_root = NULL; |
| 27 | 26 | ||
| 28 | |||
| 29 | static TreeNode *constant_root = NULL; | 27 | static TreeNode *constant_root = NULL; |
| 30 | 28 | ||
| 31 | /* | 29 | /* |
| @@ -37,13 +35,14 @@ static TreeNode *tree_create (TreeNode **node, char *str) | |||
| 37 | { | 35 | { |
| 38 | *node = (TreeNode *) luaI_malloc(sizeof(TreeNode)+strlen(str)); | 36 | *node = (TreeNode *) luaI_malloc(sizeof(TreeNode)+strlen(str)); |
| 39 | (*node)->left = (*node)->right = NULL; | 37 | (*node)->left = (*node)->right = NULL; |
| 40 | strcpy((*node)->str, str); | 38 | strcpy((*node)->ts.str, str); |
| 41 | (*node)->varindex = (*node)->constindex = UNMARKED_STRING; | 39 | (*node)->ts.marked = 0; |
| 40 | (*node)->varindex = (*node)->constindex = NOT_USED; | ||
| 42 | return *node; | 41 | return *node; |
| 43 | } | 42 | } |
| 44 | else | 43 | else |
| 45 | { | 44 | { |
| 46 | int c = lua_strcmp(str, (*node)->str); | 45 | int c = lua_strcmp(str, (*node)->ts.str); |
| 47 | if (c < 0) | 46 | if (c < 0) |
| 48 | return tree_create(&(*node)->left, str); | 47 | return tree_create(&(*node)->left, str); |
| 49 | else if (c > 0) | 48 | else if (c > 0) |
| @@ -53,17 +52,17 @@ static TreeNode *tree_create (TreeNode **node, char *str) | |||
| 53 | } | 52 | } |
| 54 | } | 53 | } |
| 55 | 54 | ||
| 56 | char *lua_createstring (char *str) | 55 | TaggedString *lua_createstring (char *str) |
| 57 | { | 56 | { |
| 58 | StringNode *newString; | 57 | StringNode *newString; |
| 59 | if (str == NULL) return NULL; | 58 | if (str == NULL) return NULL; |
| 60 | lua_pack(); | 59 | lua_pack(); |
| 61 | newString = (StringNode *)luaI_malloc(sizeof(StringNode)+strlen(str)); | 60 | newString = (StringNode *)luaI_malloc(sizeof(StringNode)+strlen(str)); |
| 62 | newString->mark = UNMARKED_STRING; | 61 | newString->ts.marked = 0; |
| 63 | strcpy(newString->str, str); | 62 | strcpy(newString->ts.str, str); |
| 64 | newString->next = string_root; | 63 | newString->next = string_root; |
| 65 | string_root = newString; | 64 | string_root = newString; |
| 66 | return newString->str; | 65 | return &(newString->ts); |
| 67 | } | 66 | } |
| 68 | 67 | ||
| 69 | 68 | ||
| @@ -84,7 +83,7 @@ int lua_strcollector (void) | |||
| 84 | while (curr) | 83 | while (curr) |
| 85 | { | 84 | { |
| 86 | StringNode *next = curr->next; | 85 | StringNode *next = curr->next; |
| 87 | if (curr->mark == UNMARKED_STRING) | 86 | if (!curr->ts.marked) |
| 88 | { | 87 | { |
| 89 | if (prev == NULL) string_root = next; | 88 | if (prev == NULL) string_root = next; |
| 90 | else prev->next = next; | 89 | else prev->next = next; |
| @@ -93,7 +92,7 @@ int lua_strcollector (void) | |||
| 93 | } | 92 | } |
| 94 | else | 93 | else |
| 95 | { | 94 | { |
| 96 | curr->mark = UNMARKED_STRING; | 95 | curr->ts.marked = 0; |
| 97 | prev = curr; | 96 | prev = curr; |
| 98 | } | 97 | } |
| 99 | curr = next; | 98 | curr = next; |
| @@ -110,7 +109,7 @@ static TreeNode *tree_next (TreeNode *node, char *str) | |||
| 110 | else if (str == NULL) return node; | 109 | else if (str == NULL) return node; |
| 111 | else | 110 | else |
| 112 | { | 111 | { |
| 113 | int c = lua_strcmp(str, node->str); | 112 | int c = lua_strcmp(str, node->ts.str); |
| 114 | if (c == 0) | 113 | if (c == 0) |
| 115 | return node->left != NULL ? node->left : node->right; | 114 | return node->left != NULL ? node->left : node->right; |
| 116 | else if (c < 0) | 115 | else if (c < 0) |
| @@ -131,10 +130,10 @@ TreeNode *lua_varnext (char *n) | |||
| 131 | { /* repeat until a valid (non nil) variable */ | 130 | { /* repeat until a valid (non nil) variable */ |
| 132 | result = tree_next(constant_root, name); | 131 | result = tree_next(constant_root, name); |
| 133 | if (result == NULL) return NULL; | 132 | if (result == NULL) return NULL; |
| 134 | if (result->varindex != UNMARKED_STRING && | 133 | if (result->varindex != NOT_USED && |
| 135 | s_tag(result->varindex) != LUA_T_NIL) | 134 | s_tag(result->varindex) != LUA_T_NIL) |
| 136 | return result; | 135 | return result; |
| 137 | name = result->str; | 136 | name = result->ts.str; |
| 138 | } | 137 | } |
| 139 | } | 138 | } |
| 140 | 139 | ||
| @@ -1,34 +1,33 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** tree.h | 2 | ** tree.h |
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | ** $Id: tree.h,v 1.4 1994/11/17 13:58:57 roberto Exp roberto $ | 4 | ** $Id: tree.h,v 1.5 1994/11/18 19:27:38 roberto Exp roberto $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #ifndef tree_h | 7 | #ifndef tree_h |
| 8 | #define tree_h | 8 | #define tree_h |
| 9 | 9 | ||
| 10 | #include "opcode.h" | ||
| 11 | 10 | ||
| 11 | #define NOT_USED 0xFFFE | ||
| 12 | 12 | ||
| 13 | #define UNMARKED_STRING 0xFFFF | ||
| 14 | #define MARKED_STRING 0xFFFE | ||
| 15 | #define MAX_WORD 0xFFFD | ||
| 16 | 13 | ||
| 14 | typedef struct TaggedString | ||
| 15 | { | ||
| 16 | char marked; /* for garbage collection */ | ||
| 17 | char str[1]; /* \0 byte already reserved */ | ||
| 18 | } TaggedString; | ||
| 17 | 19 | ||
| 18 | typedef struct TreeNode | 20 | typedef struct TreeNode |
| 19 | { | 21 | { |
| 20 | struct TreeNode *right; | 22 | struct TreeNode *right; |
| 21 | struct TreeNode *left; | 23 | struct TreeNode *left; |
| 22 | Word varindex; /* if this is a symbol */ | 24 | unsigned short varindex; /* != NOT_USED if this is a symbol */ |
| 23 | Word constindex; /* if this is a constant; also used for garbage collection */ | 25 | unsigned short constindex; /* != NOT_USED if this is a constant */ |
| 24 | char str[1]; /* \0 byte already reserved */ | 26 | TaggedString ts; |
| 25 | } TreeNode; | 27 | } TreeNode; |
| 26 | 28 | ||
| 27 | 29 | ||
| 28 | #define indexstring(s) (*(((Word *)s)-1)) | 30 | TaggedString *lua_createstring (char *str); |
| 29 | |||
| 30 | |||
| 31 | char *lua_createstring (char *str); | ||
| 32 | TreeNode *lua_constcreate (char *str); | 31 | TreeNode *lua_constcreate (char *str); |
| 33 | int lua_strcollector (void); | 32 | int lua_strcollector (void); |
| 34 | TreeNode *lua_varnext (char *n); | 33 | TreeNode *lua_varnext (char *n); |
