summaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-22 17:49:29 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-22 17:49:29 -0300
commitb800c38b6920863725a279332f001bce1d457020 (patch)
treee7eeaff456ea2545c52eb6c565afc154a25de218 /lvm.c
parent5c0e79847c2a7a8006b0270210de56b53cb33564 (diff)
downloadlua-b800c38b6920863725a279332f001bce1d457020.tar.gz
lua-b800c38b6920863725a279332f001bce1d457020.tar.bz2
lua-b800c38b6920863725a279332f001bce1d457020.zip
simpler code for settable and gettable
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c86
1 files changed, 39 insertions, 47 deletions
diff --git a/lvm.c b/lvm.c
index ec2db70e..e5148905 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.126 2000/08/11 16:17:28 roberto Exp roberto $ 2** $Id: lvm.c,v 1.127 2000/08/14 14:05:06 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -115,35 +115,31 @@ void luaV_Lclosure (lua_State *L, Proto *l, int nelems) {
115** Receives the table at top-2 and the index at top-1. 115** Receives the table at top-2 and the index at top-1.
116*/ 116*/
117void luaV_gettable (lua_State *L, StkId top) { 117void luaV_gettable (lua_State *L, StkId top) {
118 StkId table = top-2; 118 StkId t = top-2;
119 const TObject *im; 119 int tg;
120 if (ttype(table) != TAG_TABLE) { /* not a table, get gettable TM */ 120 if (ttype(t) == TAG_TABLE && /* `t' is a table? */
121 im = luaT_getimbyObj(L, table, IM_GETTABLE); 121 ((tg = hvalue(t)->htag) == TAG_TABLE || /* with default tag? */
122 if (ttype(im) == TAG_NIL) { 122 ttype(luaT_getim(L, tg, IM_GETTABLE)) == TAG_NIL)) { /* or no TM? */
123 /* do a primitive get */
124 const TObject *h = luaH_get(L, hvalue(t), t+1);
125 /* result is no nil or there is no `index' tag method? */
126 const TObject *im;
127 if (ttype(h) != TAG_NIL ||
128 (ttype(im=luaT_getim(L, tg, IM_INDEX)) == TAG_NIL))
129 *t = *h; /* put result into table position */
130 else { /* call `index' tag method */
123 L->top = top; 131 L->top = top;
124 luaG_typeerror(L, table, "index"); 132 luaD_callTM(L, im, 2, 1);
125 } 133 }
126 } 134 }
127 else { /* object is a table... */ 135 else { /* try a 'gettable' TM */
128 int tg = hvalue(table)->htag; 136 const TObject *im = luaT_getimbyObj(L, t, IM_GETTABLE);
129 im = luaT_getim(L, tg, IM_GETTABLE); 137 L->top = top;
130 if (ttype(im) == TAG_NIL) { /* and does not have a `gettable' TM */ 138 if (ttype(im) != TAG_NIL) /* call `gettable' tag method */
131 const TObject *h = luaH_get(L, hvalue(table), table+1); 139 luaD_callTM(L, im, 2, 1);
132 if (ttype(h) == TAG_NIL && 140 else /* no tag method */
133 (ttype(im=luaT_getim(L, tg, IM_INDEX)) != TAG_NIL)) { 141 luaG_typeerror(L, t, "index");
134 /* result is nil and there is an `index' tag method */
135 L->top = top;
136 luaD_callTM(L, im, 2, 1); /* calls it */
137 }
138 else
139 *table = *h; /* `push' result into table position */
140 return;
141 }
142 /* else it has a `gettable' TM, go through to next command */
143 } 142 }
144 /* object is not a table, or it has a `gettable' TM */
145 L->top = top;
146 luaD_callTM(L, im, 2, 1);
147} 143}
148 144
149 145
@@ -151,30 +147,26 @@ void luaV_gettable (lua_State *L, StkId top) {
151** Receives table at *t, index at *(t+1) and value at `top'. 147** Receives table at *t, index at *(t+1) and value at `top'.
152*/ 148*/
153void luaV_settable (lua_State *L, StkId t, StkId top) { 149void luaV_settable (lua_State *L, StkId t, StkId top) {
154 const TObject *im; 150 int tg;
155 if (ttype(t) != TAG_TABLE) { /* not a table, get `settable' method */ 151 if (ttype(t) == TAG_TABLE && /* `t' is a table? */
152 ((tg = hvalue(t)->htag) == TAG_TABLE || /* with default tag? */
153 ttype(luaT_getim(L, tg, IM_SETTABLE)) == TAG_NIL)) /* or no TM? */
154 *luaH_set(L, hvalue(t), t+1) = *(top-1); /* do a primitive set */
155 else { /* try a `settable' tag method */
156 const TObject *im = luaT_getimbyObj(L, t, IM_SETTABLE);
156 L->top = top; 157 L->top = top;
157 im = luaT_getimbyObj(L, t, IM_SETTABLE); 158 if (ttype(im) != TAG_NIL) {
158 if (ttype(im) == TAG_NIL) 159 luaD_checkstack(L, 3);
159 luaG_typeerror(L, t, "index"); 160 *(top+2) = *(top-1);
160 } 161 *(top+1) = *(t+1);
161 else { /* object is a table... */ 162 *(top) = *t;
162 im = luaT_getim(L, hvalue(t)->htag, IM_SETTABLE); 163 *(top-1) = *im;
163 if (ttype(im) == TAG_NIL) { /* and does not have a `settable' method */ 164 L->top = top+3;
164 *luaH_set(L, hvalue(t), t+1) = *(top-1); 165 luaD_call(L, top-1, 0); /* call `settable' tag method */
165 return;
166 } 166 }
167 /* else it has a `settable' method, go through to next command */ 167 else /* no tag method... */
168 luaG_typeerror(L, t, "index");
168 } 169 }
169 /* object is not a table, or it has a `settable' method */
170 /* prepare arguments and call the tag method */
171 luaD_checkstack(L, 3);
172 *(top+2) = *(top-1);
173 *(top+1) = *(t+1);
174 *(top) = *t;
175 *(top-1) = *im;
176 L->top = top+3;
177 luaD_call(L, top-1, 0);
178} 170}
179 171
180 172