mirror of
https://github.com/lua/lua
synced 2024-12-24 03:16:50 +03:00
default metatable can be NULL
This commit is contained in:
parent
1d10acb355
commit
af850484a9
19
lapi.c
19
lapi.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lapi.c,v 1.248 2003/10/20 12:25:23 roberto Exp roberto $
|
||||
** $Id: lapi.c,v 1.249 2003/10/20 17:42:41 roberto Exp roberto $
|
||||
** Lua API
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -555,7 +555,7 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) {
|
||||
mt = uvalue(obj)->uv.metatable;
|
||||
break;
|
||||
}
|
||||
if (mt == NULL || mt == hvalue(defaultmeta(L)))
|
||||
if (mt == NULL)
|
||||
res = 0;
|
||||
else {
|
||||
sethvalue(L->top, mt);
|
||||
@ -634,21 +634,26 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
|
||||
|
||||
|
||||
LUA_API int lua_setmetatable (lua_State *L, int objindex) {
|
||||
TObject *obj, *mt;
|
||||
TObject *obj;
|
||||
Table *mt;
|
||||
int res = 1;
|
||||
lua_lock(L);
|
||||
api_checknelems(L, 1);
|
||||
obj = luaA_index(L, objindex);
|
||||
api_checkvalidindex(L, obj);
|
||||
mt = (!ttisnil(L->top - 1)) ? L->top - 1 : defaultmeta(L);
|
||||
api_check(L, ttistable(mt));
|
||||
if (ttisnil(L->top - 1))
|
||||
mt = NULL;
|
||||
else {
|
||||
api_check(L, ttistable(L->top - 1));
|
||||
mt = hvalue(L->top - 1);
|
||||
}
|
||||
switch (ttype(obj)) {
|
||||
case LUA_TTABLE: {
|
||||
hvalue(obj)->metatable = hvalue(mt); /* write barrier */
|
||||
hvalue(obj)->metatable = mt; /* write barrier */
|
||||
break;
|
||||
}
|
||||
case LUA_TUSERDATA: {
|
||||
uvalue(obj)->uv.metatable = hvalue(mt); /* write barrier */
|
||||
uvalue(obj)->uv.metatable = mt; /* write barrier */
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
|
9
lgc.c
9
lgc.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lgc.c,v 1.180 2003/11/19 19:41:57 roberto Exp roberto $
|
||||
** $Id: lgc.c,v 1.181 2003/12/01 16:33:30 roberto Exp roberto $
|
||||
** Garbage Collector
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -114,8 +114,9 @@ static void reallymarkobject (global_State *g, GCObject *o) {
|
||||
return;
|
||||
}
|
||||
case LUA_TUSERDATA: {
|
||||
Table *mt = gcotou(o)->uv.metatable;
|
||||
white2black(o); /* userdata do not go to gray list */
|
||||
markobject(g, gcotou(o)->uv.metatable);
|
||||
if (mt) markobject(g, mt);
|
||||
return;
|
||||
}
|
||||
case LUA_TFUNCTION: {
|
||||
@ -191,7 +192,8 @@ static void traversetable (global_State *g, Table *h) {
|
||||
int weakkey = 0;
|
||||
int weakvalue = 0;
|
||||
const TObject *mode;
|
||||
markobject(g, h->metatable);
|
||||
if (h->metatable)
|
||||
markobject(g, h->metatable);
|
||||
lua_assert(h->lsizenode || h->node == g->dummynode);
|
||||
mode = gfasttm(g, h->metatable, TM_MODE);
|
||||
if (mode && ttisstring(mode)) { /* is there a weak mode? */
|
||||
@ -534,7 +536,6 @@ static void markroot (lua_State *L) {
|
||||
g->weak = NULL;
|
||||
makewhite(valtogco(g->mainthread));
|
||||
markobject(g, g->mainthread);
|
||||
markvalue(g, defaultmeta(L));
|
||||
markvalue(g, registry(L));
|
||||
if (L != g->mainthread) /* another thread is running? */
|
||||
markobject(g, L); /* cannot collect it */
|
||||
|
7
lstate.c
7
lstate.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lstate.c,v 1.128 2003/11/18 14:55:11 roberto Exp roberto $
|
||||
** $Id: lstate.c,v 1.129 2003/12/01 16:33:30 roberto Exp roberto $
|
||||
** Global State
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -76,10 +76,6 @@ static void freestack (lua_State *L, lua_State *L1) {
|
||||
static void f_luaopen (lua_State *L, void *ud) {
|
||||
UNUSED(ud);
|
||||
stack_init(L, L); /* init stack */
|
||||
/* create default meta table with a dummy table, and then close the loop */
|
||||
defaultmeta(L)->tt = LUA_TTABLE;
|
||||
sethvalue(defaultmeta(L), luaH_new(L, 0, 0));
|
||||
hvalue(defaultmeta(L))->metatable = hvalue(defaultmeta(L));
|
||||
sethvalue(gt(L), luaH_new(L, 0, 4)); /* table of globals */
|
||||
sethvalue(registry(L), luaH_new(L, 4, 4)); /* registry */
|
||||
luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */
|
||||
@ -161,7 +157,6 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
|
||||
g->strt.size = 0;
|
||||
g->strt.nuse = 0;
|
||||
g->strt.hash = NULL;
|
||||
setnilvalue(defaultmeta(L));
|
||||
setnilvalue(registry(L));
|
||||
luaZ_initbuffer(L, &g->buff);
|
||||
g->panic = NULL;
|
||||
|
6
lstate.h
6
lstate.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lstate.h,v 1.113 2003/11/18 14:55:11 roberto Exp roberto $
|
||||
** $Id: lstate.h,v 1.114 2003/12/01 16:33:30 roberto Exp roberto $
|
||||
** Global State
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -42,9 +42,6 @@
|
||||
struct lua_longjmp; /* defined in ldo.c */
|
||||
|
||||
|
||||
/* default meta table (both for tables and udata) */
|
||||
#define defaultmeta(L) (&G(L)->_defaultmeta)
|
||||
|
||||
/* table of globals */
|
||||
#define gt(L) (&L->_gt)
|
||||
|
||||
@ -113,7 +110,6 @@ typedef struct global_State {
|
||||
lu_mem nblocks; /* number of `bytes' currently allocated */
|
||||
lua_CFunction panic; /* to be called in unprotected errors */
|
||||
TObject _registry;
|
||||
TObject _defaultmeta;
|
||||
struct lua_State *mainthread;
|
||||
Node dummynode[1]; /* common node array for all empty tables */
|
||||
TString *tmname[TM_N]; /* array with tag-method names */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: lstring.c,v 1.79 2003/04/28 19:26:16 roberto Exp roberto $
|
||||
** $Id: lstring.c,v 1.80 2003/11/17 19:50:05 roberto Exp roberto $
|
||||
** String table (keeps all strings handled by Lua)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -94,7 +94,7 @@ Udata *luaS_newudata (lua_State *L, size_t s) {
|
||||
u->uv.marked = 0; /* is not finalized */
|
||||
u->uv.tt = LUA_TUSERDATA;
|
||||
u->uv.len = s;
|
||||
u->uv.metatable = hvalue(defaultmeta(L));
|
||||
u->uv.metatable = NULL;
|
||||
/* chain it on udata list */
|
||||
u->uv.next = G(L)->rootudata;
|
||||
G(L)->rootudata = valtogco(u);
|
||||
|
4
ltable.c
4
ltable.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltable.c,v 1.135 2003/08/26 12:04:13 roberto Exp roberto $
|
||||
** $Id: ltable.c,v 1.136 2003/11/27 18:05:14 roberto Exp roberto $
|
||||
** Lua tables (hash)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -328,7 +328,7 @@ static void rehash (lua_State *L, Table *t) {
|
||||
Table *luaH_new (lua_State *L, int narray, int lnhash) {
|
||||
Table *t = luaM_new(L, Table);
|
||||
luaC_link(L, valtogco(t), LUA_TTABLE);
|
||||
t->metatable = hvalue(defaultmeta(L));
|
||||
t->metatable = NULL;
|
||||
t->flags = cast(lu_byte, ~0);
|
||||
/* temporary values (kept only if some malloc fails) */
|
||||
t->array = NULL;
|
||||
|
13
ltm.c
13
ltm.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltm.c,v 1.105 2002/12/04 17:38:31 roberto Exp roberto $
|
||||
** $Id: ltm.c,v 1.106 2003/04/03 13:35:34 roberto Exp roberto $
|
||||
** Tag methods
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -57,14 +57,17 @@ const TObject *luaT_gettm (Table *events, TMS event, TString *ename) {
|
||||
|
||||
|
||||
const TObject *luaT_gettmbyobj (lua_State *L, const TObject *o, TMS event) {
|
||||
TString *ename = G(L)->tmname[event];
|
||||
Table *mt;
|
||||
switch (ttype(o)) {
|
||||
case LUA_TTABLE:
|
||||
return luaH_getstr(hvalue(o)->metatable, ename);
|
||||
mt = hvalue(o)->metatable;
|
||||
break;
|
||||
case LUA_TUSERDATA:
|
||||
return luaH_getstr(uvalue(o)->uv.metatable, ename);
|
||||
mt = uvalue(o)->uv.metatable;
|
||||
break;
|
||||
default:
|
||||
return &luaO_nilobject;
|
||||
mt = NULL;
|
||||
}
|
||||
return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : &luaO_nilobject);
|
||||
}
|
||||
|
||||
|
6
ltm.h
6
ltm.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltm.h,v 1.40 2002/09/19 20:12:47 roberto Exp roberto $
|
||||
** $Id: ltm.h,v 1.41 2002/11/14 11:51:50 roberto Exp roberto $
|
||||
** Tag methods
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@ -36,8 +36,8 @@ typedef enum {
|
||||
|
||||
|
||||
|
||||
#define gfasttm(g,et,e) \
|
||||
(((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
|
||||
#define gfasttm(g,et,e) ((et) == NULL ? NULL : \
|
||||
((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e]))
|
||||
|
||||
#define fasttm(l,et,e) gfasttm(G(l), et, e)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user