]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
From Lua 5.2: Add rawlen(). Needs -DLUAJIT_ENABLE_LUA52COMPAT.
authorMike Pall <mike>
Mon, 24 Sep 2012 15:33:32 +0000 (17:33 +0200)
committerMike Pall <mike>
Mon, 24 Sep 2012 15:33:32 +0000 (17:33 +0200)
src/lib_base.c
src/lj_ffrecord.c

index d63c98031aef7c091987f20f7ab4ca74ea520e96..6f664eb6ccb19329bef92cb82f8cb9c7004696e6 100644 (file)
@@ -199,6 +199,20 @@ LJLIB_CF(rawequal)         LJLIB_REC(.)
   return 1;
 }
 
+#if LJ_52
+LJLIB_CF(rawlen)               LJLIB_REC(.)
+{
+  cTValue *o = L->base;
+  int32_t len;
+  if (L->top > o && tvisstr(o))
+    len = (int32_t)strV(o)->len;
+  else
+    len = (int32_t)lj_tab_len(lj_lib_checktab(L, 1));
+  setintV(L->top-1, len);
+  return 1;
+}
+#endif
+
 LJLIB_CF(unpack)
 {
   GCtab *t = lj_lib_checktab(L, 1);
index 42bbc5f4c7ab105bb3e53cf78fd23ab661fc8079..39c3140f813da956bfc290c15af66b6b5795f12b 100644 (file)
@@ -213,6 +213,19 @@ static void LJ_FASTCALL recff_rawequal(jit_State *J, RecordFFData *rd)
   }  /* else: Interpreter will throw. */
 }
 
+#if LJ_52
+static void LJ_FASTCALL recff_rawlen(jit_State *J, RecordFFData *rd)
+{
+  TRef tr = J->base[0];
+  if (tref_isstr(tr))
+    J->base[0] = emitir(IRTI(IR_FLOAD), tr, IRFL_STR_LEN);
+  else if (tref_istab(tr))
+    J->base[0] = lj_ir_call(J, IRCALL_lj_tab_len, tr);
+  /* else: Interpreter will throw. */
+  UNUSED(rd);
+}
+#endif
+
 /* Determine mode of select() call. */
 int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv)
 {