Changeset 489 for trunk/src/lib/lua.cc


Ignore:
Timestamp:
03/08/16 11:07:39 (9 years ago)
Author:
epyon
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/lua.cc

    r406 r489  
    66
    77#include "nv/lib/lua.hh"
     8
     9#if NV_LUA_VERSION == NV_LUA_5C
     10size_t( *lua_rawlen )        ( lua_State *L, int idx ) = nullptr;
     11int( *lua_absindex )      ( lua_State *L, int idx ) = nullptr;
     12void( *lua_getglobal )     ( lua_State *L, const char *var ) = nullptr;
     13void( *lua_setglobal )     ( lua_State *L, const char *var ) = nullptr;
     14void( *luaL_requiref )     ( lua_State *L, const char *modname, lua_CFunction openf, int glb ) = nullptr;
     15void( *luaL_setmetatable ) ( lua_State *L, const char *tname ) = nullptr;
     16void*  ( *luaL_testudata )    ( lua_State *L, int ud, const char *tname ) = nullptr;
     17void( *lua_copy )          ( lua_State *L, int fromidx, int toidx ) = nullptr;
     18int( *lua_compare )       ( lua_State *L, int idx1, int idx2, int op ) = nullptr;
     19void( *lua_rawgetp )       ( lua_State *L, int idx, const void *p ) = nullptr;
     20void( *lua_rawsetp )       ( lua_State *L, int idx, const void *p ) = nullptr;
     21void( *lua_pushglobaltable )( lua_State* L ) = nullptr;
     22void( *luaL_setfuncs )     ( lua_State *L, const luaL_Reg *l, int nup ) = nullptr;
     23int( *luaL_getsubtable )  ( lua_State *L, int idx, const char *fname ) = nullptr;
     24
     25const lua_Number* ( *lua_version ) ( lua_State *L ) = nullptr;
     26
     27// only loaded in 5.1 mode to implement lua_compare
     28static int( *lua_equal )        ( lua_State *L, int idx1, int idx2 ) = nullptr;
     29static int( *lua_lessthan )     ( lua_State *L, int idx1, int idx2 ) = nullptr;
     30#endif
     31
    832
    933#if defined( NV_LUA_DYNAMIC )
     
    4569#       include <nv/lib/detail/lua_functions_compat.inc>
    4670#       undef NV_LUA_COMPAT_FUN
    47 int LUA_UPVALUEINDEX  = 0;
    48 int LUA_REGISTRYINDEX = 0;
    49 int LUA_VERSION_NUM   = 0;
    50 size_t (*lua_rawlen)        (lua_State *L, int idx) = nullptr;
    51 int    (*lua_absindex)      (lua_State *L, int idx) = nullptr;
    52 void   (*lua_getglobal)     (lua_State *L, const char *var) = nullptr;
    53 void   (*lua_setglobal)     (lua_State *L, const char *var) = nullptr;
    54 void   (*luaL_requiref)     (lua_State *L, const char *modname, lua_CFunction openf, int glb) = nullptr;
    55 void   (*luaL_setmetatable) (lua_State *L, const char *tname) = nullptr;
    56 void*  (*luaL_testudata)    (lua_State *L, int ud, const char *tname) = nullptr;
    57 void   (*lua_copy)          (lua_State *L, int fromidx, int toidx) = nullptr;
    58 int    (*lua_compare)       (lua_State *L, int idx1, int idx2, int op) = nullptr;
    59 void   (*lua_rawgetp)       (lua_State *L, int idx, const void *p) = nullptr;
    60 void   (*lua_rawsetp)       (lua_State *L, int idx, const void *p) = nullptr;
    61 void   (*lua_pushglobaltable)(lua_State* L) = nullptr;
    62 void   (*luaL_setfuncs)     (lua_State *L, const luaL_Reg *l, int nup) = nullptr;
    63 int    (*luaL_getsubtable)  (lua_State *L, int idx, const char *fname) = nullptr;
    64 
    65 const lua_Number* (*lua_version) (lua_State *L) = nullptr;
    66 
    67 // only loaded in 5.1 mode to implement lua_compare
    68 static int    (*lua_equal)        (lua_State *L, int idx1, int idx2) = nullptr;
    69 static int    (*lua_lessthan)     (lua_State *L, int idx1, int idx2) = nullptr;
    70 
    7171
    7272#       define NV_LUA_COMPAT_FUN( u1,u2,u3,rt2,fn2,fp2,u4,u5 ) static rt2 (*fn2##_compat) fp2 = nullptr;
     
    7979#       undef NV_LUA_COMPAT_FUN
    8080
     81#endif
     82
     83#endif
     84
     85#if NV_LUA_VERSION == NV_LUA_5C
     86int LUA_UPVALUEINDEX = 0;
     87int LUA_REGISTRYINDEX = 0;
     88int LUA_VERSION_NUM = 0;
    8189#       define LUAI_MAXSTACK_52             1000000
    8290#       define LUAI_FIRSTPSEUDOIDX_52   (-LUAI_MAXSTACK_52 - 1000)
     
    8694#       define LUA_REGISTRYINDEX_51     (-10000)
    8795
    88 static int lua_absindex_51 (lua_State *L, int idx) { return (idx > 0 ? idx : idx + lua_gettop(L) + 1); };
    89 static void lua_getglobal_51 (lua_State *L, const char *var) { lua_getfield(L, LUA_GLOBALSINDEX_51, var ); };
    90 static void lua_setglobal_51 (lua_State *L, const char *var) { lua_setfield(L, LUA_GLOBALSINDEX_51, var ); };
    91 static void luaL_requiref_51 (lua_State *L, const char *modname, lua_CFunction openf, int glb)
    92 {
    93         lua_pushcfunction(L, openf);
    94         lua_pushstring(L, modname);
    95         lua_call(L, 1, 1);
    96         if (glb != 0)
     96static int lua_absindex_51( lua_State *L, int idx )
     97{
     98        return ( idx > 0 ? idx : idx + lua_gettop( L ) + 1 );
     99};
     100
     101static void lua_getglobal_51( lua_State *L, const char *var )
     102{
     103        lua_getfield( L, LUA_GLOBALSINDEX_51, var );
     104};
     105
     106static void lua_setglobal_51( lua_State *L, const char *var )
     107{
     108        lua_setfield( L, LUA_GLOBALSINDEX_51, var );
     109};
     110
     111static void luaL_requiref_51( lua_State *L, const char *modname, lua_CFunction openf, int glb )
     112{
     113        lua_pushcfunction( L, openf );
     114        lua_pushstring( L, modname );
     115        lua_call( L, 1, 1 );
     116        if ( glb != 0 )
    97117        {
    98118                lua_pushvalue( L, LUA_GLOBALSINDEX_51 );
    99                 lua_pushvalue(L, -2);
    100                 lua_setfield(L, -2, modname);
    101                 lua_pop(L, 1);
    102         }
    103 }
    104 
    105 static void luaL_setmetatable_51 (lua_State *L, const char *tname)
    106 {
    107         luaL_getmetatable(L, tname);
    108         lua_setmetatable(L, -2);
    109 }
    110 
    111 static void *luaL_testudata_51 (lua_State *L, int ud, const char *tname)
    112 {
    113         void *p = lua_touserdata(L, ud);
    114         if (p != NULL)
    115         { 
    116                 if (lua_getmetatable(L, ud))
     119                lua_pushvalue( L, -2 );
     120                lua_setfield( L, -2, modname );
     121                lua_pop( L, 1 );
     122        }
     123}
     124
     125static void luaL_setmetatable_51( lua_State *L, const char *tname )
     126{
     127        luaL_getmetatable( L, tname );
     128        lua_setmetatable( L, -2 );
     129}
     130
     131static void *luaL_testudata_51( lua_State *L, int ud, const char *tname )
     132{
     133        void *p = lua_touserdata( L, ud );
     134        if ( p != NULL )
     135        {
     136                if ( lua_getmetatable( L, ud ) )
    117137                {
    118                         luaL_getmetatable(L, tname);
    119                         if ( !lua_rawequal(L, -1, -2))
    120                                 p = NULL; 
    121                         lua_pop(L, 2);
     138                        luaL_getmetatable( L, tname );
     139                        if ( !lua_rawequal( L, -1, -2 ) )
     140                                p = NULL;
     141                        lua_pop( L, 2 );
    122142                        return p;
    123143                }
     
    126146}
    127147
    128 static const lua_Number *lua_version_51 (lua_State*)
     148static const lua_Number *lua_version_51( lua_State* )
    129149{
    130150        static const lua_Number version = lua_Number( LUA_VERSION_NUM );
     
    132152}
    133153
    134 static void lua_copy_51 (lua_State *L, int fromidx, int toidx)
     154static void lua_copy_51( lua_State *L, int fromidx, int toidx )
    135155{
    136156        toidx = lua_absindex( L, toidx );
     
    139159}
    140160
    141 static int lua_compare_51(lua_State *L, int idx1, int idx2, int op)
    142 {
    143         switch (op)
    144         {
    145         case LUA_OPEQ : return lua_equal( L, idx1, idx2 );
    146         case LUA_OPLT : return lua_lessthan( L, idx1, idx2 );
    147         case LUA_OPLE : return lua_lessthan( L, idx1, idx2 ) || lua_equal( L, idx1, idx2 );
     161static int lua_compare_51( lua_State *L, int idx1, int idx2, int op )
     162{
     163        switch ( op )
     164        {
     165        case LUA_OPEQ: return lua_equal( L, idx1, idx2 );
     166        case LUA_OPLT: return lua_lessthan( L, idx1, idx2 );
     167        case LUA_OPLE: return lua_lessthan( L, idx1, idx2 ) || lua_equal( L, idx1, idx2 );
    148168        default:
    149169                return 0;
     
    151171}
    152172
    153 static void lua_rawgetp_51(lua_State *L, int idx, const void *p)
     173static void lua_rawgetp_51( lua_State *L, int idx, const void *p )
    154174{
    155175        idx = lua_absindex( L, idx );
    156         void* pp = const_cast<void *>(p); // EVIL
     176        void* pp = const_cast<void *>( p ); // EVIL
    157177        lua_pushlightuserdata( L, pp );
    158178        lua_rawget( L, idx );
    159179}
    160180
    161 static void lua_rawsetp_51(lua_State *L, int idx, const void *p)
     181static void lua_rawsetp_51( lua_State *L, int idx, const void *p )
    162182{
    163183        idx = lua_absindex( L, idx );
    164         void* pp = const_cast<void *>(p); // EVIL
     184        void* pp = const_cast<void *>( p ); // EVIL
    165185        lua_pushlightuserdata( L, pp );
    166186        lua_insert( L, -1 );
     
    168188}
    169189
    170 static int luaL_getsubtable_51(lua_State *L, int idx, const char *fname)
    171 {
    172         lua_getfield(L, idx, fname);
    173         if ( lua_istable(L, -1) ) return 1;
    174         else {
    175                 idx = lua_absindex(L, idx);
    176                 lua_pop(L, 1);
    177                 lua_newtable(L);
    178                 lua_pushvalue(L, -1);
    179                 lua_setfield(L, idx, fname);
    180                 return 0;
    181         }
    182 }
    183 
    184 static void luaL_setfuncs_51(lua_State *L, const luaL_Reg *l, int nup)
    185 {
    186         luaL_checkstack(L, nup, "too many upvalues");
    187         for (; l->name != NULL; l++)
    188         {
    189                 for (int i = 0; i < nup; i++)
     190static int luaL_getsubtable_51( lua_State *L, int idx, const char *fname )
     191{
     192        lua_getfield( L, idx, fname );
     193        if ( lua_istable( L, -1 ) ) return 1;
     194        else
     195        {
     196                idx = lua_absindex( L, idx );
     197                lua_pop( L, 1 );
     198                lua_newtable( L );
     199                lua_pushvalue( L, -1 );
     200                lua_setfield( L, idx, fname );
     201                return 0;
     202        }
     203}
     204
     205static void luaL_setfuncs_51( lua_State *L, const luaL_Reg *l, int nup )
     206{
     207        luaL_checkstack( L, nup, "too many upvalues" );
     208        for ( ; l->name != NULL; l++ )
     209        {
     210                for ( int i = 0; i < nup; i++ )
    190211                {
    191                         lua_pushvalue(L, -nup);
     212                        lua_pushvalue( L, -nup );
    192213                }
    193                 lua_pushcclosure(L, l->func, nup);
    194                 lua_setfield(L, -(nup + 2), l->name);
    195         }
    196         lua_pop(L, nup);
    197 }
    198 
    199 static void lua_pushglobaltable_51(lua_State* L)
     214                lua_pushcclosure( L, l->func, nup );
     215                lua_setfield( L, -( nup + 2 ), l->name );
     216        }
     217        lua_pop( L, nup );
     218}
     219
     220static void lua_pushglobaltable_51( lua_State* L )
    200221{
    201222        lua_pushvalue( L, LUA_GLOBALSINDEX_51 );
    202223}
    203224
    204 static void lua_pushglobaltable_52(lua_State* L)
     225static void lua_pushglobaltable_52( lua_State* L )
    205226{
    206227        lua_rawgeti( L, LUA_REGISTRYINDEX_52, LUA_GLOBALSINDEX_52 );
    207228}
    208229
    209 #endif
     230
     231#endif
     232
     233#if defined( NV_LUA_DYNAMIC )
    210234
    211235bool nv::load_lua_library( const char* path )
     
    311335}
    312336
    313 #endif
     337#else
     338
     339bool nv::load_lua_library( const char* path )
     340{
     341        lua_rawlen = lua_objlen;
     342        lua_absindex = lua_absindex_51;
     343        lua_getglobal = lua_getglobal_51;
     344        lua_setglobal = lua_setglobal_51;
     345        luaL_setmetatable = luaL_setmetatable_51;
     346        luaL_testudata = luaL_testudata_51;
     347        lua_version = lua_version_51;
     348        lua_copy = lua_copy_51;
     349        lua_rawgetp = lua_rawgetp_51;
     350        lua_rawsetp = lua_rawsetp_51;
     351        lua_pushglobaltable = lua_pushglobaltable_51;
     352        luaL_setfuncs = luaL_setfuncs_51;
     353        luaL_getsubtable = luaL_getsubtable_51;
     354        luaL_requiref = luaL_requiref_51;
     355
     356        NV_LUA_LOAD( lua_lessthan );
     357        NV_LUA_LOAD( lua_equal );
     358        lua_compare = lua_compare_51;
     359        LUA_UPVALUEINDEX = LUA_GLOBALSINDEX_51;
     360        LUA_REGISTRYINDEX = LUA_REGISTRYINDEX_51;
     361        LUA_VERSION_NUM = 501;
     362        return true;
     363}
     364
     365#endif
Note: See TracChangeset for help on using the changeset viewer.