diff options
author | Mike Pall <mike> | 2015-01-03 15:04:38 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2015-01-03 15:04:38 +0100 |
commit | 054e6abe37450344e20b373ec326055071029e9b (patch) | |
tree | d3abbe61e643f4f59797d2aea24cc3a0643df53b /src/lib_base.c | |
parent | a13dfd66c3427f9cc94044f261a526042b0d02f5 (diff) | |
download | luajit-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.c | 29 |
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)); |