aboutsummaryrefslogtreecommitdiff
path: root/src/lj_meta.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-02-23 02:09:19 +0100
committerMike Pall <mike>2013-02-23 02:09:19 +0100
commit73ef845fcaf65937ad63e9cf6b681cb3e61f4504 (patch)
tree078cfae62c78ae9b9c0cfe5afe6000643ffc805d /src/lj_meta.c
parentb359ce804bb52585815fc52d7846202db4341acb (diff)
downloadluajit-73ef845fcaf65937ad63e9cf6b681cb3e61f4504.tar.gz
luajit-73ef845fcaf65937ad63e9cf6b681cb3e61f4504.tar.bz2
luajit-73ef845fcaf65937ad63e9cf6b681cb3e61f4504.zip
Add special bytecodes for builtins.
BC_ISTYPE, BC_ISNUM: fast type checks/coercions. BC_TGETR, BC_TSETR: fast rawgeti/rawseti, no type checks for table/key.
Diffstat (limited to 'src/lj_meta.c')
-rw-r--r--src/lj_meta.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/lj_meta.c b/src/lj_meta.c
index 441d571a..e11f1b75 100644
--- a/src/lj_meta.c
+++ b/src/lj_meta.c
@@ -19,6 +19,7 @@
19#include "lj_bc.h" 19#include "lj_bc.h"
20#include "lj_vm.h" 20#include "lj_vm.h"
21#include "lj_strscan.h" 21#include "lj_strscan.h"
22#include "lj_lib.h"
22 23
23/* -- Metamethod handling ------------------------------------------------- */ 24/* -- Metamethod handling ------------------------------------------------- */
24 25
@@ -423,6 +424,18 @@ TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op)
423 } 424 }
424} 425}
425 426
427/* Helper for ISTYPE and ISNUM. Implicit coercion or error. */
428void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp)
429{
430 L->top = curr_topL(L);
431 ra++; tp--;
432 lua_assert(LJ_DUALNUM || tp != ~LJ_TNUMX); /* ISTYPE -> ISNUM broken. */
433 if (LJ_DUALNUM && tp == ~LJ_TNUMX) lj_lib_checkint(L, ra);
434 else if (tp == ~LJ_TNUMX+1) lj_lib_checknum(L, ra);
435 else if (tp == ~LJ_TSTR) lj_lib_checkstr(L, ra);
436 else lj_err_argtype(L, ra, lj_obj_itypename[tp]);
437}
438
426/* Helper for calls. __call metamethod. */ 439/* Helper for calls. __call metamethod. */
427void lj_meta_call(lua_State *L, TValue *func, TValue *top) 440void lj_meta_call(lua_State *L, TValue *func, TValue *top)
428{ 441{