summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-07-30 19:00:50 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-07-30 19:00:50 -0300
commit0892f0e5b75c51f1fee07276a3ba13301b83409e (patch)
tree9f3b9ec92f26c05a85c826ffc5f803fda2f48867
parent1d7857bc635c0bfe7c5b1f325d31feb7660e9a5a (diff)
downloadlua-github-0892f0e5b75c51f1fee07276a3ba13301b83409e.tar.gz
BIG CHANGE: functions have their own "constant table".
-rw-r--r--func.c46
-rw-r--r--func.h10
-rw-r--r--inout.c8
-rw-r--r--inout.h5
-rw-r--r--lex.c17
-rw-r--r--lua.stx281
-rw-r--r--opcode.c96
-rw-r--r--opcode.h12
-rw-r--r--table.c60
-rw-r--r--table.h10
-rw-r--r--tree.c4
-rw-r--r--tree.h6
12 files changed, 278 insertions, 277 deletions
diff --git a/func.c b/func.c
index 1cf5b1e7..a78122da 100644
--- a/func.c
+++ b/func.c
@@ -11,6 +11,14 @@
static TFunc *function_root = NULL;
+static void luaI_insertfunction (TFunc *f)
+{
+ lua_pack();
+ f->next = function_root;
+ function_root = f;
+ f->marked = 0;
+}
+
/*
** Initialize TFunc struct
*/
@@ -21,29 +29,23 @@ void luaI_initTFunc (TFunc *f)
f->code = NULL;
f->lineDefined = 0;
f->fileName = lua_parsedfile;
+ f->consts = NULL;
+ f->nconsts = 0;
f->locvars = NULL;
+ luaI_insertfunction(f);
}
-/*
-** Insert function in list for GC
-*/
-void luaI_insertfunction (TFunc *f)
-{
- lua_pack();
- f->next = function_root;
- function_root = f;
- f->marked = 0;
-}
/*
** Free function
*/
-void luaI_freefunc (TFunc *f)
+static void luaI_freefunc (TFunc *f)
{
- luaI_free (f->code);
- luaI_free (f->locvars);
- luaI_free (f);
+ luaI_free(f->code);
+ luaI_free(f->locvars);
+ luaI_free(f->consts);
+ luaI_free(f);
}
@@ -56,6 +58,20 @@ void luaI_funcfree (TFunc *l)
}
}
+
+void luaI_funcmark (TFunc *f)
+{
+ f->marked = 1;
+ if (!f->fileName->marked)
+ f->fileName->marked = 1;
+ if (f->consts) {
+ int i;
+ for (i=0; i<f->nconsts; i++)
+ lua_markobject(&f->consts[i]);
+ }
+}
+
+
/*
** Garbage collection function.
*/
@@ -92,7 +108,7 @@ void lua_funcinfo (lua_Object func, char **filename, int *linedefined)
TObject *f = luaI_Address(func);
if (f->ttype == LUA_T_MARK || f->ttype == LUA_T_FUNCTION)
{
- *filename = f->value.tf->fileName;
+ *filename = f->value.tf->fileName->str;
*linedefined = f->value.tf->lineDefined;
}
else if (f->ttype == LUA_T_CMARK || f->ttype == LUA_T_CFUNCTION)
diff --git a/func.h b/func.h
index 14f6554c..5af43056 100644
--- a/func.h
+++ b/func.h
@@ -1,5 +1,5 @@
/*
-** $Id: func.h,v 1.10 1997/07/29 19:44:02 roberto Exp roberto $
+** $Id: func.h,v 1.11 1997/07/29 20:38:45 roberto Exp roberto $
*/
#ifndef func_h
@@ -25,16 +25,16 @@ typedef struct TFunc
int marked;
Byte *code;
int lineDefined;
- char *fileName;
+ TaggedString *fileName;
+ struct TObject *consts;
+ int nconsts;
LocVar *locvars;
} TFunc;
TFunc *luaI_funccollector (long *cont);
void luaI_funcfree (TFunc *l);
-void luaI_insertfunction (TFunc *f);
-
+void luaI_funcmark (TFunc *f);
void luaI_initTFunc (TFunc *f);
-void luaI_freefunc (TFunc *f);
char *luaI_getlocalname (TFunc *func, int local_number, int line);
diff --git a/inout.c b/inout.c
index ad46f5bd..0a05c9c4 100644
--- a/inout.c
+++ b/inout.c
@@ -5,7 +5,7 @@
** Also provides some predefined lua functions.
*/
-char *rcs_inout="$Id: inout.c,v 2.70 1997/07/07 21:05:51 roberto Exp roberto $";
+char *rcs_inout="$Id: inout.c,v 2.71 1997/07/29 13:33:15 roberto Exp roberto $";
#include <stdio.h>
#include <string.h>
@@ -27,7 +27,7 @@ char *rcs_inout="$Id: inout.c,v 2.70 1997/07/07 21:05:51 roberto Exp roberto $";
/* Exported variables */
Word lua_linenumber;
-char *lua_parsedfile;
+TaggedString *lua_parsedfile;
char *luaI_typenames[] = { /* ORDER LUA_T */
@@ -40,7 +40,7 @@ char *luaI_typenames[] = { /* ORDER LUA_T */
void luaI_setparsedfile (char *name)
{
- lua_parsedfile = luaI_createfixedstring(name)->str;
+ lua_parsedfile = luaI_createstring(name);
}
@@ -399,7 +399,7 @@ void luaI_predefine (void)
s_ttype(n) = LUA_T_CFUNCTION; s_fvalue(n) = int_funcs[i].func;
}
n = luaI_findsymbolbyname("_VERSION");
- s_ttype(n) = LUA_T_STRING; s_tsvalue(n) = lua_createstring(LUA_VERSION);
+ s_ttype(n) = LUA_T_STRING; s_tsvalue(n) = luaI_createstring(LUA_VERSION);
}
diff --git a/inout.h b/inout.h
index 77e85978..c3dccdf1 100644
--- a/inout.h
+++ b/inout.h
@@ -1,5 +1,5 @@
/*
-** $Id: inout.h,v 1.19 1997/06/18 20:35:49 roberto Exp roberto $
+** $Id: inout.h,v 1.20 1997/06/19 18:04:34 roberto Exp roberto $
*/
@@ -7,12 +7,13 @@
#define inout_h
#include "types.h"
+#include "tree.h"
#include <stdio.h>
extern Word lua_linenumber;
extern Word lua_debugline;
-extern char *lua_parsedfile;
+extern TaggedString *lua_parsedfile;
void luaI_setparsedfile (char *name);
diff --git a/lex.c b/lex.c
index a1ffbbee..81cbe527 100644
--- a/lex.c
+++ b/lex.c
@@ -1,4 +1,4 @@
-char *rcs_lex = "$Id: lex.c,v 3.6 1997/07/01 19:32:41 roberto Exp roberto $";
+char *rcs_lex = "$Id: lex.c,v 3.7 1997/07/29 13:33:15 roberto Exp roberto $";
#include <ctype.h>
@@ -62,7 +62,7 @@ void lua_setinput (ZIO *z)
static void luaI_auxsyntaxerror (char *s)
{
luaL_verror("%s;\n> at line %d in file %s",
- s, lua_linenumber, lua_parsedfile);
+ s, lua_linenumber, lua_parsedfile->str);
}
static void luaI_auxsynterrbf (char *s, char *token)
@@ -70,7 +70,7 @@ static void luaI_auxsynterrbf (char *s, char *token)
if (token[0] == 0)
token = "<eof>";
luaL_verror("%s;\n> last token read: \"%s\" at line %d in file %s",
- s, token, lua_linenumber, lua_parsedfile);
+ s, token, lua_linenumber, lua_parsedfile->str);
}
void luaI_syntaxerror (char *s)
@@ -110,7 +110,7 @@ void luaI_addReserved (void)
int i;
for (i=0; i<RESERVEDSIZE; i++)
{
- TaggedString *ts = lua_createstring(reserved[i].name);
+ TaggedString *ts = luaI_createstring(reserved[i].name);
ts->marked = reserved[i].token; /* reserved word (always > 255) */
}
}
@@ -273,7 +273,7 @@ static int read_long_string (char *yytext, int buffsize)
} endloop:
save_and_next(); /* pass the second ']' */
yytext[tokensize-2] = 0; /* erases ']]' */
- luaY_lval.vWord = luaI_findconstantbyname(yytext+2);
+ luaY_lval.pTStr = luaI_createtempstring(yytext+2);
yytext[tokensize-2] = ']'; /* restores ']]' */
save(0);
return STRING;
@@ -368,7 +368,7 @@ int luaY_lex (void)
}
next(); /* skip delimiter */
save(0);
- luaY_lval.vWord = luaI_findconstantbyname(yytext+1);
+ luaY_lval.pTStr = luaI_createtempstring(yytext+1);
tokensize--;
save(del); save(0); /* restore delimiter */
return STRING;
@@ -454,11 +454,10 @@ int luaY_lex (void)
save_and_next();
} while (isalnum((unsigned char)current) || current == '_');
save(0);
- ts = lua_createstring(yytext);
- if (ts->marked > 2)
+ ts = luaI_createtempstring(yytext);
+ if (ts->marked > 255)
return ts->marked; /* reserved word */
luaY_lval.pTStr = ts;
- ts->marked = 2; /* avoid GC */
return NAME;
}
}
diff --git a/lua.stx b/lua.stx
index 9f6e56f3..66b27e14 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,10 +1,8 @@
%{
-char *rcs_luastx = "$Id: lua.stx,v 3.47 1997/06/19 17:46:12 roberto Exp roberto $";
+char *rcs_luastx = "$Id: lua.stx,v 3.48 1997/07/29 20:38:45 roberto Exp roberto $";
-#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include "luadebug.h"
#include "luamem.h"
@@ -40,6 +38,7 @@ struct State {
int pc; /* next position to code */
TaggedString *localvar[MAXLOCALS]; /* store local variable names */
int nlocalvar; /* number of active local variables */
+ int maxconsts; /* size of consts vector */
int nvars; /* total number of local variables (for debugging information) */
int maxvars; /* = -1 if no debug information */
} stateMain, stateFunc, *currState;
@@ -69,41 +68,106 @@ static void check_space (int i)
Byte, codeEM, MAX_INT);
}
+
static void code_byte (Byte c)
{
check_space(1);
currState->f->code[currState->pc++] = c;
}
-static void code_float (real n)
+
+static void code_word_at (int pc, int n)
{
- check_space(sizeof(real));
- memcpy(currState->f->code+currState->pc, &n, sizeof(real));
- currState->pc += sizeof(real);
+ Word w = n;
+ if (w != n)
+ yyerror("block too big");
+ currState->f->code[pc] = n&0xFF;
+ currState->f->code[pc+1] = n>>8;
}
-static void code_code (TFunc *tf)
+static void code_word (int n)
{
- check_space(sizeof(TFunc *));
- memcpy(currState->f->code+currState->pc, &tf, sizeof(TFunc *));
- currState->pc += sizeof(TFunc *);
+ code_byte(n&0xFF);
+ code_byte(n>>8);
}
-static void code_word_at (int pc, int n)
+static void code_constant (int c)
{
- Word w = n;
- if (w != n)
- yyerror("block too big");
- memcpy(currState->f->code+pc, &w, sizeof(Word));
+ if (c <= 255) {
+ code_byte(PUSHCONSTANTB);
+ code_byte(c);
+ }
+ else {
+ code_byte(PUSHCONSTANT);
+ code_word(c);
+ }
+}
+
+
+static int next_constant (void)
+{
+ if (currState->f->nconsts >= currState->maxconsts) {
+ currState->maxconsts =
+ growvector(&currState->f->consts, currState->maxconsts,
+ TObject, constantEM, MAX_WORD);
+ }
+ return currState->f->nconsts++;
+}
+
+
+static int string_constant (TaggedString *s)
+{
+ int c = s->u.s.constindex;
+ if (!(0 <= c && c < currState->f->nconsts &&
+ ttype(&currState->f->consts[c]) == LUA_T_STRING &&
+ tsvalue(&currState->f->consts[c]) == s)) {
+ c = next_constant();
+ ttype(&currState->f->consts[c]) = LUA_T_STRING;
+ tsvalue(&currState->f->consts[c]) = s;
+ s->u.s.constindex = c; /* hint for next time */
+ luaI_releasestring(s);
+ }
+ return c;
}
-static void code_word (Word n)
+
+static void code_string (TaggedString *s)
{
- check_space(sizeof(Word));
- memcpy(currState->f->code+currState->pc, &n, sizeof(Word));
- currState->pc += sizeof(Word);
+ int c = string_constant(s);
+ code_constant(c);
}
+static void code_float (real n)
+{
+ int c = next_constant();
+ ttype(&currState->f->consts[c]) = LUA_T_NUMBER;
+ nvalue(&currState->f->consts[c]) = n;
+ code_constant(c);
+}
+
+
+static void code_number (float f)
+{
+ Word i;
+ if (f >= 0 && f <= (float)MAX_WORD && (float)(i=(Word)f) == f) {
+ /* f has an (short) integer value */
+ if (i <= 2) code_byte(PUSH0 + i);
+ else if (i <= 255)
+ {
+ code_byte(PUSHBYTE);
+ code_byte(i);
+ }
+ else
+ {
+ code_byte(PUSHWORD);
+ code_word(i);
+ }
+ }
+ else
+ code_float(f);
+}
+
+
static void flush_record (int n)
{
if (n == 0) return;
@@ -149,6 +213,7 @@ static void luaI_unregisterlocalvar (int line)
static void store_localvar (TaggedString *name, int n)
{
+ luaI_fixstring(name); /* local var names cannot be GC */
if (currState->nlocalvar+n < MAXLOCALS)
currState->localvar[currState->nlocalvar+n] = name;
else
@@ -170,40 +235,6 @@ static void add_varbuffer (Long var)
yyerror ("variable buffer overflow");
}
-static void code_string (Word w)
-{
- code_byte(PUSHSTRING);
- code_word(w);
-}
-
-static void code_constant (TaggedString *s)
-{
- code_string(luaI_findconstant(s));
-}
-
-static void code_number (float f)
-{
- Word i;
- if (f >= 0 && f <= (float)MAX_WORD && (float)(i=(Word)f) == f) {
- /* f has an (short) integer value */
- if (i <= 2) code_byte(PUSH0 + i);
- else if (i <= 255)
- {
- code_byte(PUSHBYTE);
- code_byte(i);
- }
- else
- {
- code_byte(PUSHWORD);
- code_word(i);
- }
- }
- else
- {
- code_byte(PUSHFLOAT);
- code_float(f);
- }
-}
/*
** Search a local name and if find return its index. If do not find return -1
@@ -256,55 +287,6 @@ static void lua_codeadjust (int n)
}
-static void init_state (TFunc *f)
-{
- luaI_initTFunc(f);
- currState->nlocalvar = 0;
- currState->f = f;
- currState->pc = 0;
- currState->codesize = CODE_BLOCK;
- f->code = newvector(CODE_BLOCK, Byte);
- if (lua_debug) {
- currState->nvars = 0;
- currState->maxvars = 0;
- }
- else
- currState->maxvars = -1; /* flag no debug information */
-}
-
-
-static void init_func (void)
-{
- currState = &stateFunc;
- init_state(new(TFunc));
- luaI_codedebugline(lua_linenumber);
-}
-
-
-static void codereturn (void)
-{
- if (currState->nlocalvar == 0)
- code_byte(RETCODE0);
- else
- {
- code_byte(RETCODE);
- code_byte(currState->nlocalvar);
- }
-}
-
-
-static void close_func (void)
-{
- codereturn();
- code_byte(ENDCODE);
- currState->f->code = shrinkvector(currState->f->code, currState->pc, Byte);
- if (currState->maxvars != -1) { /* debug information? */
- luaI_registerlocalvar(NULL, -1); /* flag end of vector */
- currState->f->locvars = shrinkvector(currState->f->locvars,
- currState->nvars, LocVar);
- }
-}
-
void luaI_codedebugline (int line)
{
@@ -350,7 +332,7 @@ static int close_parlist (int dots)
else {
code_byte(VARARGS);
code_byte(currState->nlocalvar);
- add_localvar(luaI_createfixedstring("arg"));
+ add_localvar(luaI_createstring("arg"));
}
return lua_linenumber;
}
@@ -423,6 +405,65 @@ static void code_shortcircuit (int pc, Byte jmp)
}
+static void init_state (TFunc *f)
+{
+ currState->nlocalvar = 0;
+ currState->f = f;
+ currState->pc = 0;
+ currState->codesize = CODE_BLOCK;
+ f->code = newvector(CODE_BLOCK, Byte);
+ currState->maxconsts = 0;
+ if (lua_debug) {
+ currState->nvars = 0;
+ currState->maxvars = 0;
+ }
+ else
+ currState->maxvars = -1; /* flag no debug information */
+}
+
+
+static void init_func (Long v)
+{
+ TFunc *f = new(TFunc);
+ int c = next_constant();
+ ttype(&currState->f->consts[c]) = LUA_T_FUNCTION;
+ currState->f->consts[c].value.tf = f;
+ code_constant(c);
+ storesinglevar(v);
+ currState = &stateFunc;
+ luaI_initTFunc(f);
+ init_state(f);
+ luaI_codedebugline(lua_linenumber);
+}
+
+
+static void codereturn (void)
+{
+ if (currState->nlocalvar == 0)
+ code_byte(RETCODE0);
+ else
+ {
+ code_byte(RETCODE);
+ code_byte(currState->nlocalvar);
+ }
+}
+
+
+static void close_func (void)
+{
+ codereturn();
+ code_byte(ENDCODE);
+ currState->f->code = shrinkvector(currState->f->code, currState->pc, Byte);
+ currState->f->consts = shrinkvector(currState->f->consts,
+ currState->f->nconsts, TObject);
+ if (currState->maxvars != -1) { /* debug information? */
+ luaI_registerlocalvar(NULL, -1); /* flag end of vector */
+ currState->f->locvars = shrinkvector(currState->f->locvars,
+ currState->nvars, LocVar);
+ }
+}
+
+
/*
** Parse LUA code.
*/
@@ -444,9 +485,7 @@ void lua_parse (TFunc *tf)
int vInt;
float vFloat;
char *pChar;
- Word vWord;
Long vLong;
- TFunc *pFunc;
TaggedString *pTStr;
}
@@ -460,8 +499,7 @@ void lua_parse (TFunc *tf)
%token FUNCTION
%token DOTS
%token <vFloat> NUMBER
-%token <vWord> STRING
-%token <pTStr> NAME
+%token <pTStr> NAME STRING
%type <vLong> PrepJump
%type <vLong> exprlist, exprlist1 /* if > 0, points to function return
@@ -473,8 +511,7 @@ void lua_parse (TFunc *tf)
%type <vInt> ffieldlist, ffieldlist1, semicolonpart
%type <vInt> lfieldlist, lfieldlist1
%type <vInt> parlist, parlist1, par
-%type <vLong> var, singlevar, funcname
-%type <pFunc> body
+%type <vLong> var, singlevar
%left AND OR
%left EQ NE '>' '<' LE GE
@@ -495,28 +532,21 @@ chunklist : /* empty */
;
function : FUNCTION funcname body
- {
- code_byte(PUSHFUNCTION);
- code_code($3);
- storesinglevar($2);
- }
;
-funcname : var { $$ =$1; init_func(); }
+funcname : var { init_func($1); }
| varexp ':' NAME
{
- code_constant($3);
- $$ = 0; /* indexed variable */
- init_func();
- add_localvar(luaI_createfixedstring("self"));
+ code_string($3);
+ init_func(0); /* indexed variable */
+ add_localvar(luaI_createstring("self"));
}
;
body : '(' parlist ')' block END
{
close_func();
- $$ = currState->f;
- $$->lineDefined = $2;
+ currState->f->lineDefined = $2;
currState = &stateMain; /* change back to main code */
}
;
@@ -658,7 +688,7 @@ funcvalue : varexp { $$ = 0; }
| varexp ':' NAME
{
code_byte(PUSHSELF);
- code_word(luaI_findconstant($3));
+ code_word(string_constant($3));
$$ = 1;
}
;
@@ -735,7 +765,7 @@ ffield : ffieldkey '=' expr1
;
ffieldkey : '[' expr1 ']'
- | NAME { code_constant($1); }
+ | NAME { code_string($1); }
;
lfieldlist : /* empty */ { $$ = 0; }
@@ -771,7 +801,7 @@ var : singlevar { $$ = $1; }
}
| varexp '.' NAME
{
- code_constant($3);
+ code_string($3);
$$ = 0; /* indexed variable */
}
;
@@ -783,6 +813,7 @@ singlevar : NAME
$$ = luaI_findsymbol($1)+1; /* return positive value */
else
$$ = -(local+1); /* return negative value */
+ luaI_fixstring($1); /* cannot GC variable names */
}
;
diff --git a/opcode.c b/opcode.c
index 3de1745b..505e6c45 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
** TecCGraf - PUC-Rio
*/
-char *rcs_opcode="$Id: opcode.c,v 4.18 1997/07/29 13:35:06 roberto Exp roberto $";
+char *rcs_opcode="$Id: opcode.c,v 4.19 1997/07/29 21:11:10 roberto Exp roberto $";
#include <setjmp.h>
#include <stdio.h>
@@ -26,6 +26,9 @@ char *rcs_opcode="$Id: opcode.c,v 4.18 1997/07/29 13:35:06 roberto Exp roberto $
#define tostring(o) ((ttype(o) != LUA_T_STRING) && (lua_tostring(o) != 0))
+#define get_word(w,pc) {w=*pc+(*(pc+1)<<8); pc+=2;}
+
+
#define STACK_SIZE 128
#ifndef STACK_LIMIT
@@ -69,7 +72,7 @@ lua_LHFunction lua_linehook = NULL;
lua_CHFunction lua_callhook = NULL;
-static StkId lua_execute (Byte *pc, StkId base);
+static StkId lua_execute (TFunc *func, StkId base);
static void do_call (StkId base, int nResults);
@@ -169,7 +172,7 @@ static int lua_tostring (TObject *obj)
sprintf (s, "%d", i);
else
sprintf (s, "%g", nvalue(obj));
- tsvalue(obj) = lua_createstring(s);
+ tsvalue(obj) = luaI_createstring(s);
ttype(obj) = LUA_T_STRING;
return 0;
}
@@ -267,7 +270,8 @@ static void callHook (StkId base, lua_Type type, int isreturn)
{
TObject *f = stack+base-1;
if (type == LUA_T_MARK)
- (*lua_callhook)(Ref(f), f->value.tf->fileName, f->value.tf->lineDefined);
+ (*lua_callhook)(Ref(f), f->value.tf->fileName->str,
+ f->value.tf->lineDefined);
else
(*lua_callhook)(Ref(f), "(C)", -1);
}
@@ -324,7 +328,7 @@ static void do_call (StkId base, int nResults)
}
else if (ttype(func) == LUA_T_FUNCTION) {
ttype(func) = LUA_T_MARK;
- firstResult = lua_execute(func->value.tf->code, base);
+ firstResult = lua_execute(func->value.tf, base);
}
else { /* func is not a function */
/* Check the tag method for invalid functions */
@@ -630,14 +634,17 @@ int luaI_dorun (TFunc *tf)
int lua_domain (void)
{
- TFunc tf;
int status;
+ TFunc *tf = new(TFunc);
jmp_buf myErrorJmp;
jmp_buf *oldErr = errorJmp;
errorJmp = &myErrorJmp;
- luaI_initTFunc(&tf);
+ luaI_initTFunc(tf);
+ adjustC(1); /* one slot for the pseudo-function */
+ stack[CLS_current.base].ttype = LUA_T_FUNCTION;
+ stack[CLS_current.base].value.tf = tf;
if (setjmp(myErrorJmp) == 0) {
- lua_parse(&tf);
+ lua_parse(tf);
status = 0;
}
else {
@@ -645,9 +652,8 @@ int lua_domain (void)
status = 1;
}
if (status == 0)
- status = luaI_dorun(&tf);
+ status = do_protectedrun(MULT_RET);
errorJmp = oldErr;
- luaI_free(tf.code);
return status;
}
@@ -952,7 +958,7 @@ void lua_pushstring (char *s)
ttype(top) = LUA_T_NIL;
else
{
- tsvalue(top) = lua_createstring(s);
+ tsvalue(top) = luaI_createstring(s);
ttype(top) = LUA_T_STRING;
}
incr_top;
@@ -1088,7 +1094,7 @@ static void adjust_varargs (StkId first_extra_arg)
/* store counter in field "n" */ {
TObject index, extra;
ttype(&index) = LUA_T_STRING;
- tsvalue(&index) = lua_createstring("n");
+ tsvalue(&index) = luaI_createstring("n");
ttype(&extra) = LUA_T_NUMBER;
nvalue(&extra) = nvararg;
*(lua_hashdefine(avalue(&arg), &index)) = extra;
@@ -1104,8 +1110,9 @@ static void adjust_varargs (StkId first_extra_arg)
** [stack+base,top). Returns n such that the the results are between
** [stack+n,top).
*/
-static StkId lua_execute (Byte *pc, StkId base)
+static StkId lua_execute (TFunc *func, StkId base)
{
+ Byte *pc = func->code;
if (lua_callhook)
callHook (base, LUA_T_MARK, 0);
while (1)
@@ -1133,35 +1140,6 @@ static StkId lua_execute (Byte *pc, StkId base)
}
break;
- case PUSHFLOAT:
- {
- real num;
- get_float(num,pc);
- ttype(top) = LUA_T_NUMBER; nvalue(top) = num;
- incr_top;
- }
- break;
-
- case PUSHSTRING:
- {
- Word w;
- get_word(w,pc);
- ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
- incr_top;
- }
- break;
-
- case PUSHFUNCTION:
- {
- TFunc *f;
- get_code(f,pc);
- luaI_insertfunction(f); /* may take part in GC */
- top->ttype = LUA_T_FUNCTION;
- top->value.tf = f;
- incr_top;
- }
- break;
-
case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2:
case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5:
case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8:
@@ -1187,7 +1165,7 @@ static StkId lua_execute (Byte *pc, StkId base)
TObject receiver = *(top-1);
Word w;
get_word(w,pc);
- ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
+ *top = func->consts[w];
incr_top;
pushsubscript();
*top = receiver;
@@ -1195,6 +1173,20 @@ static StkId lua_execute (Byte *pc, StkId base)
break;
}
+ case PUSHCONSTANTB: {
+ *top = func->consts[*pc++];
+ incr_top;
+ break;
+ }
+
+ case PUSHCONSTANT: {
+ Word w;
+ get_word(w,pc);
+ *top = func->consts[w];
+ incr_top;
+ break;
+ }
+
case STORELOCAL0: case STORELOCAL1: case STORELOCAL2:
case STORELOCAL3: case STORELOCAL4: case STORELOCAL5:
case STORELOCAL6: case STORELOCAL7: case STORELOCAL8:
@@ -1241,22 +1233,6 @@ static StkId lua_execute (Byte *pc, StkId base)
}
break;
- case STORERECORD: /* opcode obsolete: supersed by STOREMAP */
- {
- int n = *(pc++);
- TObject *arr = top-n-1;
- while (n)
- {
- Word w;
- get_word(w,pc);
- ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
- *(lua_hashdefine (avalue(arr), top)) = *(top-1);
- top--;
- n--;
- }
- }
- break;
-
case STOREMAP: {
int n = *(pc++);
TObject *arr = top-(2*n)-1;
@@ -1382,7 +1358,7 @@ static StkId lua_execute (Byte *pc, StkId base)
if (tostring(l) || tostring(r))
call_binTM(IM_CONCAT, "unexpected type for concatenation");
else {
- tsvalue(l) = lua_createstring(lua_strconc(svalue(l),svalue(r)));
+ tsvalue(l) = luaI_createstring(lua_strconc(svalue(l),svalue(r)));
--top;
}
}
diff --git a/opcode.h b/opcode.h
index d4a73dce..386cec36 100644
--- a/opcode.h
+++ b/opcode.h
@@ -1,6 +1,6 @@
/*
** TeCGraf - PUC-Rio
-** $Id: opcode.h,v 3.35 1997/07/04 14:55:37 roberto Exp roberto $
+** $Id: opcode.h,v 3.36 1997/07/29 20:38:06 roberto Exp roberto $
*/
#ifndef opcode_h
@@ -47,9 +47,6 @@ PUSH1,/* - 1.0 */
PUSH2,/* - 2.0 */
PUSHBYTE,/* b - (float)b */
PUSHWORD,/* w - (float)w */
-PUSHFLOAT,/* f - f */
-PUSHSTRING,/* w - STR[w] */
-PUSHFUNCTION,/* p - FUN(p) */
PUSHLOCAL0,/* - LOC[0] */
PUSHLOCAL1,/* - LOC[1] */
PUSHLOCAL2,/* - LOC[2] */
@@ -111,6 +108,8 @@ RETCODE,/* b - - */
SETLINE,/* w - - LINE=w */
VARARGS,/* b v_b...v_1 {v_1...v_b;n=b} */
STOREMAP,/* b v_b k_b ...v_1 k_1 t - t[k_i]=v_i */
+PUSHCONSTANTB,/*b - const[b] */
+PUSHCONSTANT,/* w - const[w] */
ENDCODE = 127
} OpCode;
@@ -153,11 +152,6 @@ typedef struct TObject
#define s_fvalue(i) (fvalue(&s_object(i)))
#define s_uvalue(i) (uvalue(&s_object(i)))
-#define get_word(code,pc) {memcpy(&code, pc, sizeof(Word)); pc+=sizeof(Word);}
-#define get_float(code,pc){memcpy(&code, pc, sizeof(real)); pc+=sizeof(real);}
-#define get_code(code,pc) {memcpy(&code, pc, sizeof(TFunc *)); \
- pc+=sizeof(TFunc *);}
-
/* Exported functions */
void lua_parse (TFunc *tf); /* from "lua.stx" module */
diff --git a/table.c b/table.c
index 47ecd2e2..7420f68e 100644
--- a/table.c
+++ b/table.c
@@ -3,7 +3,7 @@
** Module to control static tables
*/
-char *rcs_table="$Id: table.c,v 2.72 1997/06/17 18:09:31 roberto Exp roberto $";
+char *rcs_table="$Id: table.c,v 2.73 1997/07/07 16:44:26 roberto Exp roberto $";
#include "luamem.h"
#include "auxlib.h"
@@ -24,14 +24,17 @@ Symbol *lua_table = NULL;
Word lua_ntable = 0;
static Long lua_maxsymbol = 0;
-TaggedString **lua_constant = NULL;
-Word lua_nconstant = 0;
-static Long lua_maxconstant = 0;
-
#define GARBAGE_BLOCK 100
+static TaggedString *luaI_createfixedstring (char *name)
+{
+ TaggedString *ts = luaI_createstring(name);
+ luaI_fixstring(ts);
+ return ts;
+}
+
void luaI_initsymbol (void)
{
lua_maxsymbol = BUFFER_BLOCK;
@@ -40,16 +43,11 @@ void luaI_initsymbol (void)
}
-/*
-** Initialise constant table with pre-defined constants
-*/
void luaI_initconstant (void)
{
- lua_maxconstant = BUFFER_BLOCK;
- lua_constant = newvector(lua_maxconstant, TaggedString *);
- /* pre-register mem error messages, to avoid loop when error arises */
- luaI_findconstantbyname(tableEM);
- luaI_findconstantbyname(memEM);
+ /* pre-register mem error messages, to avoid loop when error arises */
+ luaI_createfixedstring(tableEM);
+ luaI_createfixedstring(memEM);
}
@@ -79,35 +77,25 @@ Word luaI_findsymbolbyname (char *name)
}
-/*
-** Given a tree node, check it is has a correspondent constant index. If not,
-** allocate it.
-*/
-Word luaI_findconstant (TaggedString *t)
+void luaI_releasestring (TaggedString *t)
{
- if (t->u.s.constindex == NOT_USED)
- {
- if (lua_nconstant == lua_maxconstant)
- lua_maxconstant = growvector(&lua_constant, lua_maxconstant, TaggedString *,
- constantEM, MAX_WORD);
- t->u.s.constindex = lua_nconstant;
- lua_constant[lua_nconstant] = t;
- lua_nconstant++;
- }
- return t->u.s.constindex;
+ if (t->marked == 2) /* string has temporary mark? */
+ t->marked = 0;
}
-Word luaI_findconstantbyname (char *name)
+void luaI_fixstring (TaggedString *t)
{
- return luaI_findconstant(luaI_createfixedstring(name));
+ if (t->marked < 3)
+ t->marked = 3; /* avoid GC */
}
-TaggedString *luaI_createfixedstring (char *name)
+
+TaggedString *luaI_createtempstring (char *name)
{
- TaggedString *ts = lua_createstring(name);
+ TaggedString *ts = luaI_createstring(name);
if (!ts->marked)
- ts->marked = 2; /* avoid GC */
+ ts->marked = 2; /* avoid (temporarily) GC */
return ts;
}
@@ -131,9 +119,6 @@ static char *lua_travsymbol (int (*fn)(TObject *))
}
-/*
-** Mark an object if it is a string or a unmarked array.
-*/
int lua_markobject (TObject *o)
{/* if already marked, does not change mark value */
if (ttype(o) == LUA_T_USERDATA ||
@@ -143,7 +128,7 @@ int lua_markobject (TObject *o)
lua_hashmark (avalue(o));
else if ((o->ttype == LUA_T_FUNCTION || o->ttype == LUA_T_MARK)
&& !o->value.tf->marked)
- o->value.tf->marked = 1;
+ luaI_funcmark(o->value.tf);
return 0;
}
@@ -208,6 +193,7 @@ long lua_collectgarbage (long limit)
luaI_hashfree(freetable);
luaI_strfree(freestr);
luaI_funcfree(freefunc);
+/*printf("total %d coletados %d\n", (int)gc_nentity, (int)recovered);*/
return recovered;
}
diff --git a/table.h b/table.h
index 99d6fe91..93d549f9 100644
--- a/table.h
+++ b/table.h
@@ -1,7 +1,7 @@
/*
** Module to control static tables
** TeCGraf - PUC-Rio
-** $Id: table.h,v 2.24 1997/04/07 14:48:53 roberto Exp roberto $
+** $Id: table.h,v 2.25 1997/05/26 14:42:36 roberto Exp roberto $
*/
#ifndef table_h
@@ -19,18 +19,16 @@ typedef struct
extern Symbol *lua_table;
extern Word lua_ntable;
-extern TaggedString **lua_constant;
-extern Word lua_nconstant;
void luaI_initsymbol (void);
void luaI_initconstant (void);
Word luaI_findsymbolbyname (char *name);
Word luaI_findsymbol (TaggedString *t);
-Word luaI_findconstant (TaggedString *t);
-Word luaI_findconstantbyname (char *name);
int luaI_globaldefined (char *name);
void luaI_nextvar (void);
-TaggedString *luaI_createfixedstring (char *str);
+TaggedString *luaI_createtempstring (char *name);
+void luaI_releasestring (TaggedString *t);
+void luaI_fixstring (TaggedString *t);
int lua_markobject (TObject *o);
int luaI_ismarked (TObject *o);
void lua_pack (void);
diff --git a/tree.c b/tree.c
index 360d2159..aea613c3 100644
--- a/tree.c
+++ b/tree.c
@@ -3,7 +3,7 @@
** TecCGraf - PUC-Rio
*/
-char *rcs_tree="$Id: tree.c,v 1.27 1997/06/09 17:28:14 roberto Exp roberto $";
+char *rcs_tree="$Id: tree.c,v 1.28 1997/06/11 14:24:40 roberto Exp roberto $";
#include <string.h>
@@ -149,7 +149,7 @@ TaggedString *luaI_createudata (void *udata, int tag)
return insert(udata, tag, &string_root[(unsigned)udata%NUM_HASHS]);
}
-TaggedString *lua_createstring (char *str)
+TaggedString *luaI_createstring (char *str)
{
return insert(str, LUA_T_STRING, &string_root[(unsigned)str[0]%NUM_HASHS]);
}
diff --git a/tree.h b/tree.h
index 0b501918..c898bb20 100644
--- a/tree.h
+++ b/tree.h
@@ -1,7 +1,7 @@
/*
** tree.h
** TecCGraf - PUC-Rio
-** $Id: tree.h,v 1.17 1997/05/14 18:38:29 roberto Exp roberto $
+** $Id: tree.h,v 1.18 1997/06/09 17:28:14 roberto Exp roberto $
*/
#ifndef tree_h
@@ -19,7 +19,7 @@ typedef struct TaggedString
union {
struct {
Word varindex; /* != NOT_USED if this is a symbol */
- Word constindex; /* != NOT_USED if this is a constant */
+ Word constindex; /* hint to reuse constant indexes */
} s;
void *v; /* if this is a userdata, here is its value */
} u;
@@ -29,7 +29,7 @@ typedef struct TaggedString
} TaggedString;
-TaggedString *lua_createstring (char *str);
+TaggedString *luaI_createstring (char *str);
TaggedString *luaI_createudata (void *udata, int tag);
TaggedString *luaI_strcollector (long *cont);
void luaI_strfree (TaggedString *l);