BIG CHANGE: functions have their own "constant table".

This commit is contained in:
Roberto Ierusalimschy 1997-07-30 19:00:50 -03:00
parent 1d7857bc63
commit 0892f0e5b7
12 changed files with 279 additions and 278 deletions

46
func.c
View File

@ -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)

10
func.h
View File

@ -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);

View File

@ -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);
}

View File

@ -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);

17
lex.c
View File

@ -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;
}
}

283
lua.stx
View File

@ -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)
{
check_space(sizeof(real));
memcpy(currState->f->code+currState->pc, &n, sizeof(real));
currState->pc += sizeof(real);
}
static void code_code (TFunc *tf)
{
check_space(sizeof(TFunc *));
memcpy(currState->f->code+currState->pc, &tf, sizeof(TFunc *));
currState->pc += sizeof(TFunc *);
}
static void code_word_at (int pc, int n)
{
Word w = n;
if (w != n)
yyerror("block too big");
memcpy(currState->f->code+pc, &w, sizeof(Word));
currState->f->code[pc] = n&0xFF;
currState->f->code[pc+1] = n>>8;
}
static void code_word (Word n)
static void code_word (int n)
{
check_space(sizeof(Word));
memcpy(currState->f->code+currState->pc, &n, sizeof(Word));
currState->pc += sizeof(Word);
code_byte(n&0xFF);
code_byte(n>>8);
}
static void code_constant (int c)
{
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_string (TaggedString *s)
{
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 */
}
;

View File

@ -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;
}
}

View File

@ -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 */

60
table.c
View File

@ -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;
}

10
table.h
View File

@ -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);

4
tree.c
View File

@ -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]);
}

6
tree.h
View File

@ -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);