diff options
author | Mike Pall <mike> | 2012-09-24 17:13:53 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-09-24 17:13:53 +0200 |
commit | 4c7c2c831992c836cbdfd0bbad1dcc26fbd007cc (patch) | |
tree | 32f43cafd7bd030689f7b84265fd068f94689d17 | |
parent | d9c5eba1bb0ad59a40f4d79fd331cdf1f9f4b81e (diff) | |
download | luajit-4c7c2c831992c836cbdfd0bbad1dcc26fbd007cc.tar.gz luajit-4c7c2c831992c836cbdfd0bbad1dcc26fbd007cc.tar.bz2 luajit-4c7c2c831992c836cbdfd0bbad1dcc26fbd007cc.zip |
Rearrange library functions to get a fixed FF_next.
-rw-r--r-- | src/lib_base.c | 100 | ||||
-rw-r--r-- | src/lj_bc.h | 2 |
2 files changed, 51 insertions, 51 deletions
diff --git a/src/lib_base.c b/src/lib_base.c index 1d736b24..d63c9803 100644 --- a/src/lib_base.c +++ b/src/lib_base.c | |||
@@ -68,6 +68,56 @@ LJLIB_PUSH("number") | |||
68 | LJLIB_ASM_(type) LJLIB_REC(.) | 68 | LJLIB_ASM_(type) LJLIB_REC(.) |
69 | /* Recycle the lj_lib_checkany(L, 1) from assert. */ | 69 | /* Recycle the lj_lib_checkany(L, 1) from assert. */ |
70 | 70 | ||
71 | /* -- Base library: iterators --------------------------------------------- */ | ||
72 | |||
73 | /* This solves a circular dependency problem -- change FF_next_N as needed. */ | ||
74 | LJ_STATIC_ASSERT((int)FF_next == FF_next_N); | ||
75 | |||
76 | LJLIB_ASM(next) | ||
77 | { | ||
78 | lj_lib_checktab(L, 1); | ||
79 | return FFH_UNREACHABLE; | ||
80 | } | ||
81 | |||
82 | #if LJ_52 || LJ_HASFFI | ||
83 | static int ffh_pairs(lua_State *L, MMS mm) | ||
84 | { | ||
85 | TValue *o = lj_lib_checkany(L, 1); | ||
86 | cTValue *mo = lj_meta_lookup(L, o, mm); | ||
87 | if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) { | ||
88 | L->top = o+1; /* Only keep one argument. */ | ||
89 | copyTV(L, L->base-1, mo); /* Replace callable. */ | ||
90 | return FFH_TAILCALL; | ||
91 | } else { | ||
92 | if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE); | ||
93 | setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1))); | ||
94 | if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0); | ||
95 | return FFH_RES(3); | ||
96 | } | ||
97 | } | ||
98 | #else | ||
99 | #define ffh_pairs(L, mm) (lj_lib_checktab(L, 1), FFH_UNREACHABLE) | ||
100 | #endif | ||
101 | |||
102 | LJLIB_PUSH(lastcl) | ||
103 | LJLIB_ASM(pairs) | ||
104 | { | ||
105 | return ffh_pairs(L, MM_pairs); | ||
106 | } | ||
107 | |||
108 | LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.) | ||
109 | { | ||
110 | lj_lib_checktab(L, 1); | ||
111 | lj_lib_checkint(L, 2); | ||
112 | return FFH_UNREACHABLE; | ||
113 | } | ||
114 | |||
115 | LJLIB_PUSH(lastcl) | ||
116 | LJLIB_ASM(ipairs) LJLIB_REC(.) | ||
117 | { | ||
118 | return ffh_pairs(L, MM_ipairs); | ||
119 | } | ||
120 | |||
71 | /* -- Base library: getters and setters ----------------------------------- */ | 121 | /* -- Base library: getters and setters ----------------------------------- */ |
72 | 122 | ||
73 | LJLIB_ASM_(getmetatable) LJLIB_REC(.) | 123 | LJLIB_ASM_(getmetatable) LJLIB_REC(.) |
@@ -267,56 +317,6 @@ LJLIB_ASM(tostring) LJLIB_REC(.) | |||
267 | } | 317 | } |
268 | } | 318 | } |
269 | 319 | ||
270 | /* -- Base library: iterators --------------------------------------------- */ | ||
271 | |||
272 | /* This solves a circular dependency problem -- change FF_next_N as needed. */ | ||
273 | LJ_STATIC_ASSERT((int)FF_next == FF_next_N); | ||
274 | |||
275 | LJLIB_ASM(next) | ||
276 | { | ||
277 | lj_lib_checktab(L, 1); | ||
278 | return FFH_UNREACHABLE; | ||
279 | } | ||
280 | |||
281 | #if LJ_52 || LJ_HASFFI | ||
282 | static int ffh_pairs(lua_State *L, MMS mm) | ||
283 | { | ||
284 | TValue *o = lj_lib_checkany(L, 1); | ||
285 | cTValue *mo = lj_meta_lookup(L, o, mm); | ||
286 | if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) { | ||
287 | L->top = o+1; /* Only keep one argument. */ | ||
288 | copyTV(L, L->base-1, mo); /* Replace callable. */ | ||
289 | return FFH_TAILCALL; | ||
290 | } else { | ||
291 | if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE); | ||
292 | setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1))); | ||
293 | if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0); | ||
294 | return FFH_RES(3); | ||
295 | } | ||
296 | } | ||
297 | #else | ||
298 | #define ffh_pairs(L, mm) (lj_lib_checktab(L, 1), FFH_UNREACHABLE) | ||
299 | #endif | ||
300 | |||
301 | LJLIB_PUSH(lastcl) | ||
302 | LJLIB_ASM(pairs) | ||
303 | { | ||
304 | return ffh_pairs(L, MM_pairs); | ||
305 | } | ||
306 | |||
307 | LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.) | ||
308 | { | ||
309 | lj_lib_checktab(L, 1); | ||
310 | lj_lib_checkint(L, 2); | ||
311 | return FFH_UNREACHABLE; | ||
312 | } | ||
313 | |||
314 | LJLIB_PUSH(lastcl) | ||
315 | LJLIB_ASM(ipairs) LJLIB_REC(.) | ||
316 | { | ||
317 | return ffh_pairs(L, MM_ipairs); | ||
318 | } | ||
319 | |||
320 | /* -- Base library: throw and catch errors -------------------------------- */ | 320 | /* -- Base library: throw and catch errors -------------------------------- */ |
321 | 321 | ||
322 | LJLIB_CF(error) | 322 | LJLIB_CF(error) |
diff --git a/src/lj_bc.h b/src/lj_bc.h index 0a82c9d4..5edff707 100644 --- a/src/lj_bc.h +++ b/src/lj_bc.h | |||
@@ -224,7 +224,7 @@ LJ_STATIC_ASSERT((int)BC_FUNCV + 1 == (int)BC_IFUNCV); | |||
224 | LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV); | 224 | LJ_STATIC_ASSERT((int)BC_FUNCV + 2 == (int)BC_JFUNCV); |
225 | 225 | ||
226 | /* This solves a circular dependency problem, change as needed. */ | 226 | /* This solves a circular dependency problem, change as needed. */ |
227 | #define FF_next_N 15 | 227 | #define FF_next_N 4 |
228 | 228 | ||
229 | /* Stack slots used by FORI/FORL, relative to operand A. */ | 229 | /* Stack slots used by FORI/FORL, relative to operand A. */ |
230 | enum { | 230 | enum { |