summaryrefslogtreecommitdiff
path: root/src/lib_base.c
diff options
context:
space:
mode:
authorMike Pall <mike>2015-01-03 15:04:38 +0100
committerMike Pall <mike>2015-01-03 15:04:38 +0100
commit054e6abe37450344e20b373ec326055071029e9b (patch)
treed3abbe61e643f4f59797d2aea24cc3a0643df53b /src/lib_base.c
parenta13dfd66c3427f9cc94044f261a526042b0d02f5 (diff)
downloadluajit-054e6abe37450344e20b373ec326055071029e9b.tar.gz
luajit-054e6abe37450344e20b373ec326055071029e9b.tar.bz2
luajit-054e6abe37450344e20b373ec326055071029e9b.zip
Add LJ_FR2 mode: Two-slot frame info.
Diffstat (limited to 'src/lib_base.c')
-rw-r--r--src/lib_base.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/src/lib_base.c b/src/lib_base.c
index 713bdae5..6bb71d54 100644
--- a/src/lib_base.c
+++ b/src/lib_base.c
@@ -87,10 +87,11 @@ static int ffh_pairs(lua_State *L, MMS mm)
87 cTValue *mo = lj_meta_lookup(L, o, mm); 87 cTValue *mo = lj_meta_lookup(L, o, mm);
88 if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) { 88 if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) {
89 L->top = o+1; /* Only keep one argument. */ 89 L->top = o+1; /* Only keep one argument. */
90 copyTV(L, L->base-1, mo); /* Replace callable. */ 90 copyTV(L, L->base-1-LJ_FR2, mo); /* Replace callable. */
91 return FFH_TAILCALL; 91 return FFH_TAILCALL;
92 } else { 92 } else {
93 if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE); 93 if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE);
94 if (LJ_FR2) { copyTV(L, o-1, o); o--; }
94 setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1))); 95 setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1)));
95 if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0); 96 if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0);
96 return FFH_RES(3); 97 return FFH_RES(3);
@@ -132,7 +133,7 @@ LJLIB_ASM(setmetatable) LJLIB_REC(.)
132 lj_err_caller(L, LJ_ERR_PROTMT); 133 lj_err_caller(L, LJ_ERR_PROTMT);
133 setgcref(t->metatable, obj2gco(mt)); 134 setgcref(t->metatable, obj2gco(mt));
134 if (mt) { lj_gc_objbarriert(L, t, mt); } 135 if (mt) { lj_gc_objbarriert(L, t, mt); }
135 settabV(L, L->base-1, t); 136 settabV(L, L->base-1-LJ_FR2, t);
136 return FFH_RES(1); 137 return FFH_RES(1);
137} 138}
138 139
@@ -145,6 +146,7 @@ LJLIB_CF(getfenv) LJLIB_REC(.)
145 o = lj_debug_frame(L, level, &level); 146 o = lj_debug_frame(L, level, &level);
146 if (o == NULL) 147 if (o == NULL)
147 lj_err_arg(L, 1, LJ_ERR_INVLVL); 148 lj_err_arg(L, 1, LJ_ERR_INVLVL);
149 if (LJ_FR2) o--;
148 } 150 }
149 fn = &gcval(o)->fn; 151 fn = &gcval(o)->fn;
150 settabV(L, L->top++, isluafunc(fn) ? tabref(fn->l.env) : tabref(L->env)); 152 settabV(L, L->top++, isluafunc(fn) ? tabref(fn->l.env) : tabref(L->env));
@@ -166,6 +168,7 @@ LJLIB_CF(setfenv)
166 o = lj_debug_frame(L, level, &level); 168 o = lj_debug_frame(L, level, &level);
167 if (o == NULL) 169 if (o == NULL)
168 lj_err_arg(L, 1, LJ_ERR_INVLVL); 170 lj_err_arg(L, 1, LJ_ERR_INVLVL);
171 if (LJ_FR2) o--;
169 } 172 }
170 fn = &gcval(o)->fn; 173 fn = &gcval(o)->fn;
171 if (!isluafunc(fn)) 174 if (!isluafunc(fn))
@@ -258,7 +261,7 @@ LJLIB_ASM(tonumber) LJLIB_REC(.)
258 if (base == 10) { 261 if (base == 10) {
259 TValue *o = lj_lib_checkany(L, 1); 262 TValue *o = lj_lib_checkany(L, 1);
260 if (lj_strscan_numberobj(o)) { 263 if (lj_strscan_numberobj(o)) {
261 copyTV(L, L->base-1, o); 264 copyTV(L, L->base-1-LJ_FR2, o);
262 return FFH_RES(1); 265 return FFH_RES(1);
263 } 266 }
264#if LJ_HASFFI 267#if LJ_HASFFI
@@ -271,11 +274,11 @@ LJLIB_ASM(tonumber) LJLIB_REC(.)
271 ct->size <= 4 && !(ct->size == 4 && (ct->info & CTF_UNSIGNED))) { 274 ct->size <= 4 && !(ct->size == 4 && (ct->info & CTF_UNSIGNED))) {
272 int32_t i; 275 int32_t i;
273 lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o, 0); 276 lj_cconv_ct_tv(cts, ctype_get(cts, CTID_INT32), (uint8_t *)&i, o, 0);
274 setintV(L->base-1, i); 277 setintV(L->base-1-LJ_FR2, i);
275 return FFH_RES(1); 278 return FFH_RES(1);
276 } 279 }
277 lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE), 280 lj_cconv_ct_tv(cts, ctype_get(cts, CTID_DOUBLE),
278 (uint8_t *)&(L->base-1)->n, o, 0); 281 (uint8_t *)&(L->base-1-LJ_FR2)->n, o, 0);
279 return FFH_RES(1); 282 return FFH_RES(1);
280 } 283 }
281 } 284 }
@@ -291,14 +294,14 @@ LJLIB_ASM(tonumber) LJLIB_REC(.)
291 while (lj_char_isspace((unsigned char)(*ep))) ep++; 294 while (lj_char_isspace((unsigned char)(*ep))) ep++;
292 if (*ep == '\0') { 295 if (*ep == '\0') {
293 if (LJ_DUALNUM && LJ_LIKELY(ul < 0x80000000u)) 296 if (LJ_DUALNUM && LJ_LIKELY(ul < 0x80000000u))
294 setintV(L->base-1, (int32_t)ul); 297 setintV(L->base-1-LJ_FR2, (int32_t)ul);
295 else 298 else
296 setnumV(L->base-1, (lua_Number)ul); 299 setnumV(L->base-1-LJ_FR2, (lua_Number)ul);
297 return FFH_RES(1); 300 return FFH_RES(1);
298 } 301 }
299 } 302 }
300 } 303 }
301 setnilV(L->base-1); 304 setnilV(L->base-1-LJ_FR2);
302 return FFH_RES(1); 305 return FFH_RES(1);
303} 306}
304 307
@@ -308,11 +311,11 @@ LJLIB_ASM(tostring) LJLIB_REC(.)
308 cTValue *mo; 311 cTValue *mo;
309 L->top = o+1; /* Only keep one argument. */ 312 L->top = o+1; /* Only keep one argument. */
310 if (!tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) { 313 if (!tvisnil(mo = lj_meta_lookup(L, o, MM_tostring))) {
311 copyTV(L, L->base-1, mo); /* Replace callable. */ 314 copyTV(L, L->base-1-LJ_FR2, mo); /* Replace callable. */
312 return FFH_TAILCALL; 315 return FFH_TAILCALL;
313 } 316 }
314 lj_gc_check(L); 317 lj_gc_check(L);
315 setstrV(L, L->base-1, lj_strfmt_obj(L, L->base)); 318 setstrV(L, L->base-1-LJ_FR2, lj_strfmt_obj(L, L->base));
316 return FFH_RES(1); 319 return FFH_RES(1);
317} 320}
318 321
@@ -535,7 +538,7 @@ LJLIB_CF(coroutine_status)
535 if (co == L) s = "running"; 538 if (co == L) s = "running";
536 else if (co->status == LUA_YIELD) s = "suspended"; 539 else if (co->status == LUA_YIELD) s = "suspended";
537 else if (co->status != 0) s = "dead"; 540 else if (co->status != 0) s = "dead";
538 else if (co->base > tvref(co->stack)+1) s = "normal"; 541 else if (co->base > tvref(co->stack)+1+LJ_FR2) s = "normal";
539 else if (co->top == co->base) s = "dead"; 542 else if (co->top == co->base) s = "dead";
540 else s = "suspended"; 543 else s = "suspended";
541 lua_pushstring(L, s); 544 lua_pushstring(L, s);
@@ -577,8 +580,8 @@ static int ffh_resume(lua_State *L, lua_State *co, int wrap)
577 (co->status == 0 && co->top == co->base)) { 580 (co->status == 0 && co->top == co->base)) {
578 ErrMsg em = co->cframe ? LJ_ERR_CORUN : LJ_ERR_CODEAD; 581 ErrMsg em = co->cframe ? LJ_ERR_CORUN : LJ_ERR_CODEAD;
579 if (wrap) lj_err_caller(L, em); 582 if (wrap) lj_err_caller(L, em);
580 setboolV(L->base-1, 0); 583 setboolV(L->base-1-LJ_FR2, 0);
581 setstrV(L, L->base, lj_err_str(L, em)); 584 setstrV(L, L->base-LJ_FR2, lj_err_str(L, em));
582 return FFH_RES(2); 585 return FFH_RES(2);
583 } 586 }
584 lj_state_growstack(co, (MSize)(L->top - L->base)); 587 lj_state_growstack(co, (MSize)(L->top - L->base));