aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-12-11 15:21:11 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-12-11 15:21:11 -0200
commit4daae2165d617e57ad1460471f8d902d38abac6e (patch)
tree84eb55fa794a864ac48b528a617d5293502190ea
parentcdd261f332c112b86eddd7438b9a06e1231e3e4c (diff)
downloadlua-4daae2165d617e57ad1460471f8d902d38abac6e.tar.gz
lua-4daae2165d617e57ad1460471f8d902d38abac6e.tar.bz2
lua-4daae2165d617e57ad1460471f8d902d38abac6e.zip
new API function and built-in "lua_copytagmethods"
-rw-r--r--lbuiltin.c10
-rw-r--r--ltm.c16
-rw-r--r--lua.h4
3 files changed, 26 insertions, 4 deletions
diff --git a/lbuiltin.c b/lbuiltin.c
index e48e1d5d..cae7a59c 100644
--- a/lbuiltin.c
+++ b/lbuiltin.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbuiltin.c,v 1.14 1997/12/01 20:30:44 roberto Exp roberto $ 2** $Id: lbuiltin.c,v 1.15 1997/12/09 13:35:19 roberto Exp roberto $
3** Built-in functions 3** Built-in functions
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -299,6 +299,13 @@ static void newtag (void)
299} 299}
300 300
301 301
302static void copytagmethods (void)
303{
304 lua_pushnumber(lua_copytagmethods(luaL_check_number(1),
305 luaL_check_number(2)));
306}
307
308
302static void rawgettable (void) 309static void rawgettable (void)
303{ 310{
304 lua_Object t = luaL_nonnullarg(1); 311 lua_Object t = luaL_nonnullarg(1);
@@ -431,6 +438,7 @@ static struct luaL_reg int_funcs[] = {
431 {"call", luaI_call}, 438 {"call", luaI_call},
432 {"collectgarbage", luaI_collectgarbage}, 439 {"collectgarbage", luaI_collectgarbage},
433 {"dofile", internaldofile}, 440 {"dofile", internaldofile},
441 {"copytagmethods", copytagmethods},
434 {"dostring", internaldostring}, 442 {"dostring", internaldostring},
435 {"error", luaI_error}, 443 {"error", luaI_error},
436 {"foreach", foreach}, 444 {"foreach", foreach},
diff --git a/ltm.c b/ltm.c
index ac2160ac..ff01f27a 100644
--- a/ltm.c
+++ b/ltm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltm.c,v 1.9 1997/11/19 18:16:33 roberto Exp roberto $ 2** $Id: ltm.c,v 1.10 1997/12/11 14:48:46 roberto Exp roberto $
3** Tag methods 3** Tag methods
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -46,7 +46,7 @@ static char validevents[NUM_TAGS][IM_N] = { /* ORDER LUA_T, ORDER IM */
46}; 46};
47 47
48 48
49static int validevent (lua_Type t, int e) 49static int validevent (int t, int e)
50{ /* ORDER LUA_T */ 50{ /* ORDER LUA_T */
51 return (t < LUA_T_NIL) ? 1 : validevents[-t][e]; 51 return (t < LUA_T_NIL) ? 1 : validevents[-t][e];
52} 52}
@@ -95,6 +95,18 @@ void luaT_realtag (int tag)
95} 95}
96 96
97 97
98int lua_copytagmethods (int tagto, int tagfrom)
99{
100 int e;
101 checktag(tagto);
102 checktag(tagfrom);
103 for (e=0; e<IM_N; e++) {
104 if (validevent(tagto, e))
105 *luaT_getim(tagto, e) = *luaT_getim(tagfrom, e);
106 }
107 return tagto;
108}
109
98 110
99int luaT_efectivetag (TObject *o) 111int luaT_efectivetag (TObject *o)
100{ 112{
diff --git a/lua.h b/lua.h
index a83826c9..049b1316 100644
--- a/lua.h
+++ b/lua.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.h,v 1.8 1997/12/01 20:31:25 roberto Exp roberto $ 2** $Id: lua.h,v 1.9 1997/12/09 13:35:19 roberto Exp roberto $
3** Lua - An Extensible Extension Language 3** Lua - An Extensible Extension Language
4** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil 4** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil
5** e-mail: lua@tecgraf.puc-rio.br 5** e-mail: lua@tecgraf.puc-rio.br
@@ -64,6 +64,7 @@ lua_Object lua_gettagmethod (int tag, char *event);
64lua_Object lua_seterrormethod (void); /* In: new method */ 64lua_Object lua_seterrormethod (void); /* In: new method */
65 65
66int lua_newtag (void); 66int lua_newtag (void);
67int lua_copytagmethods (int tagto, int tagfrom);
67void lua_settag (int tag); /* In: object */ 68void lua_settag (int tag); /* In: object */
68 69
69void lua_error (char *s); 70void lua_error (char *s);
@@ -139,6 +140,7 @@ long lua_collectgarbage (long limit);
139 140
140#define lua_pushcfunction(f) lua_pushCclosure(f, 0) 141#define lua_pushcfunction(f) lua_pushCclosure(f, 0)
141 142
143#define lua_clonetag(t) lua_copytagmethods(lua_newtag(), (t))
142 144
143 145
144/* ========================================================================== 146/* ==========================================================================