|
@@ -68,6 +68,56 @@ LJLIB_PUSH("number")
|
|
|
LJLIB_ASM_(type) LJLIB_REC(.)
|
|
|
/* Recycle the lj_lib_checkany(L, 1) from assert. */
|
|
|
|
|
|
+/* -- Base library: iterators --------------------------------------------- */
|
|
|
+
|
|
|
+/* This solves a circular dependency problem -- change FF_next_N as needed. */
|
|
|
+LJ_STATIC_ASSERT((int)FF_next == FF_next_N);
|
|
|
+
|
|
|
+LJLIB_ASM(next)
|
|
|
+{
|
|
|
+ lj_lib_checktab(L, 1);
|
|
|
+ return FFH_UNREACHABLE;
|
|
|
+}
|
|
|
+
|
|
|
+#if LJ_52 || LJ_HASFFI
|
|
|
+static int ffh_pairs(lua_State *L, MMS mm)
|
|
|
+{
|
|
|
+ TValue *o = lj_lib_checkany(L, 1);
|
|
|
+ cTValue *mo = lj_meta_lookup(L, o, mm);
|
|
|
+ if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) {
|
|
|
+ L->top = o+1; /* Only keep one argument. */
|
|
|
+ copyTV(L, L->base-1, mo); /* Replace callable. */
|
|
|
+ return FFH_TAILCALL;
|
|
|
+ } else {
|
|
|
+ if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE);
|
|
|
+ setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1)));
|
|
|
+ if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0);
|
|
|
+ return FFH_RES(3);
|
|
|
+ }
|
|
|
+}
|
|
|
+#else
|
|
|
+#define ffh_pairs(L, mm) (lj_lib_checktab(L, 1), FFH_UNREACHABLE)
|
|
|
+#endif
|
|
|
+
|
|
|
+LJLIB_PUSH(lastcl)
|
|
|
+LJLIB_ASM(pairs)
|
|
|
+{
|
|
|
+ return ffh_pairs(L, MM_pairs);
|
|
|
+}
|
|
|
+
|
|
|
+LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.)
|
|
|
+{
|
|
|
+ lj_lib_checktab(L, 1);
|
|
|
+ lj_lib_checkint(L, 2);
|
|
|
+ return FFH_UNREACHABLE;
|
|
|
+}
|
|
|
+
|
|
|
+LJLIB_PUSH(lastcl)
|
|
|
+LJLIB_ASM(ipairs) LJLIB_REC(.)
|
|
|
+{
|
|
|
+ return ffh_pairs(L, MM_ipairs);
|
|
|
+}
|
|
|
+
|
|
|
/* -- Base library: getters and setters ----------------------------------- */
|
|
|
|
|
|
LJLIB_ASM_(getmetatable) LJLIB_REC(.)
|
|
@@ -267,56 +317,6 @@ LJLIB_ASM(tostring) LJLIB_REC(.)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* -- Base library: iterators --------------------------------------------- */
|
|
|
-
|
|
|
-/* This solves a circular dependency problem -- change FF_next_N as needed. */
|
|
|
-LJ_STATIC_ASSERT((int)FF_next == FF_next_N);
|
|
|
-
|
|
|
-LJLIB_ASM(next)
|
|
|
-{
|
|
|
- lj_lib_checktab(L, 1);
|
|
|
- return FFH_UNREACHABLE;
|
|
|
-}
|
|
|
-
|
|
|
-#if LJ_52 || LJ_HASFFI
|
|
|
-static int ffh_pairs(lua_State *L, MMS mm)
|
|
|
-{
|
|
|
- TValue *o = lj_lib_checkany(L, 1);
|
|
|
- cTValue *mo = lj_meta_lookup(L, o, mm);
|
|
|
- if ((LJ_52 || tviscdata(o)) && !tvisnil(mo)) {
|
|
|
- L->top = o+1; /* Only keep one argument. */
|
|
|
- copyTV(L, L->base-1, mo); /* Replace callable. */
|
|
|
- return FFH_TAILCALL;
|
|
|
- } else {
|
|
|
- if (!tvistab(o)) lj_err_argt(L, 1, LUA_TTABLE);
|
|
|
- setfuncV(L, o-1, funcV(lj_lib_upvalue(L, 1)));
|
|
|
- if (mm == MM_pairs) setnilV(o+1); else setintV(o+1, 0);
|
|
|
- return FFH_RES(3);
|
|
|
- }
|
|
|
-}
|
|
|
-#else
|
|
|
-#define ffh_pairs(L, mm) (lj_lib_checktab(L, 1), FFH_UNREACHABLE)
|
|
|
-#endif
|
|
|
-
|
|
|
-LJLIB_PUSH(lastcl)
|
|
|
-LJLIB_ASM(pairs)
|
|
|
-{
|
|
|
- return ffh_pairs(L, MM_pairs);
|
|
|
-}
|
|
|
-
|
|
|
-LJLIB_NOREGUV LJLIB_ASM(ipairs_aux) LJLIB_REC(.)
|
|
|
-{
|
|
|
- lj_lib_checktab(L, 1);
|
|
|
- lj_lib_checkint(L, 2);
|
|
|
- return FFH_UNREACHABLE;
|
|
|
-}
|
|
|
-
|
|
|
-LJLIB_PUSH(lastcl)
|
|
|
-LJLIB_ASM(ipairs) LJLIB_REC(.)
|
|
|
-{
|
|
|
- return ffh_pairs(L, MM_ipairs);
|
|
|
-}
|
|
|
-
|
|
|
/* -- Base library: throw and catch errors -------------------------------- */
|
|
|
|
|
|
LJLIB_CF(error)
|