aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-04-24 19:59:57 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-04-24 19:59:57 -0300
commit369dd65318488ca888fc76c5667be3a713257aa6 (patch)
treebb9e5d6abc397d44b1e9bf8b3d21bcf663fe4f5e
parent209602ac31512c9f201d11edca6fe7aa368b85a4 (diff)
downloadlua-369dd65318488ca888fc76c5667be3a713257aa6.tar.gz
lua-369dd65318488ca888fc76c5667be3a713257aa6.tar.bz2
lua-369dd65318488ca888fc76c5667be3a713257aa6.zip
small optimization in the access to i.m. table.
-rw-r--r--fallback.c44
-rw-r--r--fallback.h13
-rw-r--r--opcode.c32
3 files changed, 49 insertions, 40 deletions
diff --git a/fallback.c b/fallback.c
index 12c4509d..834e2dcd 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 2.3 1997/04/06 14:08:08 roberto Exp roberto $"; 6char *rcs_fallback="$Id: fallback.c,v 2.4 1997/04/07 14:48:53 roberto Exp roberto $";
7 7
8#include <stdio.h> 8#include <stdio.h>
9#include <string.h> 9#include <string.h>
@@ -111,9 +111,7 @@ static int luaI_checkevent (char *name, char *list[])
111} 111}
112 112
113 113
114static struct IM { 114struct IM *luaI_IMtable = NULL;
115 TObject int_method[IM_N];
116} *luaI_IMtable = NULL;
117 115
118static int IMtable_size = 0; 116static int IMtable_size = 0;
119static int last_tag = LUA_T_NIL; /* ORDER LUA_T */ 117static int last_tag = LUA_T_NIL; /* ORDER LUA_T */
@@ -141,7 +139,7 @@ static void init_entry (int tag)
141{ 139{
142 int i; 140 int i;
143 for (i=0; i<IM_N; i++) 141 for (i=0; i<IM_N; i++)
144 luaI_IMtable[-tag].int_method[i].ttype = LUA_T_NIL; 142 ttype(luaI_getim(tag, i)) = LUA_T_NIL;
145} 143}
146 144
147void luaI_initfallbacks (void) 145void luaI_initfallbacks (void)
@@ -194,32 +192,26 @@ void luaI_settag (int tag, TObject *o)
194} 192}
195 193
196 194
197int luaI_tag (TObject *o) 195int luaI_efectivetag (TObject *o)
198{ 196{
199 lua_Type t = ttype(o); 197 lua_Type t = ttype(o);
200 if (t == LUA_T_USERDATA) 198 if (t == LUA_T_USERDATA) {
201 return o->value.ts->tag; 199 int tag = o->value.ts->tag;
200 return (tag >= 0) ? LUA_T_USERDATA : tag;
201 }
202 else if (t == LUA_T_ARRAY) 202 else if (t == LUA_T_ARRAY)
203 return o->value.a->htag; 203 return o->value.a->htag;
204 else return t; 204 else return t;
205} 205}
206 206
207 207
208TObject *luaI_getim (int tag, IMS event)
209{
210 if (tag > LUA_T_USERDATA)
211 tag = LUA_T_USERDATA; /* default for non-registered tags */
212 return &luaI_IMtable[-tag].int_method[event];
213}
214
215
216void luaI_gettagmethod (void) 208void luaI_gettagmethod (void)
217{ 209{
218 int t = (int)luaL_check_number(1); 210 int t = (int)luaL_check_number(1);
219 int e = luaI_checkevent(luaL_check_string(2), luaI_eventname); 211 int e = luaI_checkevent(luaL_check_string(2), luaI_eventname);
220 checktag(t); 212 checktag(t);
221 if (validevent(t, e)) 213 if (validevent(t, e))
222 luaI_pushobject(&luaI_IMtable[-t].int_method[e]); 214 luaI_pushobject(luaI_getim(t,e));
223} 215}
224 216
225 217
@@ -234,8 +226,8 @@ void luaI_settagmethod (void)
234 luaI_eventname[e], t); 226 luaI_eventname[e], t);
235 luaL_arg_check(lua_isnil(func) || lua_isfunction(func), 227 luaL_arg_check(lua_isnil(func) || lua_isfunction(func),
236 3, "function expected"); 228 3, "function expected");
237 luaI_pushobject(&luaI_IMtable[-t].int_method[e]); 229 luaI_pushobject(luaI_getim(t,e));
238 luaI_IMtable[-t].int_method[e] = *luaI_Address(func); 230 *luaI_getim(t, e) = *luaI_Address(func);
239} 231}
240 232
241 233
@@ -264,7 +256,7 @@ char *luaI_travfallbacks (int (*fn)(TObject *))
264 for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */ 256 for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */
265 int t; 257 int t;
266 for (t=0; t>=last_tag; t--) 258 for (t=0; t>=last_tag; t--)
267 if (fn(&luaI_IMtable[-t].int_method[e])) 259 if (fn(luaI_getim(t,e)))
268 return luaI_eventname[e]; 260 return luaI_eventname[e];
269 } 261 }
270 return NULL; 262 return NULL;
@@ -301,7 +293,7 @@ static void fillvalids (IMS e, TObject *func)
301 int t; 293 int t;
302 for (t=LUA_T_NIL; t<=LUA_T_USERDATA; t++) 294 for (t=LUA_T_NIL; t<=LUA_T_USERDATA; t++)
303 if (validevent(t, e)) 295 if (validevent(t, e))
304 luaI_IMtable[-t].int_method[e] = *func; 296 *luaI_getim(t, e) = *func;
305} 297}
306 298
307void luaI_setfallback (void) 299void luaI_setfallback (void)
@@ -320,13 +312,13 @@ void luaI_setfallback (void)
320 replace = errorFB; 312 replace = errorFB;
321 break; 313 break;
322 case 1: /* old getglobal fallback */ 314 case 1: /* old getglobal fallback */
323 oldfunc = luaI_IMtable[-LUA_T_NIL].int_method[IM_GETGLOBAL]; 315 oldfunc = *luaI_getim(LUA_T_NIL, IM_GETGLOBAL);
324 luaI_IMtable[-LUA_T_NIL].int_method[IM_GETGLOBAL] = *luaI_Address(func); 316 *luaI_getim(LUA_T_NIL, IM_GETGLOBAL) = *luaI_Address(func);
325 replace = nilFB; 317 replace = nilFB;
326 break; 318 break;
327 case 2: { /* old arith fallback */ 319 case 2: { /* old arith fallback */
328 int i; 320 int i;
329 oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[IM_POW]; 321 oldfunc = *luaI_getim(LUA_T_USERDATA, IM_POW);
330 for (i=IM_ADD; i<=IM_UNM; i++) /* ORDER IM */ 322 for (i=IM_ADD; i<=IM_UNM; i++) /* ORDER IM */
331 fillvalids(i, luaI_Address(func)); 323 fillvalids(i, luaI_Address(func));
332 replace = typeFB; 324 replace = typeFB;
@@ -334,7 +326,7 @@ void luaI_setfallback (void)
334 } 326 }
335 case 3: { /* old order fallback */ 327 case 3: { /* old order fallback */
336 int i; 328 int i;
337 oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[IM_LT]; 329 oldfunc = *luaI_getim(LUA_T_USERDATA, IM_LT);
338 for (i=IM_LT; i<=IM_GE; i++) /* ORDER IM */ 330 for (i=IM_LT; i<=IM_GE; i++) /* ORDER IM */
339 fillvalids(i, luaI_Address(func)); 331 fillvalids(i, luaI_Address(func));
340 replace = typeFB; 332 replace = typeFB;
@@ -343,7 +335,7 @@ void luaI_setfallback (void)
343 default: { 335 default: {
344 int e; 336 int e;
345 if ((e = luaI_findstring(name, luaI_eventname)) >= 0) { 337 if ((e = luaI_findstring(name, luaI_eventname)) >= 0) {
346 oldfunc = luaI_IMtable[-LUA_T_USERDATA].int_method[e]; 338 oldfunc = *luaI_getim(LUA_T_USERDATA, e);
347 fillvalids(e, luaI_Address(func)); 339 fillvalids(e, luaI_Address(func));
348 replace = (e == IM_GC || e == IM_INDEX) ? nilFB : typeFB; 340 replace = (e == IM_GC || e == IM_INDEX) ? nilFB : typeFB;
349 } 341 }
diff --git a/fallback.h b/fallback.h
index 00d23625..12c82702 100644
--- a/fallback.h
+++ b/fallback.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: fallback.h,v 1.21 1997/04/02 23:04:12 roberto Exp roberto $ 2** $Id: fallback.h,v 1.22 1997/04/04 22:24:51 roberto Exp roberto $
3*/ 3*/
4 4
5#ifndef fallback_h 5#ifndef fallback_h
@@ -35,8 +35,15 @@ typedef enum {
35 35
36#define IM_N 18 36#define IM_N 18
37 37
38
39extern struct IM {
40 TObject int_method[IM_N];
41} *luaI_IMtable;
42
38extern char *luaI_eventname[]; 43extern char *luaI_eventname[];
39 44
45#define luaI_getim(tag,event) (&luaI_IMtable[-(tag)].int_method[event])
46#define luaI_getimbyObj(o,e) (luaI_getim(luaI_efectivetag(o),(e)))
40 47
41void luaI_setfallback (void); 48void luaI_setfallback (void);
42int luaI_ref (TObject *object, int lock); 49int luaI_ref (TObject *object, int lock);
@@ -47,10 +54,8 @@ char *luaI_travfallbacks (int (*fn)(TObject *));
47 54
48void luaI_settag (int tag, TObject *o); 55void luaI_settag (int tag, TObject *o);
49void luaI_realtag (int tag); 56void luaI_realtag (int tag);
50TObject *luaI_getim (int tag, IMS event);
51#define luaI_getimbyObj(o,e) (luaI_getim(luaI_tag(o),(e)))
52TObject *luaI_geterrorim (void); 57TObject *luaI_geterrorim (void);
53int luaI_tag (TObject *o); 58int luaI_efectivetag (TObject *o);
54void luaI_settagmethod (void); 59void luaI_settagmethod (void);
55void luaI_gettagmethod (void); 60void luaI_gettagmethod (void);
56void luaI_seterrormethod (void); 61void luaI_seterrormethod (void);
diff --git a/opcode.c b/opcode.c
index 77b680d6..066e9c05 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 4.2 1997/04/04 22:24:51 roberto Exp roberto $"; 6char *rcs_opcode="$Id: opcode.c,v 4.3 1997/04/15 17:32:47 roberto Exp roberto $";
7 7
8#include <setjmp.h> 8#include <setjmp.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -180,11 +180,14 @@ static int lua_tostring (TObject *obj)
180*/ 180*/
181static void adjust_top (StkId newtop) 181static void adjust_top (StkId newtop)
182{ 182{
183 TObject *nt; 183 if (newtop <= top-stack) /* int arith, since newtop may be out of stack */
184 lua_checkstack(stack+newtop); 184 top = stack+newtop;
185 nt = stack+newtop; /* warning: previous call may change stack */ 185 else {
186 while (top < nt) ttype(top++) = LUA_T_NIL; 186 TObject *nt;
187 top = nt; /* top could be bigger than newtop */ 187 lua_checkstack(stack+newtop);
188 nt = stack+newtop; /* warning: previous call may change stack */
189 while (top < nt) ttype(top++) = LUA_T_NIL;
190 }
188} 191}
189 192
190#define adjustC(nParams) adjust_top(CLS_current.base+nParams) 193#define adjustC(nParams) adjust_top(CLS_current.base+nParams)
@@ -300,7 +303,7 @@ static void do_call (StkId base, int nResults)
300 return; 303 return;
301 } 304 }
302 /* adjust the number of results */ 305 /* adjust the number of results */
303 if (nResults != MULT_RET && top - (stack+firstResult) != nResults) 306 if (nResults != MULT_RET)
304 adjust_top(firstResult+nResults); 307 adjust_top(firstResult+nResults);
305 /* move results to base-1 (to erase parameters and function) */ 308 /* move results to base-1 (to erase parameters and function) */
306 base--; 309 base--;
@@ -317,7 +320,7 @@ static void do_call (StkId base, int nResults)
317*/ 320*/
318static void pushsubscript (void) 321static void pushsubscript (void)
319{ 322{
320 int tg = luaI_tag(top-2); 323 int tg = luaI_efectivetag(top-2);
321 TObject *im = luaI_getim(tg, IM_GETTABLE); 324 TObject *im = luaI_getim(tg, IM_GETTABLE);
322 if (ttype(top-2) == LUA_T_ARRAY && ttype(im) == LUA_T_NIL) { 325 if (ttype(top-2) == LUA_T_ARRAY && ttype(im) == LUA_T_NIL) {
323 TObject *h = lua_hashget(avalue(top-2), top-1); 326 TObject *h = lua_hashget(avalue(top-2), top-1);
@@ -1033,9 +1036,18 @@ void lua_pushobject (lua_Object o)
1033 incr_top; 1036 incr_top;
1034} 1037}
1035 1038
1036int lua_tag (lua_Object o) 1039int lua_tag (lua_Object lo)
1037{ 1040{
1038 return (o == LUA_NOOBJECT) ? LUA_T_NIL : luaI_tag(Address(o)); 1041 if (lo == LUA_NOOBJECT) return LUA_T_NIL;
1042 else {
1043 TObject *o = Address(lo);
1044 lua_Type t = ttype(o);
1045 if (t == LUA_T_USERDATA)
1046 return o->value.ts->tag;
1047 else if (t == LUA_T_ARRAY)
1048 return o->value.a->htag;
1049 else return t;
1050 }
1039} 1051}
1040 1052
1041 1053