/** Go to the next entry in the table. \return Returns true if the iteration is done. **/ bool LuaStackTableIterator::Next() { // This function is only active if Reset() has been called head. luaplus_assert( IsValid() ); // This is a local helper variable so we don't waste space in the class // definition. LuaState* state = m_tableObj.GetState(); // Do any stack management operations. if ( m_autoStackManagement ) { state->SetTop( m_startStackIndex + 1 ); } else { // If this luaplus_assert fires, then you left something on the stack. luaplus_assert( state->GetTop() == m_startStackIndex + 1 ); } // Do the Lua table iteration. if ( state->Next( m_tableObj ) == 0 ) { // Invalidate the iterator. m_startStackIndex = -1; return false; } // The iterator is still valid. return true; }
/** Start iteration at the beginning of the table. **/ void LuaStackTableIterator::Reset() { // Start afresh... LuaState* state = m_tableObj.GetState(); m_startStackIndex = state->GetTop(); // Push the head stack entry. state->PushNil(); // Start the iteration. If the return value is 0, then the iterator // will be invalid. if ( state->Next( m_tableObj ) == 0 ) m_startStackIndex = -1; }
/** Invalidates the iterator. Call this function if you early abort from an iteration loop (such as before it hits the end). **/ void LuaStackTableIterator::Invalidate() { // See if the iterator is already invalid. if ( !IsValid() ) return; // This is a local helper variable so we don't waste space in the class // definition. LuaState* state = m_tableObj.GetState(); if ( !m_autoStackManagement ) { luaplus_assert( state->GetTop() <= m_startStackIndex + 1 ); } // Set the stack back. state->SetTop( m_startStackIndex ); // Invalidate the iterator. m_startStackIndex = -1; }
// LuaDumpObject(file, key, value, alphabetical, indentLevel, maxIndentLevel, writeAll) extern "C" int LS_LuaDumpObject( lua_State* L ) { LuaStateOutFile file; LuaState* state = lua_State_To_LuaState(L); LuaStack args(state); LuaStackObject fileObj = args[1]; if (fileObj.IsTable() && state->GetTop() == 1) { LuaObject valueObj(fileObj); LuaObject nameObj; LuaStateOutString stringFile; state->DumpObject(stringFile, NULL, valueObj, LuaState::DUMP_ALPHABETICAL, 0, -1); state->PushString(stringFile.GetBuffer()); return 1; } const char* fileName = NULL; if ( fileObj.IsUserData() ) { FILE* stdioFile = (FILE *)fileObj.GetUserData(); file.Assign( stdioFile ); } else if ( fileObj.IsString() ) { fileName = fileObj.GetString(); } LuaObject nameObj = args[2]; LuaObject valueObj = args[3]; LuaStackObject alphabeticalObj = args[4]; LuaStackObject indentLevelObj = args[5]; LuaStackObject maxIndentLevelObj = args[6]; LuaStackObject writeAllObj = args[7]; bool writeAll = writeAllObj.IsBoolean() ? writeAllObj.GetBoolean() : false; bool alphabetical = alphabeticalObj.IsBoolean() ? alphabeticalObj.GetBoolean() : true; unsigned int maxIndentLevel = maxIndentLevelObj.IsInteger() ? (unsigned int)maxIndentLevelObj.GetInteger() : 0xFFFFFFFF; unsigned int flags = (alphabetical ? LuaState::DUMP_ALPHABETICAL : 0) | (writeAll ? LuaState::DUMP_WRITEALL : 0); if (fileName) { if (strcmp(fileName, ":string") == 0) { LuaStateOutString stringFile; state->DumpObject(stringFile, nameObj, valueObj, flags, indentLevelObj.GetInteger(), maxIndentLevel); state->PushString(stringFile.GetBuffer()); return 1; } else { state->DumpObject(fileName, nameObj, valueObj, flags, (unsigned int)indentLevelObj.GetInteger(), maxIndentLevel); } } else { state->DumpObject(file, nameObj, valueObj, flags, (unsigned int)indentLevelObj.GetInteger(), maxIndentLevel); } return 0; }
Cloud::LuaStackSentry::LuaStackSentry(const LuaState& state) : m_state(state) , m_stackSize(state.GetTop()) { }