diff options
author | Mike Pall <mike> | 2013-02-23 02:09:19 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2013-02-23 02:09:19 +0100 |
commit | 73ef845fcaf65937ad63e9cf6b681cb3e61f4504 (patch) | |
tree | 078cfae62c78ae9b9c0cfe5afe6000643ffc805d /src/lj_meta.c | |
parent | b359ce804bb52585815fc52d7846202db4341acb (diff) | |
download | luajit-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.c | 13 |
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. */ | ||
428 | void 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. */ |
427 | void lj_meta_call(lua_State *L, TValue *func, TValue *top) | 440 | void lj_meta_call(lua_State *L, TValue *func, TValue *top) |
428 | { | 441 | { |