aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1995-10-04 14:13:02 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1995-10-04 14:13:02 -0300
commit68f337dfa617732646a4a974eb33b25daf45a1e2 (patch)
tree81e72eaf0ada8a2246c6cf1af2d96ddaef41d117
parentf132ac03bcaf0163f1f86b5114c93a753e17f28b (diff)
downloadlua-68f337dfa617732646a4a974eb33b25daf45a1e2.tar.gz
lua-68f337dfa617732646a4a974eb33b25daf45a1e2.tar.bz2
lua-68f337dfa617732646a4a974eb33b25daf45a1e2.zip
Garbage collection of functions + header structure for functions
-rw-r--r--fallback.c9
-rw-r--r--fallback.h3
-rw-r--r--hash.c6
-rw-r--r--inout.c4
-rw-r--r--lua.stx31
-rw-r--r--opcode.c22
-rw-r--r--opcode.h11
-rw-r--r--table.c6
8 files changed, 56 insertions, 36 deletions
diff --git a/fallback.c b/fallback.c
index fd9bd648..e4da2df1 100644
--- a/fallback.c
+++ b/fallback.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_fallback="$Id: fallback.c,v 1.12 1995/05/02 18:43:03 roberto Exp roberto $"; 6char *rcs_fallback="$Id: fallback.c,v 1.13 1995/10/02 17:03:33 roberto Exp roberto $";
7 7
8#include <stdio.h> 8#include <stdio.h>
9#include <string.h> 9#include <string.h>
@@ -168,3 +168,10 @@ void luaI_travlock (void (*fn)(Object *))
168 fn(&lockArray[i]); 168 fn(&lockArray[i]);
169} 169}
170 170
171
172void luaI_travfallbacks (void (*fn)(Object *))
173{
174 Word i;
175 for (i=0; i<N_FB; i++)
176 fn(&luaI_fallBacks[i].function);
177}
diff --git a/fallback.h b/fallback.h
index 8da9dd2e..97dcb484 100644
--- a/fallback.h
+++ b/fallback.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: fallback.h,v 1.6 1994/11/21 13:30:15 roberto Exp roberto $ 2** $Id: fallback.h,v 1.7 1994/11/21 18:22:58 roberto Stab roberto $
3*/ 3*/
4 4
5#ifndef fallback_h 5#ifndef fallback_h
@@ -26,6 +26,7 @@ void luaI_setfallback (void);
26int luaI_lock (Object *object); 26int luaI_lock (Object *object);
27Object *luaI_getlocked (int ref); 27Object *luaI_getlocked (int ref);
28void luaI_travlock (void (*fn)(Object *)); 28void luaI_travlock (void (*fn)(Object *));
29void luaI_travfallbacks (void (*fn)(Object *));
29 30
30#endif 31#endif
31 32
diff --git a/hash.c b/hash.c
index 22e7d547..d2014293 100644
--- a/hash.c
+++ b/hash.c
@@ -3,7 +3,7 @@
3** hash manager for lua 3** hash manager for lua
4*/ 4*/
5 5
6char *rcs_hash="$Id: hash.c,v 2.24 1995/02/06 19:34:03 roberto Exp roberto $"; 6char *rcs_hash="$Id: hash.c,v 2.25 1995/05/02 18:43:03 roberto Exp $";
7 7
8#include <string.h> 8#include <string.h>
9 9
@@ -70,7 +70,7 @@ static Word hashindex (Hash *t, Object *ref) /* hash function */
70 return (Word)h%nhash(t); /* make it a valid index */ 70 return (Word)h%nhash(t); /* make it a valid index */
71 } 71 }
72 case LUA_T_FUNCTION: 72 case LUA_T_FUNCTION:
73 return (((IntPoint)bvalue(ref))%nhash(t)); 73 return (((IntPoint)ref->value.tf)%nhash(t));
74 case LUA_T_CFUNCTION: 74 case LUA_T_CFUNCTION:
75 return (((IntPoint)fvalue(ref))%nhash(t)); 75 return (((IntPoint)fvalue(ref))%nhash(t));
76 case LUA_T_ARRAY: 76 case LUA_T_ARRAY:
@@ -89,7 +89,7 @@ Bool lua_equalObj (Object *t1, Object *t2)
89 case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2); 89 case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2);
90 case LUA_T_STRING: return streq(svalue(t1), svalue(t2)); 90 case LUA_T_STRING: return streq(svalue(t1), svalue(t2));
91 case LUA_T_ARRAY: return avalue(t1) == avalue(t2); 91 case LUA_T_ARRAY: return avalue(t1) == avalue(t2);
92 case LUA_T_FUNCTION: return bvalue(t1) == bvalue(t2); 92 case LUA_T_FUNCTION: return t1->value.tf == t2->value.tf;
93 case LUA_T_CFUNCTION: return fvalue(t1) == fvalue(t2); 93 case LUA_T_CFUNCTION: return fvalue(t1) == fvalue(t2);
94 default: return uvalue(t1) == uvalue(t2); 94 default: return uvalue(t1) == uvalue(t2);
95 } 95 }
diff --git a/inout.c b/inout.c
index afb0ee52..cfcd224e 100644
--- a/inout.c
+++ b/inout.c
@@ -5,7 +5,7 @@
5** Also provides some predefined lua functions. 5** Also provides some predefined lua functions.
6*/ 6*/
7 7
8char *rcs_inout="$Id: inout.c,v 2.19 1995/05/02 18:43:03 roberto Exp roberto $"; 8char *rcs_inout="$Id: inout.c,v 2.20 1995/05/16 17:23:58 roberto Exp $";
9 9
10#include <stdio.h> 10#include <stdio.h>
11#include <stdlib.h> 11#include <stdlib.h>
@@ -222,7 +222,7 @@ void lua_print (void)
222 { 222 {
223 if (lua_isnumber(obj)) printf("%g\n",lua_getnumber(obj)); 223 if (lua_isnumber(obj)) printf("%g\n",lua_getnumber(obj));
224 else if (lua_isstring(obj)) printf("%s\n",lua_getstring(obj)); 224 else if (lua_isstring(obj)) printf("%s\n",lua_getstring(obj));
225 else if (lua_isfunction(obj)) printf("function: %p\n",bvalue(luaI_Address(obj))); 225 else if (lua_isfunction(obj)) printf("function: %p\n",(luaI_Address(obj))->value.tf);
226 else if (lua_iscfunction(obj)) printf("cfunction: %p\n",lua_getcfunction(obj) 226 else if (lua_iscfunction(obj)) printf("cfunction: %p\n",lua_getcfunction(obj)
227); 227);
228 else if (lua_isuserdata(obj)) printf("userdata: %p\n",lua_getuserdata(obj)); 228 else if (lua_isuserdata(obj)) printf("userdata: %p\n",lua_getuserdata(obj));
diff --git a/lua.stx b/lua.stx
index f8bdb9d7..9bb5b1f4 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 3.18 1995/04/11 17:56:30 celes Exp roberto $"; 3char *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 */
18int yyparse (void); 19int 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
87static void code_code (Byte *b) 88static 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*/
356void lua_parse (Byte **code) 357void 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
465body : '(' parlist ')' block END 468body : '(' 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:
diff --git a/opcode.c b/opcode.c
index d68db2ad..78fabf25 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 3.38 1995/05/16 17:23:58 roberto Exp roberto $"; 6char *rcs_opcode="$Id: opcode.c,v 3.38 1995/05/16 17:23:58 roberto Exp $";
7 7
8#include <setjmp.h> 8#include <setjmp.h>
9#include <stdlib.h> 9#include <stdlib.h>
@@ -259,7 +259,7 @@ static void do_call (Object *func, StkId base, int nResults, StkId whereRes)
259 if (tag(func) == LUA_T_CFUNCTION) 259 if (tag(func) == LUA_T_CFUNCTION)
260 firstResult = callC(fvalue(func), base); 260 firstResult = callC(fvalue(func), base);
261 else if (tag(func) == LUA_T_FUNCTION) 261 else if (tag(func) == LUA_T_FUNCTION)
262 firstResult = lua_execute(bvalue(func), base); 262 firstResult = lua_execute(func->value.tf->code, base);
263 else 263 else
264 { /* func is not a function */ 264 { /* func is not a function */
265 call_funcFB(func, base, nResults, whereRes); 265 call_funcFB(func, base, nResults, whereRes);
@@ -360,24 +360,26 @@ static int do_protectedrun (Object *function, int nResults)
360 360
361static int do_protectedmain (void) 361static int do_protectedmain (void)
362{ 362{
363 Byte *code = NULL; 363 TFunc tf;
364 int status; 364 int status;
365 StkId oldCBase = CBase; 365 StkId oldCBase = CBase;
366 jmp_buf myErrorJmp; 366 jmp_buf myErrorJmp;
367 jmp_buf *oldErr = errorJmp; 367 jmp_buf *oldErr = errorJmp;
368 errorJmp = &myErrorJmp; 368 errorJmp = &myErrorJmp;
369 tf.code = NULL;
369 if (setjmp(myErrorJmp) == 0) 370 if (setjmp(myErrorJmp) == 0)
370 { 371 {
371 Object f; 372 Object f;
372 lua_parse(&code); 373 f.tag = LUA_T_FUNCTION;
373 tag(&f) = LUA_T_FUNCTION; bvalue(&f) = code; 374 f.value.tf = &tf;
375 lua_parse(&tf);
374 do_call(&f, CBase, 0, CBase); 376 do_call(&f, CBase, 0, CBase);
375 status = 0; 377 status = 0;
376 } 378 }
377 else 379 else
378 status = 1; 380 status = 1;
379 if (code) 381 if (tf.code)
380 luaI_free(code); 382 luaI_free(tf.code);
381 errorJmp = oldErr; 383 errorJmp = oldErr;
382 CBase = oldCBase; 384 CBase = oldCBase;
383 top = stack+CBase; 385 top = stack+CBase;
@@ -793,7 +795,9 @@ static StkId lua_execute (Byte *pc, StkId base)
793 { 795 {
794 CodeCode code; 796 CodeCode code;
795 get_code(code,pc); 797 get_code(code,pc);
796 tag(top) = LUA_T_FUNCTION; bvalue(top) = code.b; 798 luaI_insertfunction(code.tf); /* may take part in GC */
799 top->tag = LUA_T_FUNCTION;
800 top->value.tf = code.tf;
797 incr_top; 801 incr_top;
798 } 802 }
799 break; 803 break;
@@ -1116,7 +1120,7 @@ static StkId lua_execute (Byte *pc, StkId base)
1116 CodeWord func; 1120 CodeWord func;
1117 get_code(file,pc); 1121 get_code(file,pc);
1118 get_word(func,pc); 1122 get_word(func,pc);
1119 lua_pushfunction ((char *)file.b, func.w); 1123 lua_pushfunction ((char *)file.tf, func.w);
1120 } 1124 }
1121 break; 1125 break;
1122 1126
diff --git a/opcode.h b/opcode.h
index f7b5859e..3af5597f 100644
--- a/opcode.h
+++ b/opcode.h
@@ -1,6 +1,6 @@
1/* 1/*
2** TeCGraf - PUC-Rio 2** TeCGraf - PUC-Rio
3** $Id: opcode.h,v 3.10 1994/12/20 21:20:36 roberto Exp celes $ 3** $Id: opcode.h,v 3.11 1995/04/11 17:56:30 celes Exp $
4*/ 4*/
5 5
6#ifndef opcode_h 6#ifndef opcode_h
@@ -9,6 +9,7 @@
9#include "lua.h" 9#include "lua.h"
10#include "types.h" 10#include "types.h"
11#include "tree.h" 11#include "tree.h"
12#include "func.h"
12 13
13#ifndef real 14#ifndef real
14#define real float 15#define real float
@@ -83,7 +84,7 @@ typedef union
83 Cfunction f; 84 Cfunction f;
84 real n; 85 real n;
85 TaggedString *ts; 86 TaggedString *ts;
86 Byte *b; 87 TFunc *tf;
87 struct Hash *a; 88 struct Hash *a;
88 void *u; 89 void *u;
89} Value; 90} Value;
@@ -104,7 +105,6 @@ typedef struct
104#define nvalue(o) ((o)->value.n) 105#define nvalue(o) ((o)->value.n)
105#define svalue(o) ((o)->value.ts->str) 106#define svalue(o) ((o)->value.ts->str)
106#define tsvalue(o) ((o)->value.ts) 107#define tsvalue(o) ((o)->value.ts)
107#define bvalue(o) ((o)->value.b)
108#define avalue(o) ((o)->value.a) 108#define avalue(o) ((o)->value.a)
109#define fvalue(o) ((o)->value.f) 109#define fvalue(o) ((o)->value.f)
110#define uvalue(o) ((o)->value.u) 110#define uvalue(o) ((o)->value.u)
@@ -114,7 +114,6 @@ typedef struct
114#define s_tag(i) (tag(&s_object(i))) 114#define s_tag(i) (tag(&s_object(i)))
115#define s_nvalue(i) (nvalue(&s_object(i))) 115#define s_nvalue(i) (nvalue(&s_object(i)))
116#define s_svalue(i) (svalue(&s_object(i))) 116#define s_svalue(i) (svalue(&s_object(i)))
117#define s_bvalue(i) (bvalue(&s_object(i)))
118#define s_avalue(i) (avalue(&s_object(i))) 117#define s_avalue(i) (avalue(&s_object(i)))
119#define s_fvalue(i) (fvalue(&s_object(i))) 118#define s_fvalue(i) (fvalue(&s_object(i)))
120#define s_uvalue(i) (uvalue(&s_object(i))) 119#define s_uvalue(i) (uvalue(&s_object(i)))
@@ -137,7 +136,7 @@ typedef union
137typedef union 136typedef union
138{ 137{
139 struct {char c1; char c2; char c3; char c4;} m; 138 struct {char c1; char c2; char c3; char c4;} m;
140 Byte *b; 139 TFunc *tf;
141} CodeCode; 140} CodeCode;
142#define get_code(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\ 141#define get_code(code,pc) {code.m.c1 = *pc++; code.m.c2 = *pc++;\
143 code.m.c3 = *pc++; code.m.c4 = *pc++;} 142 code.m.c3 = *pc++; code.m.c4 = *pc++;}
@@ -149,7 +148,7 @@ char *lua_strdup (char *l);
149void lua_setinput (Input fn); /* from "lex.c" module */ 148void lua_setinput (Input fn); /* from "lex.c" module */
150char *lua_lasttext (void); /* from "lex.c" module */ 149char *lua_lasttext (void); /* from "lex.c" module */
151int yylex (void); /* from "lex.c" module */ 150int yylex (void); /* from "lex.c" module */
152void lua_parse (Byte **code); /* from "lua.stx" module */ 151void lua_parse (TFunc *tf); /* from "lua.stx" module */
153void lua_travstack (void (*fn)(Object *)); 152void lua_travstack (void (*fn)(Object *));
154Object *luaI_Address (lua_Object o); 153Object *luaI_Address (lua_Object o);
155void luaI_pushobject (Object *o); 154void luaI_pushobject (Object *o);
diff --git a/table.c b/table.c
index be93d833..05f92c15 100644
--- a/table.c
+++ b/table.c
@@ -3,7 +3,7 @@
3** Module to control static tables 3** Module to control static tables
4*/ 4*/
5 5
6char *rcs_table="$Id: table.c,v 2.31 1995/05/16 19:23:55 celes Exp roberto $"; 6char *rcs_table="$Id: table.c,v 2.32 1995/09/15 20:47:53 roberto Exp $";
7 7
8#include <string.h> 8#include <string.h>
9 9
@@ -166,6 +166,8 @@ void lua_markobject (Object *o)
166 tsvalue(o)->marked = 1; 166 tsvalue(o)->marked = 1;
167 else if (tag(o) == LUA_T_ARRAY) 167 else if (tag(o) == LUA_T_ARRAY)
168 lua_hashmark (avalue(o)); 168 lua_hashmark (avalue(o));
169 else if (o->tag == LUA_T_FUNCTION && !o->value.tf->marked)
170 o->value.tf->marked = 1;
169} 171}
170 172
171 173
@@ -182,8 +184,10 @@ void lua_pack (void)
182 lua_travstack(lua_markobject); /* mark stack objects */ 184 lua_travstack(lua_markobject); /* mark stack objects */
183 lua_travsymbol(lua_markobject); /* mark symbol table objects */ 185 lua_travsymbol(lua_markobject); /* mark symbol table objects */
184 luaI_travlock(lua_markobject); /* mark locked objects */ 186 luaI_travlock(lua_markobject); /* mark locked objects */
187 luaI_travfallbacks(lua_markobject); /* mark fallbacks */
185 recovered += lua_strcollector(); 188 recovered += lua_strcollector();
186 recovered += lua_hashcollector(); 189 recovered += lua_hashcollector();
190 recovered += luaI_funccollector();
187 nentity = 0; /* reset counter */ 191 nentity = 0; /* reset counter */
188 block=(16*block-7*recovered)/12; /* adapt block size */ 192 block=(16*block-7*recovered)/12; /* adapt block size */
189 if (block < MIN_GARBAGE_BLOCK) block = MIN_GARBAGE_BLOCK; 193 if (block < MIN_GARBAGE_BLOCK) block = MIN_GARBAGE_BLOCK;