aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-04-02 19:52:42 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-04-02 19:52:42 -0300
commit27d95f18803aded238eaa8adaf7f2a3ee6966fd3 (patch)
tree7b20dbfac6b14aa2ca112bee48aac22c47db78dc
parentf0d523887d28c569e931eacbe1078599750cd5b7 (diff)
downloadlua-27d95f18803aded238eaa8adaf7f2a3ee6966fd3.tar.gz
lua-27d95f18803aded238eaa8adaf7f2a3ee6966fd3.tar.bz2
lua-27d95f18803aded238eaa8adaf7f2a3ee6966fd3.zip
"newtag" does not need a type name.
-rw-r--r--fallback.c59
-rw-r--r--fallback.h5
-rw-r--r--lua.h4
-rw-r--r--opcode.c6
4 files changed, 25 insertions, 49 deletions
diff --git a/fallback.c b/fallback.c
index 2e40f973..c86d04cd 100644
--- a/fallback.c
+++ b/fallback.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_fallback="$Id: fallback.c,v 1.35 1997/03/31 14:17:09 roberto Exp roberto $"; 6char *rcs_fallback="$Id: fallback.c,v 1.36 1997/03/31 20:59:09 roberto Exp roberto $";
7 7
8#include <stdio.h> 8#include <stdio.h>
9#include <string.h> 9#include <string.h>
@@ -18,21 +18,6 @@ char *rcs_fallback="$Id: fallback.c,v 1.35 1997/03/31 14:17:09 roberto Exp rober
18#include "hash.h" 18#include "hash.h"
19 19
20 20
21static char *typenames[] = { /* ORDER LUA_T */
22 "userdata", "line", "cmark", "mark", "function",
23 "function", "table", "string", "number", "nil",
24 NULL
25};
26
27
28void luaI_type (void)
29{
30 lua_Object o = lua_getparam(1);
31 luaL_arg_check(o != LUA_NOOBJECT, "type", 1, "no argument");
32 lua_pushstring(typenames[-ttype(luaI_Address(o))]);
33 lua_pushnumber(lua_tag(o));
34}
35
36 21
37/* ------------------------------------------- 22/* -------------------------------------------
38** Reference routines 23** Reference routines
@@ -136,7 +121,6 @@ static int luaI_checkevent (char *name, char *list[])
136 121
137 122
138static struct IM { 123static struct IM {
139 lua_Type tp;
140 TObject int_method[IM_N]; 124 TObject int_method[IM_N];
141} *luaI_IMtable = NULL; 125} *luaI_IMtable = NULL;
142 126
@@ -157,7 +141,7 @@ static char validevents[NUM_TYPES][IM_N] = { /* ORDER LUA_T, ORDER IM */
157}; 141};
158 142
159static int validevent (lua_Type t, int e) 143static int validevent (lua_Type t, int e)
160{ 144{ /* ORDER LUA_T */
161 return (t < LUA_T_NIL) ? 1 : validevents[-t][e]; 145 return (t < LUA_T_NIL) ? 1 : validevents[-t][e];
162} 146}
163 147
@@ -175,27 +159,19 @@ void luaI_initfallbacks (void)
175 int i; 159 int i;
176 IMtable_size = NUM_TYPES+10; 160 IMtable_size = NUM_TYPES+10;
177 luaI_IMtable = newvector(IMtable_size, struct IM); 161 luaI_IMtable = newvector(IMtable_size, struct IM);
178 for (i=LUA_T_NIL; i<=LUA_T_USERDATA; i++) { 162 for (i=LUA_T_NIL; i<=LUA_T_USERDATA; i++)
179 luaI_IMtable[-i].tp = (lua_Type)i;
180 init_entry(i); 163 init_entry(i);
181 }
182 } 164 }
183} 165}
184 166
185int lua_newtag (char *t) 167int lua_newtag (void)
186{ 168{
187 int tp;
188 --last_tag; 169 --last_tag;
189 if ((-last_tag) >= IMtable_size) { 170 if ((-last_tag) >= IMtable_size) {
190 luaI_initfallbacks(); 171 luaI_initfallbacks();
191 IMtable_size = growvector(&luaI_IMtable, IMtable_size, 172 IMtable_size = growvector(&luaI_IMtable, IMtable_size,
192 struct IM, memEM, MAX_INT); 173 struct IM, memEM, MAX_INT);
193 } 174 }
194 tp = -findstring(t, typenames);
195 if (tp == LUA_T_ARRAY || tp == LUA_T_USERDATA)
196 luaI_IMtable[-last_tag].tp = tp;
197 else
198 lua_error("invalid type for new tag");
199 init_entry(last_tag); 175 init_entry(last_tag);
200 return last_tag; 176 return last_tag;
201} 177}
@@ -203,27 +179,28 @@ int lua_newtag (char *t)
203 179
204static void checktag (int tag) 180static void checktag (int tag)
205{ 181{
206 if (!(last_tag <= (tag) && (tag) <= 0)) 182 if (!(last_tag <= tag && tag <= 0))
207 lua_error("invalid tag"); 183 lua_error("invalid tag");
208} 184}
209 185
210lua_Type luaI_typetag (int tag) 186int luaI_userdatatag (int tag)
211{ 187{
212 if (tag >= 0) return LUA_T_USERDATA; 188 return (tag >= 0 || (last_tag <= tag && tag < LUA_T_NIL));
213 else {
214 checktag(tag);
215 return luaI_IMtable[-tag].tp;
216 }
217} 189}
218 190
191
219void luaI_settag (int tag, TObject *o) 192void luaI_settag (int tag, TObject *o)
220{ 193{
221 if (ttype(o) != luaI_typetag(tag)) 194 switch (ttype(o)) {
222 lua_error("Tag is not compatible with this type"); 195 case LUA_T_ARRAY:
223 if (o->ttype == LUA_T_ARRAY) 196 o->value.a->htag = tag;
224 o->value.a->htag = tag; 197 break;
225 else /* must be userdata */ 198 case LUA_T_USERDATA:
226 o->value.ts->tag = tag; 199 o->value.ts->tag = tag;
200 break;
201 default:
202 lua_error("settag: cannot change tag of given object");
203 }
227} 204}
228 205
229 206
diff --git a/fallback.h b/fallback.h
index be54006c..44341ca4 100644
--- a/fallback.h
+++ b/fallback.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: fallback.h,v 1.18 1997/03/31 14:02:58 roberto Exp roberto $ 2** $Id: fallback.h,v 1.19 1997/03/31 20:59:09 roberto Exp roberto $
3*/ 3*/
4 4
5#ifndef fallback_h 5#ifndef fallback_h
@@ -45,9 +45,8 @@ void luaI_travlock (int (*fn)(TObject *));
45void luaI_invalidaterefs (void); 45void luaI_invalidaterefs (void);
46char *luaI_travfallbacks (int (*fn)(TObject *)); 46char *luaI_travfallbacks (int (*fn)(TObject *));
47 47
48void luaI_type (void);
49void luaI_settag (int tag, TObject *o); 48void luaI_settag (int tag, TObject *o);
50lua_Type luaI_typetag (int tag); 49int luaI_userdatatag (int tag);
51TObject *luaI_getim (int tag, IMS event); 50TObject *luaI_getim (int tag, IMS event);
52#define luaI_getimbyObj(o,e) (luaI_getim(luaI_tag(o),(e))) 51#define luaI_getimbyObj(o,e) (luaI_getim(luaI_tag(o),(e)))
53TObject *luaI_geterrorim (void); 52TObject *luaI_geterrorim (void);
diff --git a/lua.h b/lua.h
index 910ac158..bcc8213e 100644
--- a/lua.h
+++ b/lua.h
@@ -2,7 +2,7 @@
2** LUA - Linguagem para Usuarios de Aplicacao 2** LUA - Linguagem para Usuarios de Aplicacao
3** Grupo de Tecnologia em Computacao Grafica 3** Grupo de Tecnologia em Computacao Grafica
4** TeCGraf - PUC-Rio 4** TeCGraf - PUC-Rio
5** $Id: lua.h,v 3.39 1997/04/01 19:02:43 roberto Exp roberto $ 5** $Id: lua.h,v 3.40 1997/04/02 17:44:18 roberto Exp roberto $
6*/ 6*/
7 7
8 8
@@ -23,7 +23,7 @@ lua_Object lua_setfallback (char *event, lua_CFunction fallback);
23void lua_setintmethod (int tag, char *event, lua_CFunction method); 23void lua_setintmethod (int tag, char *event, lua_CFunction method);
24void lua_seterrormethod (lua_CFunction method); 24void lua_seterrormethod (lua_CFunction method);
25 25
26int lua_newtag (char *t); 26int lua_newtag (void);
27void lua_settag (int tag); /* In: object */ 27void lua_settag (int tag); /* In: object */
28 28
29void lua_error (char *s); 29void lua_error (char *s);
diff --git a/opcode.c b/opcode.c
index be2be6a3..5bbfe609 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 3.90 1997/04/01 19:02:43 roberto Exp roberto $"; 6char *rcs_opcode="$Id: opcode.c,v 3.91 1997/04/02 17:44:18 roberto Exp roberto $";
7 7
8#include <setjmp.h> 8#include <setjmp.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -987,6 +987,8 @@ void lua_pushbinarydata (void *buff, int size, int tag)
987 if (buff == NULL) 987 if (buff == NULL)
988 ttype(top) = LUA_T_NIL; 988 ttype(top) = LUA_T_NIL;
989 else { 989 else {
990 if (!luaI_userdatatag(tag))
991 lua_error("invalid tag for userdata");
990 tsvalue(top) = luaI_createuserdata(buff, size, tag); 992 tsvalue(top) = luaI_createuserdata(buff, size, tag);
991 ttype(top) = LUA_T_USERDATA; 993 ttype(top) = LUA_T_USERDATA;
992 } 994 }
@@ -998,8 +1000,6 @@ void lua_pushbinarydata (void *buff, int size, int tag)
998*/ 1000*/
999void lua_pushusertag (void *u, int tag) 1001void lua_pushusertag (void *u, int tag)
1000{ 1002{
1001 if (luaI_typetag(tag) != LUA_T_USERDATA)
1002 lua_error("invalid tag in `lua_pushusertag'");
1003 lua_pushbinarydata(&u, sizeof(void *), tag); 1003 lua_pushbinarydata(&u, sizeof(void *), tag);
1004} 1004}
1005 1005