new ttypes to distinguish between C closures and Lua closures.

This commit is contained in:
Roberto Ierusalimschy 1999-12-23 16:19:57 -02:00
parent be3212de78
commit b1b0c219f5
15 changed files with 180 additions and 147 deletions

81
lapi.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lapi.c,v 1.63 1999/12/06 12:03:45 roberto Exp roberto $ ** $Id: lapi.c,v 1.64 1999/12/14 18:31:20 roberto Exp roberto $
** Lua API ** Lua API
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -30,19 +30,13 @@ const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n"
lua_Type luaA_normalizedtype (const TObject *o) { const lua_Type luaA_normtype[] = { /* ORDER LUA_T */
int t = ttype(o); LUA_T_USERDATA, LUA_T_NUMBER, LUA_T_STRING, LUA_T_ARRAY,
switch (t) { LUA_T_LPROTO, LUA_T_CPROTO, LUA_T_NIL,
case LUA_T_PMARK: LUA_T_LCLOSURE, LUA_T_CCLOSURE,
return LUA_T_PROTO; LUA_T_LCLOSURE, LUA_T_CCLOSURE, /* LUA_T_LCLMARK, LUA_T_CCLMARK */
case LUA_T_CMARK: LUA_T_LPROTO, LUA_T_CPROTO /* LUA_T_LMARK, LUA_T_CMARK */
return LUA_T_CPROTO; };
case LUA_T_CLMARK:
return LUA_T_CLOSURE;
default:
return t;
}
}
void luaA_setnormalized (TObject *d, const TObject *s) { void luaA_setnormalized (TObject *d, const TObject *s) {
@ -52,7 +46,15 @@ void luaA_setnormalized (TObject *d, const TObject *s) {
const TObject *luaA_protovalue (const TObject *o) { const TObject *luaA_protovalue (const TObject *o) {
return (luaA_normalizedtype(o) == LUA_T_CLOSURE) ? protovalue(o) : o; switch (luaA_normalizedtype(o)) {
case LUA_T_CCLOSURE: case LUA_T_LCLOSURE:
return protovalue(o);
default:
LUA_ASSERT(L, luaA_normalizedtype(o) == LUA_T_LPROTO ||
luaA_normalizedtype(o) == LUA_T_CPROTO,
"invalid `function'");
return o;
}
} }
@ -228,26 +230,32 @@ int lua_isnumber (lua_State *L, lua_Object o) {
} }
int lua_isstring (lua_State *L, lua_Object o) { int lua_isstring (lua_State *L, lua_Object o) {
int t = lua_tag(L, o); UNUSED(L);
return (t == LUA_T_STRING) || (t == LUA_T_NUMBER); return (o != LUA_NOOBJECT && (ttype(o) == LUA_T_STRING ||
ttype(o) == LUA_T_NUMBER));
} }
int lua_isfunction (lua_State *L, lua_Object o) { int lua_isfunction (lua_State *L, lua_Object o) {
int t = lua_tag(L, o); return *lua_type(L, o) == 'f';
return (t == LUA_T_PROTO) || (t == LUA_T_CPROTO);
} }
int lua_equal(lua_State *L, lua_Object o1, lua_Object o2) { int lua_equal(lua_State *L, lua_Object o1, lua_Object o2) {
UNUSED(L); UNUSED(L);
if (o1 == LUA_NOOBJECT || o2 == LUA_NOOBJECT) return (o1 == o2); if (o1 == LUA_NOOBJECT || o2 == LUA_NOOBJECT)
else return luaO_equalObj(o1, o2); return (o1 == o2);
else {
TObject obj1, obj2;
luaA_setnormalized(&obj1, o1);
luaA_setnormalized(&obj2, o2);
return luaO_equalObj(&obj1, &obj2);
}
} }
double lua_getnumber (lua_State *L, lua_Object obj) { double lua_getnumber (lua_State *L, lua_Object obj) {
UNUSED(L); UNUSED(L);
if (obj == LUA_NOOBJECT) return 0.0; if (obj == LUA_NOOBJECT || tonumber(obj))
if (tonumber(obj)) return 0.0; return 0.0;
else return (nvalue(obj)); else return (nvalue(obj));
} }
@ -339,28 +347,11 @@ void lua_pushobject (lua_State *L, lua_Object o) {
int lua_tag (lua_State *L, lua_Object o) { int lua_tag (lua_State *L, lua_Object o) {
UNUSED(L); UNUSED(L);
if (o == LUA_NOOBJECT) if (o == LUA_NOOBJECT)
return LUA_T_NIL; return LUA_T_NIL;
else { else if (ttype(o) == LUA_T_USERDATA) /* to allow `old' tags (deprecated) */
int t; return o->value.ts->u.d.tag;
switch (t = ttype(o)) { else
case LUA_T_USERDATA: return luaT_effectivetag(o);
return o->value.ts->u.d.tag;
case LUA_T_ARRAY:
return o->value.a->htag;
case LUA_T_PMARK:
return LUA_T_PROTO;
case LUA_T_CMARK:
return LUA_T_CPROTO;
case LUA_T_CLOSURE: case LUA_T_CLMARK:
return o->value.cl->consts[0].ttype;
#ifdef DEBUG
case LUA_T_LINE:
LUA_INTERNALERROR(L, "invalid type");
#endif
default:
return t;
}
}
} }

8
lapi.h
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lapi.h,v 1.10 1999/12/02 16:24:45 roberto Exp roberto $ ** $Id: lapi.h,v 1.11 1999/12/14 18:33:29 roberto Exp roberto $
** Auxiliary functions from Lua API ** Auxiliary functions from Lua API
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -11,7 +11,11 @@
#include "lobject.h" #include "lobject.h"
lua_Type luaA_normalizedtype (const TObject *o); extern const lua_Type luaA_normtype[];
#define luaA_normalizedtype(o) (luaA_normtype[-ttype(o)])
void luaA_setnormalized (TObject *d, const TObject *s); void luaA_setnormalized (TObject *d, const TObject *s);
void luaA_checkCparams (lua_State *L, int nParams); void luaA_checkCparams (lua_State *L, int nParams);
const TObject *luaA_protovalue (const TObject *o); const TObject *luaA_protovalue (const TObject *o);

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lbuiltin.c,v 1.85 1999/12/14 18:42:57 roberto Exp roberto $ ** $Id: lbuiltin.c,v 1.86 1999/12/20 13:10:38 roberto Exp roberto $
** Built-in functions ** Built-in functions
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -377,10 +377,10 @@ void luaB_tostring (lua_State *L) {
case LUA_T_ARRAY: case LUA_T_ARRAY:
sprintf(buff, "table: %p", o->value.a); sprintf(buff, "table: %p", o->value.a);
break; break;
case LUA_T_CLOSURE: case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
sprintf(buff, "function: %p", o->value.cl); sprintf(buff, "function: %p", o->value.cl);
break; break;
case LUA_T_PROTO: case LUA_T_LPROTO:
sprintf(buff, "function: %p", o->value.tf); sprintf(buff, "function: %p", o->value.tf);
break; break;
case LUA_T_CPROTO: case LUA_T_CPROTO:

View File

@ -1,5 +1,5 @@
/* /*
** $Id: $ ** $Id: ldebug.c,v 1.1 1999/12/14 18:31:20 roberto Exp roberto $
** Debug Interface ** Debug Interface
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -42,10 +42,11 @@ int lua_setdebug (lua_State *L, int debug) {
lua_Function lua_stackedfunction (lua_State *L, int level) { lua_Function lua_stackedfunction (lua_State *L, int level) {
int i; int i;
for (i = (L->top-1)-L->stack; i>=0; i--) { for (i = (L->top-1)-L->stack; i>=0; i--) {
int t = L->stack[i].ttype; if (is_T_MARK(L->stack[i].ttype)) {
if (t == LUA_T_CLMARK || t == LUA_T_PMARK || t == LUA_T_CMARK) if (level == 0)
if (level-- == 0)
return L->stack+i; return L->stack+i;
level--;
}
} }
return LUA_NOOBJECT; return LUA_NOOBJECT;
} }
@ -53,8 +54,12 @@ lua_Function lua_stackedfunction (lua_State *L, int level) {
int lua_nups (lua_State *L, lua_Function f) { int lua_nups (lua_State *L, lua_Function f) {
UNUSED(L); UNUSED(L);
return (!f || luaA_normalizedtype(f) != LUA_T_CLOSURE) ? 0 : switch (luaA_normalizedtype(f)) {
f->value.cl->nelems; case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
return f->value.cl->nelems;
default:
return 0;
}
} }
@ -66,7 +71,7 @@ int lua_currentline (lua_State *L, lua_Function f) {
lua_Object lua_getlocal (lua_State *L, lua_Function f, int local_number, lua_Object lua_getlocal (lua_State *L, lua_Function f, int local_number,
const char **name) { const char **name) {
/* check whether `f' is a Lua function */ /* check whether `f' is a Lua function */
if (lua_tag(L, f) != LUA_T_PROTO) if (lua_tag(L, f) != LUA_T_LPROTO)
return LUA_NOOBJECT; return LUA_NOOBJECT;
else { else {
TProtoFunc *fp = luaA_protovalue(f)->value.tf; TProtoFunc *fp = luaA_protovalue(f)->value.tf;
@ -84,7 +89,7 @@ lua_Object lua_getlocal (lua_State *L, lua_Function f, int local_number,
int lua_setlocal (lua_State *L, lua_Function f, int local_number) { int lua_setlocal (lua_State *L, lua_Function f, int local_number) {
/* check whether `f' is a Lua function */ /* check whether `f' is a Lua function */
if (lua_tag(L, f) != LUA_T_PROTO) if (lua_tag(L, f) != LUA_T_LPROTO)
return 0; return 0;
else { else {
TProtoFunc *fp = luaA_protovalue(f)->value.tf; TProtoFunc *fp = luaA_protovalue(f)->value.tf;
@ -110,7 +115,7 @@ void lua_funcinfo (lua_State *L, lua_Object func,
lua_error(L, "API error - `funcinfo' called with a non-function value"); lua_error(L, "API error - `funcinfo' called with a non-function value");
else { else {
const TObject *f = luaA_protovalue(func); const TObject *f = luaA_protovalue(func);
if (luaA_normalizedtype(f) == LUA_T_PROTO) { if (luaA_normalizedtype(f) == LUA_T_LPROTO) {
*source = tfvalue(f)->source->str; *source = tfvalue(f)->source->str;
*linedefined = tfvalue(f)->lineDefined; *linedefined = tfvalue(f)->lineDefined;
} }

71
ldo.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: ldo.c,v 1.58 1999/12/06 12:03:45 roberto Exp roberto $ ** $Id: ldo.c,v 1.59 1999/12/21 18:04:41 roberto Exp roberto $
** Stack and Call structure of Lua ** Stack and Call structure of Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -93,7 +93,8 @@ void luaD_adjusttop (lua_State *L, StkId base, int extra) {
** Open a hole inside the stack at `pos' ** Open a hole inside the stack at `pos'
*/ */
void luaD_openstack (lua_State *L, StkId pos) { void luaD_openstack (lua_State *L, StkId pos) {
luaO_memup(pos+1, pos, (L->top-pos)*sizeof(TObject)); int i = L->top-pos;
while (i--) pos[i+1] = pos[i];
incr_top; incr_top;
} }
@ -122,15 +123,18 @@ static void luaD_callHook (lua_State *L, StkId func, lua_CHFunction callhook,
if (isreturn) if (isreturn)
callhook(L, LUA_NOOBJECT, "(return)", 0); callhook(L, LUA_NOOBJECT, "(return)", 0);
else { else {
if (ttype(func) == LUA_T_PROTO) switch (ttype(func)) {
callhook(L, func, tfvalue(func)->source->str, case LUA_T_LPROTO:
tfvalue(func)->lineDefined); callhook(L, func, tfvalue(func)->source->str,
else if (ttype(func) == LUA_T_CLOSURE && tfvalue(func)->lineDefined);
ttype(clvalue(func)->consts) == LUA_T_PROTO) break;
callhook(L, func, tfvalue(protovalue(func))->source->str, case LUA_T_LCLOSURE:
tfvalue(protovalue(func))->lineDefined); callhook(L, func, tfvalue(protovalue(func))->source->str,
else tfvalue(protovalue(func))->lineDefined);
callhook(L, func, "(C)", -1); break;
default:
callhook(L, func, "(C)", -1);
}
} }
L->allowhooks = 1; L->allowhooks = 1;
L->top = old_top; L->top = old_top;
@ -158,16 +162,16 @@ static StkId callC (lua_State *L, lua_CFunction f, StkId base) {
} }
static StkId callCclosure (lua_State *L, const struct Closure *cl, static StkId callCclosure (lua_State *L, const struct Closure *cl, StkId base) {
lua_CFunction f, StkId base) {
int nup = cl->nelems; /* number of upvalues */ int nup = cl->nelems; /* number of upvalues */
int n = L->top-base; /* number of arguments (to move up) */
luaD_checkstack(L, nup); luaD_checkstack(L, nup);
/* open space for upvalues as extra arguments */ /* open space for upvalues as extra arguments */
luaO_memup(base+nup, base, (L->top-base)*sizeof(TObject)); while (n--) *(base+nup+n) = *(base+n);
/* copy upvalues into stack */
memcpy(base, cl->consts+1, nup*sizeof(TObject));
L->top += nup; L->top += nup;
return callC(L, f, base); /* copy upvalues into stack */
while (nup--) *(base+nup) = cl->consts[nup+1];
return callC(L, fvalue(cl->consts), base);
} }
@ -197,17 +201,20 @@ void luaD_call (lua_State *L, StkId func, int nResults) {
ttype(func) = LUA_T_CMARK; ttype(func) = LUA_T_CMARK;
firstResult = callC(L, fvalue(func), func+1); firstResult = callC(L, fvalue(func), func+1);
break; break;
case LUA_T_PROTO: case LUA_T_LPROTO:
ttype(func) = LUA_T_PMARK; ttype(func) = LUA_T_LMARK;
firstResult = luaV_execute(L, NULL, tfvalue(func), func+1); firstResult = luaV_execute(L, NULL, tfvalue(func), func+1);
break; break;
case LUA_T_CLOSURE: { case LUA_T_LCLOSURE: {
Closure *c = clvalue(func); Closure *c = clvalue(func);
TObject *proto = c->consts; ttype(func) = LUA_T_LCLMARK;
ttype(func) = LUA_T_CLMARK; firstResult = luaV_execute(L, c, tfvalue(c->consts), func+1);
firstResult = (ttype(proto) == LUA_T_CPROTO) ? break;
callCclosure(L, c, fvalue(proto), func+1) : }
luaV_execute(L, c, tfvalue(proto), func+1); case LUA_T_CCLOSURE: {
Closure *c = clvalue(func);
ttype(func) = LUA_T_CCLMARK;
firstResult = callCclosure(L, c, func+1);
break; break;
} }
default: { /* `func' is not a function; check the `function' tag method */ default: { /* `func' is not a function; check the `function' tag method */
@ -226,16 +233,18 @@ void luaD_call (lua_State *L, StkId func, int nResults) {
nResults = L->top - firstResult; nResults = L->top - firstResult;
else else
luaD_adjusttop(L, firstResult, nResults); luaD_adjusttop(L, firstResult, nResults);
/* move results to func (to erase parameters and function) */ /* move results to `func' (to erase parameters and function) */
luaO_memdown(func, firstResult, nResults*sizeof(TObject)); while (nResults) {
L->top = func+nResults; *func++ = *(L->top - nResults);
nResults--;
}
L->top = func;
} }
static void message (lua_State *L, const char *s) { static void message (lua_State *L, const char *s) {
const TObject *em = &(luaS_assertglobalbyname(L, "_ERRORMESSAGE")->value); const TObject *em = &(luaS_assertglobalbyname(L, "_ERRORMESSAGE")->value);
if (ttype(em) == LUA_T_PROTO || ttype(em) == LUA_T_CPROTO || if (*luaO_typename(em) == 'f') {
ttype(em) == LUA_T_CLOSURE) {
*L->top = *em; *L->top = *em;
incr_top; incr_top;
lua_pushstring(L, s); lua_pushstring(L, s);
@ -313,7 +322,7 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) {
L->errorJmp = oldErr; L->errorJmp = oldErr;
if (status) return 1; /* error code */ if (status) return 1; /* error code */
if (tf == NULL) return 2; /* `natural' end */ if (tf == NULL) return 2; /* `natural' end */
L->top->ttype = LUA_T_PROTO; /* push new function on the stack */ L->top->ttype = LUA_T_LPROTO; /* push new function on the stack */
L->top->value.tf = tf; L->top->value.tf = tf;
incr_top; incr_top;
return 0; return 0;

7
lgc.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lgc.c,v 1.36 1999/12/14 18:31:20 roberto Exp roberto $ ** $Id: lgc.c,v 1.37 1999/12/21 18:04:41 roberto Exp roberto $
** Garbage Collector ** Garbage Collector
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -100,10 +100,11 @@ static int markobject (lua_State *L, TObject *o) {
case LUA_T_ARRAY: case LUA_T_ARRAY:
hashmark(L, avalue(o)); hashmark(L, avalue(o));
break; break;
case LUA_T_CLOSURE: case LUA_T_CLMARK: case LUA_T_LCLOSURE: case LUA_T_LCLMARK:
case LUA_T_CCLOSURE: case LUA_T_CCLMARK:
closuremark(L, o->value.cl); closuremark(L, o->value.cl);
break; break;
case LUA_T_PROTO: case LUA_T_PMARK: case LUA_T_LPROTO: case LUA_T_LMARK:
protomark(L, o->value.tf); protomark(L, o->value.tf);
break; break;
default: break; /* numbers, cprotos, etc */ default: break; /* numbers, cprotos, etc */

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lobject.c,v 1.26 1999/11/26 18:59:20 roberto Exp roberto $ ** $Id: lobject.c,v 1.27 1999/12/14 18:31:20 roberto Exp roberto $
** Some generic functions over Lua objects ** Some generic functions over Lua objects
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -14,8 +14,9 @@
const char *const luaO_typenames[] = { /* ORDER LUA_T */ const char *const luaO_typenames[] = { /* ORDER LUA_T */
"userdata", "number", "string", "table", "function", "function", "userdata", "number", "string", "table", "function", "function", "nil",
"nil", "function", "mark", "mark", "mark", "line", NULL "function", "function", "function", "function", "function", "function",
"line", NULL
}; };
@ -34,13 +35,20 @@ unsigned long luaO_power2 (unsigned long n) {
int luaO_equalval (const TObject *t1, const TObject *t2) { int luaO_equalval (const TObject *t1, const TObject *t2) {
switch (ttype(t1)) { switch (ttype(t1)) {
case LUA_T_NIL: return 1; case LUA_T_NIL:
case LUA_T_NUMBER: return nvalue(t1) == nvalue(t2); return 1;
case LUA_T_STRING: case LUA_T_USERDATA: return svalue(t1) == svalue(t2); case LUA_T_NUMBER:
case LUA_T_ARRAY: return avalue(t1) == avalue(t2); return nvalue(t1) == nvalue(t2);
case LUA_T_PROTO: return tfvalue(t1) == tfvalue(t2); case LUA_T_STRING: case LUA_T_USERDATA:
case LUA_T_CPROTO: return fvalue(t1) == fvalue(t2); return svalue(t1) == svalue(t2);
case LUA_T_CLOSURE: return t1->value.cl == t2->value.cl; case LUA_T_ARRAY:
return avalue(t1) == avalue(t2);
case LUA_T_LPROTO:
return tfvalue(t1) == tfvalue(t2);
case LUA_T_CPROTO:
return fvalue(t1) == fvalue(t2);
case LUA_T_CCLOSURE: case LUA_T_LCLOSURE:
return t1->value.cl == t2->value.cl;
default: default:
LUA_INTERNALERROR(L, "invalid type"); LUA_INTERNALERROR(L, "invalid type");
return 0; /* UNREACHABLE */ return 0; /* UNREACHABLE */

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lobject.h,v 1.39 1999/12/02 16:24:45 roberto Exp roberto $ ** $Id: lobject.h,v 1.40 1999/12/14 18:33:29 roberto Exp roberto $
** Type definitions for Lua objects ** Type definitions for Lua objects
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -69,25 +69,33 @@ typedef enum {
LUA_T_NUMBER = -1, /* fixed tag for numbers */ LUA_T_NUMBER = -1, /* fixed tag for numbers */
LUA_T_STRING = -2, /* fixed tag for strings */ LUA_T_STRING = -2, /* fixed tag for strings */
LUA_T_ARRAY = -3, /* tag default for tables (or arrays) */ LUA_T_ARRAY = -3, /* tag default for tables (or arrays) */
LUA_T_PROTO = -4, /* fixed tag for functions */ LUA_T_LPROTO = -4, /* fixed tag for Lua functions */
LUA_T_CPROTO = -5, /* fixed tag for Cfunctions */ LUA_T_CPROTO = -5, /* fixed tag for C functions */
LUA_T_NIL = -6, /* last "pre-defined" tag */ LUA_T_NIL = -6, /* last "pre-defined" tag */
LUA_T_CLOSURE = -7, LUA_T_LCLOSURE = -7, /* Lua closure */
LUA_T_CLMARK = -8, /* mark for closures */ LUA_T_CCLOSURE = -8, /* C closure */
LUA_T_PMARK = -9, /* mark for Lua prototypes */ LUA_T_LCLMARK = -9 ,/* mark for Lua closures */
LUA_T_CMARK = -10, /* mark for C prototypes */ LUA_T_CCLMARK = -10,/* mark for C closures */
LUA_T_LINE = -11 LUA_T_LMARK = -11, /* mark for Lua prototypes */
LUA_T_CMARK = -12, /* mark for C prototypes */
LUA_T_LINE = -13
} lua_Type; } lua_Type;
#define NUM_TAGS 7 #define NUM_TAGS 7
/*
** chech whether t is a mark; ttypes are negative numbers, so the
** comparisons look reversed. (ORDER LUA_T)
*/
#define is_T_MARK(t) (LUA_T_CMARK <= (t) && (t) <= LUA_T_LCLMARK)
typedef union { typedef union {
lua_CFunction f; /* LUA_T_CPROTO, LUA_T_CMARK */ lua_CFunction f; /* LUA_T_CPROTO, LUA_T_CMARK */
real n; /* LUA_T_NUMBER */ real n; /* LUA_T_NUMBER */
struct TaggedString *ts; /* LUA_T_STRING, LUA_T_USERDATA */ struct TaggedString *ts; /* LUA_T_STRING, LUA_T_USERDATA */
struct TProtoFunc *tf; /* LUA_T_PROTO, LUA_T_PMARK */ struct TProtoFunc *tf; /* LUA_T_LPROTO, LUA_T_LMARK */
struct Closure *cl; /* LUA_T_CLOSURE, LUA_T_CLMARK */ struct Closure *cl; /* LUA_T_[CL]CLOSURE, LUA_T_[CL]CLMARK */
struct Hash *a; /* LUA_T_ARRAY */ struct Hash *a; /* LUA_T_ARRAY */
int i; /* LUA_T_LINE */ int i; /* LUA_T_LINE */
} Value; } Value;

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lparser.c,v 1.48 1999/12/21 17:31:28 roberto Exp roberto $ ** $Id: lparser.c,v 1.49 1999/12/22 16:58:36 roberto Exp roberto $
** LL(1) Parser and code generator for Lua ** LL(1) Parser and code generator for Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -547,7 +547,7 @@ static void func_onstack (LexState *ls, FuncState *func) {
FuncState *fs = ls->fs; FuncState *fs = ls->fs;
int i; int i;
int c = next_constant(ls, fs->f); int c = next_constant(ls, fs->f);
ttype(&fs->f->consts[c]) = LUA_T_PROTO; ttype(&fs->f->consts[c]) = LUA_T_LPROTO;
fs->f->consts[c].value.tf = func->f; fs->f->consts[c].value.tf = func->f;
if (func->nupvalues == 0) if (func->nupvalues == 0)
code_constant(ls, c); code_constant(ls, c);
@ -580,7 +580,7 @@ static void init_state (LexState *ls, FuncState *fs, TaggedString *source) {
code_byte(ls, 0); /* to be filled with arg information */ code_byte(ls, 0); /* to be filled with arg information */
/* push function (to avoid GC) */ /* push function (to avoid GC) */
tfvalue(L->top) = f; tfvalue(L->top) = f;
ttype(L->top) = LUA_T_PROTO; ttype(L->top) = LUA_T_LPROTO;
incr_top; incr_top;
} }

11
lref.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lref.c,v 1.3 1999/11/22 13:12:07 roberto Exp roberto $ ** $Id: lref.c,v 1.4 1999/12/14 18:31:20 roberto Exp roberto $
** REF mechanism ** REF mechanism
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -85,15 +85,10 @@ static int ismarked (const TObject *o) {
return o->value.ts->marked; return o->value.ts->marked;
case LUA_T_ARRAY: case LUA_T_ARRAY:
return o->value.a->marked; return o->value.a->marked;
case LUA_T_CLOSURE: case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
return o->value.cl->marked; return o->value.cl->marked;
case LUA_T_PROTO: case LUA_T_LPROTO:
return o->value.tf->marked; return o->value.tf->marked;
#ifdef DEBUG
case LUA_T_LINE: case LUA_T_CLMARK:
case LUA_T_CMARK: case LUA_T_PMARK:
LUA_INTERNALERROR(L, "invalid type");
#endif
default: /* number or cproto */ default: /* number or cproto */
return 1; return 1;
} }

View File

@ -1,5 +1,5 @@
/* /*
** $Id: ltable.c,v 1.31 1999/11/26 18:59:20 roberto Exp roberto $ ** $Id: ltable.c,v 1.32 1999/12/07 12:05:34 roberto Exp roberto $
** Lua tables (hash) ** Lua tables (hash)
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -52,13 +52,13 @@ Node *luaH_mainposition (const Hash *t, const TObject *key) {
case LUA_T_ARRAY: case LUA_T_ARRAY:
h = IntPoint(L, avalue(key)); h = IntPoint(L, avalue(key));
break; break;
case LUA_T_PROTO: case LUA_T_LPROTO:
h = IntPoint(L, tfvalue(key)); h = IntPoint(L, tfvalue(key));
break; break;
case LUA_T_CPROTO: case LUA_T_CPROTO:
h = IntPoint(L, fvalue(key)); h = IntPoint(L, fvalue(key));
break; break;
case LUA_T_CLOSURE: case LUA_T_LCLOSURE: case LUA_T_CCLOSURE:
h = IntPoint(L, clvalue(key)); h = IntPoint(L, clvalue(key));
break; break;
default: default:

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lbuiltin.c,v 1.83 1999/12/07 12:05:34 roberto Exp $ ** $Id: ltests.c,v 1.1 1999/12/14 18:31:20 roberto Exp roberto $
** Internal Module for Debugging of the Lua Implementation ** Internal Module for Debugging of the Lua Implementation
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -17,6 +17,7 @@
#include "lstring.h" #include "lstring.h"
#include "ltable.h" #include "ltable.h"
#include "lua.h" #include "lua.h"
#include "luadebug.h"
void luaB_opentests (lua_State *L); void luaB_opentests (lua_State *L);
@ -195,6 +196,12 @@ static void testC (lua_State *L) {
else if EQ("rawsettable") { else if EQ("rawsettable") {
lua_rawsettable(L); lua_rawsettable(L);
} }
else if EQ("tag") {
lua_pushnumber(L, lua_tag(L, reg[getreg(L, &pc)]));
}
else if EQ("type") {
lua_pushstring(L, lua_type(L, reg[getreg(L, &pc)]));
}
else if EQ("nextvar") { else if EQ("nextvar") {
lua_pushstring(L, lua_nextvar(L, lua_getstring(L, reg[getreg(L, &pc)]))); lua_pushstring(L, lua_nextvar(L, lua_getstring(L, reg[getreg(L, &pc)])));
} }
@ -223,6 +230,10 @@ static void testC (lua_State *L) {
int n = getreg(L, &pc); int n = getreg(L, &pc);
lua_settagmethod(L, (int)lua_getnumber(L, reg[n]), getname(&pc)); lua_settagmethod(L, (int)lua_getnumber(L, reg[n]), getname(&pc));
} }
else if EQ("getfunc") {
int n = getreg(L, &pc);
reg[n] = lua_stackedfunction(L, getnum(&pc));
}
else if EQ("beginblock") { else if EQ("beginblock") {
lua_beginblock(L); lua_beginblock(L);
} }

26
ltm.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: ltm.c,v 1.28 1999/10/04 17:51:04 roberto Exp roberto $ ** $Id: ltm.c,v 1.29 1999/11/22 13:12:07 roberto Exp roberto $
** Tag methods ** Tag methods
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -42,7 +42,7 @@ static const char luaT_validevents[NUM_TAGS][IM_N] = {
{1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_NUMBER */ {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_NUMBER */
{1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_STRING */ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_STRING */
{0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_T_ARRAY */ {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_T_ARRAY */
{1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_PROTO */ {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_LPROTO */
{1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_CPROTO */ {1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_CPROTO */
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* LUA_T_NIL */ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* LUA_T_NIL */
}; };
@ -104,23 +104,21 @@ int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) {
int luaT_effectivetag (const TObject *o) { int luaT_effectivetag (const TObject *o) {
static const int realtag[] = { /* ORDER LUA_T */
LUA_T_USERDATA, LUA_T_NUMBER, LUA_T_STRING, LUA_T_ARRAY,
LUA_T_LPROTO, LUA_T_CPROTO, LUA_T_NIL,
LUA_T_LPROTO, LUA_T_CPROTO, /* LUA_T_LCLOSURE, LUA_T_CCLOSURE */
LUA_T_LPROTO, LUA_T_CPROTO, /* LUA_T_LCLMARK, LUA_T_CCLMARK */
LUA_T_LPROTO, LUA_T_CPROTO /* LUA_T_LMARK, LUA_T_CMARK */
};
int t; int t;
switch (t = ttype(o)) { switch (t = ttype(o)) {
case LUA_T_ARRAY:
return o->value.a->htag;
case LUA_T_USERDATA: { case LUA_T_USERDATA: {
int tag = o->value.ts->u.d.tag; int tag = o->value.ts->u.d.tag;
return (tag >= 0) ? LUA_T_USERDATA : tag; return (tag >= 0) ? LUA_T_USERDATA : tag; /* deprecated test */
} }
case LUA_T_CLOSURE: case LUA_T_ARRAY: return o->value.a->htag;
return o->value.cl->consts[0].ttype; default: return realtag[-t];
#ifdef DEBUG
case LUA_T_PMARK: case LUA_T_CMARK:
case LUA_T_CLMARK: case LUA_T_LINE:
LUA_INTERNALERROR(L, "invalid type");
#endif
default:
return t;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
** $Id: lundump.c,v 1.24 1999/12/02 18:45:03 lhf Exp $ ** $Id: lundump.c,v 1.16 1999/12/02 19:11:51 roberto Exp roberto $
** load bytecodes from files ** load bytecodes from files
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -135,7 +135,7 @@ static void LoadConstants (lua_State* L, TProtoFunc* tf, ZIO* Z, int native)
case LUA_T_STRING: case LUA_T_STRING:
tsvalue(o)=LoadTString(L,Z); tsvalue(o)=LoadTString(L,Z);
break; break;
case LUA_T_PROTO: case LUA_T_LPROTO:
tfvalue(o)=LoadFunction(L,Z,native); tfvalue(o)=LoadFunction(L,Z,native);
break; break;
case LUA_T_NIL: case LUA_T_NIL:

9
lvm.c
View File

@ -1,5 +1,5 @@
/* /*
** $Id: lvm.c,v 1.73 1999/12/14 18:31:20 roberto Exp roberto $ ** $Id: lvm.c,v 1.74 1999/12/21 18:04:41 roberto Exp roberto $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@ -86,8 +86,10 @@ void luaV_closure (lua_State *L, int nelems) {
Closure *c = luaF_newclosure(L, nelems); Closure *c = luaF_newclosure(L, nelems);
c->consts[0] = *(L->top-1); c->consts[0] = *(L->top-1);
L->top -= nelems; L->top -= nelems;
memcpy(&c->consts[1], L->top-1, nelems*sizeof(TObject)); while (nelems--)
ttype(L->top-1) = LUA_T_CLOSURE; c->consts[nelems+1] = *(L->top-1+nelems);
ttype(L->top-1) = (ttype(&c->consts[0]) == LUA_T_CPROTO) ?
LUA_T_CCLOSURE : LUA_T_LCLOSURE;
(L->top-1)->value.cl = c; (L->top-1)->value.cl = c;
} }
} }
@ -577,6 +579,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
*top++ = consts[aux]; *top++ = consts[aux];
L->top = top; L->top = top;
aux = *pc++; /* number of upvalues */ aux = *pc++; /* number of upvalues */
LUA_ASSERT(L, aux>0, "closure with no upvalues");
luaV_closure(L, aux); luaV_closure(L, aux);
luaC_checkGC(L); luaC_checkGC(L);
top -= aux; top -= aux;