lua

A copy of the Lua development repository
Log | Files | Refs | README

lvm.h (4067B)


      1 /*
      2 ** $Id: lvm.h $
      3 ** Lua virtual machine
      4 ** See Copyright Notice in lua.h
      5 */
      6 
      7 #ifndef lvm_h
      8 #define lvm_h
      9 
     10 
     11 #include "ldo.h"
     12 #include "lobject.h"
     13 #include "ltm.h"
     14 
     15 
     16 #if !defined(LUA_NOCVTN2S)
     17 #define cvt2str(o)	ttisnumber(o)
     18 #else
     19 #define cvt2str(o)	0	/* no conversion from numbers to strings */
     20 #endif
     21 
     22 
     23 #if !defined(LUA_NOCVTS2N)
     24 #define cvt2num(o)	ttisstring(o)
     25 #else
     26 #define cvt2num(o)	0	/* no conversion from strings to numbers */
     27 #endif
     28 
     29 
     30 /*
     31 ** You can define LUA_FLOORN2I if you want to convert floats to integers
     32 ** by flooring them (instead of raising an error if they are not
     33 ** integral values)
     34 */
     35 #if !defined(LUA_FLOORN2I)
     36 #define LUA_FLOORN2I		F2Ieq
     37 #endif
     38 
     39 
     40 /*
     41 ** Rounding modes for float->integer coercion
     42  */
     43 typedef enum {
     44   F2Ieq,     /* no rounding; accepts only integral values */
     45   F2Ifloor,  /* takes the floor of the number */
     46   F2Iceil    /* takes the ceiling of the number */
     47 } F2Imod;
     48 
     49 
     50 /* convert an object to a float (including string coercion) */
     51 #define tonumber(o,n) \
     52 	(ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n))
     53 
     54 
     55 /* convert an object to a float (without string coercion) */
     56 #define tonumberns(o,n) \
     57 	(ttisfloat(o) ? ((n) = fltvalue(o), 1) : \
     58 	(ttisinteger(o) ? ((n) = cast_num(ivalue(o)), 1) : 0))
     59 
     60 
     61 /* convert an object to an integer (including string coercion) */
     62 #define tointeger(o,i) \
     63   (l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \
     64                           : luaV_tointeger(o,i,LUA_FLOORN2I))
     65 
     66 
     67 /* convert an object to an integer (without string coercion) */
     68 #define tointegerns(o,i) \
     69   (l_likely(ttisinteger(o)) ? (*(i) = ivalue(o), 1) \
     70                           : luaV_tointegerns(o,i,LUA_FLOORN2I))
     71 
     72 
     73 #define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2))
     74 
     75 #define luaV_rawequalobj(t1,t2)		luaV_equalobj(NULL,t1,t2)
     76 
     77 
     78 /*
     79 ** fast track for 'gettable'
     80 */
     81 #define luaV_fastget(t,k,res,f, tag) \
     82   (tag = (!ttistable(t) ? LUA_VNOTABLE : f(hvalue(t), k, res)))
     83 
     84 
     85 /*
     86 ** Special case of 'luaV_fastget' for integers, inlining the fast case
     87 ** of 'luaH_getint'.
     88 */
     89 #define luaV_fastgeti(t,k,res,tag) \
     90   if (!ttistable(t)) tag = LUA_VNOTABLE; \
     91   else { luaH_fastgeti(hvalue(t), k, res, tag); }
     92 
     93 
     94 #define luaV_fastset(t,k,val,hres,f) \
     95   (hres = (!ttistable(t) ? HNOTATABLE : f(hvalue(t), k, val)))
     96 
     97 #define luaV_fastseti(t,k,val,hres) \
     98   if (!ttistable(t)) hres = HNOTATABLE; \
     99   else { luaH_fastseti(hvalue(t), k, val, hres); }
    100 
    101 
    102 /*
    103 ** Finish a fast set operation (when fast set succeeds).
    104 */
    105 #define luaV_finishfastset(L,t,v)	luaC_barrierback(L, gcvalue(t), v)
    106 
    107 
    108 /*
    109 ** Shift right is the same as shift left with a negative 'y'
    110 */
    111 #define luaV_shiftr(x,y)	luaV_shiftl(x,intop(-, 0, y))
    112 
    113 
    114 
    115 LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2);
    116 LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r);
    117 LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r);
    118 LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n);
    119 LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode);
    120 LUAI_FUNC int luaV_tointegerns (const TValue *obj, lua_Integer *p,
    121                                 F2Imod mode);
    122 LUAI_FUNC int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode);
    123 LUAI_FUNC lu_byte luaV_finishget (lua_State *L, const TValue *t, TValue *key,
    124                                                 StkId val, lu_byte tag);
    125 LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key,
    126                                              TValue *val, int aux);
    127 LUAI_FUNC void luaV_finishOp (lua_State *L);
    128 LUAI_FUNC void luaV_execute (lua_State *L, CallInfo *ci);
    129 LUAI_FUNC void luaV_concat (lua_State *L, int total);
    130 LUAI_FUNC lua_Integer luaV_idiv (lua_State *L, lua_Integer x, lua_Integer y);
    131 LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y);
    132 LUAI_FUNC lua_Number luaV_modf (lua_State *L, lua_Number x, lua_Number y);
    133 LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y);
    134 LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb);
    135 
    136 #endif