Lua 5.3.3 error

Socius Decennalis
Decennium
Joined
Sep 27, 2006
Messages
560
Reaction score
95
I've been working on a project and wanted to update my lua to use 5.3.3 and LUA_GLOBALSINDEX is no longer used in lua so the work around from what i've read online is now stored at a special index in the registry.

CODE:
Code:
std::unordered_map< QString, QType::TypeTable >::iterator i;
    for( i = QType::type_hash.begin(); i != QType::type_hash.end(); ++i )
    {
        QType::TypeTable& type = i->second;
        std::unordered_map<QString,int>::iterator j;
        for( j = type.str_to_id_.begin(); j != type.str_to_id_.end(); ++j )
        {
            lua_pushstring( gState, j->first.c_str() );
            lua_pushnumber( gState, j->second );
            lua_settable( gState, LUA_GLOBALSINDEX );

        }
    }

Code:
//
    // Register unit props.
    //
    for( u_int i = 0; i < IMAX; i++ )
    {
        lua_pushstring( gState, QUnit::unit_props_[i]->name_.c_str() );
        lua_pushnumber( gState, i );
        lua_settable( gState, LUA_GLOBALSINDEX );
        //fix maybe lua_settable( gState, i );
    }

Code:
void QScriptEnv::setGlobalInt( const char* varName, int i )
{
    CHK_LUA_STACK;

    lua_pushstring( gState, varName );
    lua_pushnumber( gState, i );
    lua_settable( gState, LUA_GLOBALSINDEX );
}

void QScriptEnv::setGlobalFloat( const char* varName, float f )
{

    lua_pushstring( gState, varName );
    lua_pushnumber( gState, f );
    lua_settable( gState, LUA_GLOBALSINDEX );
}

void QScriptEnv::setGlobalBool( const char* varName, bool b )
{

    CHK_LUA_STACK;

    lua_pushstring( gState, varName );
    lua_pushboolean( gState, b?1:0 );
    lua_settable( gState, LUA_GLOBALSINDEX );
}

void QScriptEnv::setGlobalString( const char* varName, const char* s )
{

    CHK_LUA_STACK;

    lua_pushstring( gState, varName );
    lua_pushstring( gState, s );
    lua_settable( gState, LUA_GLOBALSINDEX );
}

int    QScriptEnv::getGlobalInt( const char* varName )
{

    CHK_LUA_STACK;

    lua_pushstring(gState, varName );
    lua_gettable( gState, LUA_GLOBALSINDEX );
    int r = (int)lua_tonumber( gState, -1 );
    lua_pop( gState, 1 );

    return r;
}

float QScriptEnv::getGlobalFloat( const char* varName )
{

    CHK_LUA_STACK;

    lua_pushstring(gState, varName );
    lua_gettable( gState, LUA_GLOBALSINDEX );
    float r = (float)lua_tonumber( gState, -1 );
    lua_pop( gState, 1 );

    return r;
}

bool QScriptEnv::getGlobalBool( const char* varName )
{

    CHK_LUA_STACK;

    lua_pushstring(gState, varName );
    lua_gettable( gState, LUA_GLOBALSINDEX );
    int r = lua_toboolean( gState, -1 );
    lua_pop( gState, 1 );

    return r?true:false;
}

QString    QScriptEnv::getGlobalString( const char* varName )
{

    CHK_LUA_STACK;

    lua_pushstring(gState, varName );
    lua_gettable( gState, LUA_GLOBALSINDEX );
    QString r = lua_tostring( gState, -1 );
    lua_pop( gState, 1 );

    return r;
}

void QScriptEnv::removeGlobal( const char* varName )
{

    CHK_LUA_STACK;

    lua_pushstring( gState, varName );
    lua_pushnil( gState );
    lua_settable( gState, LUA_GLOBALSINDEX );
}

bool QScriptEnv::callGEProc( const char* procName, QController* receiver, GEParam* params, int param_num, bool& ret, QString& errMsg )
{

    CHK_LUA_STACK;

    lua_pushstring( gState, procName );
    lua_gettable( gState, LUA_GLOBALSINDEX );

    // pass receiver.
    lua_pushnumber( gState, receiver->script_handle_ );

    // pass the parameters
    for(int i = 0; i < param_num; i++)
    {
        switch(params[i].type_)
        {
        case GEP_FLOAT:
            lua_pushnumber( gState, params[i].value_.f );
            break;
        case GEP_INT:
            lua_pushnumber( gState, params[i].value_.i );
            break;
        case GEP_BOOL:
            lua_pushboolean( gState, params[i].value_.b?1:0 );
            break;
        case GEP_PTR:
            if( params[i].value_.p == NULL)
                lua_pushnil( gState );
            else
                lua_pushnumber( gState, params[i].value_.p->script_handle_ );
            break;
        }        
    }
    int r = lua_pcall( gState, param_num+1, 1, 0 );

    SCRIPT_CHK_ERR;

    // Get return.
    ret = lua_toboolean( gState, -1 )?true:false;
    lua_pop( gState, 1 );

    return true;
}

bool QScriptEnv::callGEProc( const char* procName, int id, GEParam* params, int param_num, QString& errMsg )
{

    CHK_LUA_STACK;

    lua_pushstring( gState, procName );
    lua_gettable( gState, LUA_GLOBALSINDEX );

    // pass receiver.
    lua_pushnumber( gState, id );

    // pass the parameters
    for(int i = 0; i < param_num; i++)
    {
        switch(params[i].type_)
        {
        case GEP_FLOAT:
            lua_pushnumber( gState, params[i].value_.f );
            break;
        case GEP_INT:
            lua_pushnumber( gState, params[i].value_.i );
            break;
        case GEP_BOOL:
            lua_pushboolean( gState, params[i].value_.b?1:0 );
            break;
        case GEP_PTR:
            if( params[i].value_.p == NULL)
                lua_pushnil( gState );
            else
                lua_pushnumber( gState, params[i].value_.p->script_handle_ );// for safe.
            break;
        }        
    }
    int r = lua_pcall( gState, param_num+1, 0, 0 );

    SCRIPT_CHK_ERR;

    return true;
}

bool QScriptEnv::callGMCmd( QPlayerController* player, const char* cmd, const char* params, QString& errMsg )
{
    CHK_LUA_STACK;

    lua_pushstring( gState, cmd );
    lua_gettable( gState, LUA_GLOBALSINDEX );

    // Parse params.
    lua_pushnumber( gState, player->script_handle_ );
    int param_num = 1;
    QString                    param;
    while( QParser::getToken( params, param ) )
    {
        if( param.length() && param[0] >= 48 && param[0] <= 57 )
            lua_pushnumber( gState, atof( param.c_str() ) );
        else
            lua_pushstring( gState, param.c_str() );
        param_num++;
    }

    int r = lua_pcall( gState, param_num, 0, 0 );

    SCRIPT_CHK_ERR;

    return true;
}
 
Back