Skip to content

Commit

Permalink
Merge pull request #369 from sgrenier/master
Browse files Browse the repository at this point in the history
Fixed Lua memory leaks
  • Loading branch information
sgrenier committed Aug 29, 2012
2 parents 62c29a7 + 38fe287 commit 38e3c3c
Show file tree
Hide file tree
Showing 99 changed files with 2,043 additions and 1,904 deletions.
71 changes: 31 additions & 40 deletions gameplay-luagen/src/FunctionBinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ static inline void outputBindingInvocation(ostream& o, const FunctionBinding& b,
static inline void outputGetParam(ostream& o, const FunctionBinding::Param& p, int i, int indentLevel, bool offsetIndex = false);
static inline void outputMatchedBinding(ostream& o, const FunctionBinding& b, unsigned int paramCount, unsigned int indentLevel);
static inline void outputReturnValue(ostream& o, const FunctionBinding& b, int indentLevel);

static inline std::string getTypeName(const FunctionBinding::Param& param);

FunctionBinding::Param::Param(FunctionBinding::Param::Type type, Kind kind, const string& info) :
type(type), kind(kind), info(info), hasDefaultValue(false)
Expand Down Expand Up @@ -450,66 +450,55 @@ bool FunctionBinding::signaturesMatch(const FunctionBinding& b1, const FunctionB
return false;
}

ostream& operator<<(ostream& o, const FunctionBinding::Param& param)
static inline std::string getTypeName(const FunctionBinding::Param& param)
{
switch (param.type)
{
case FunctionBinding::Param::TYPE_VOID:
o << "void";
break;
return "void";
case FunctionBinding::Param::TYPE_BOOL:
o << "bool";
break;
return "bool";
case FunctionBinding::Param::TYPE_CHAR:
o << "char";
break;
return "char";
case FunctionBinding::Param::TYPE_SHORT:
o << "short";
break;
return "short";
case FunctionBinding::Param::TYPE_INT:
o << "int";
break;
return "int";
case FunctionBinding::Param::TYPE_LONG:
o << "long";
break;
return "long";
case FunctionBinding::Param::TYPE_UCHAR:
o << "unsigned char";
break;
return "unsigned char";
case FunctionBinding::Param::TYPE_USHORT:
o << "unsigned short";
break;
return "unsigned short";
case FunctionBinding::Param::TYPE_UINT:
o << "unsigned int";
break;
return "unsigned int";
case FunctionBinding::Param::TYPE_ULONG:
o << "unsigned long";
break;
return "unsigned long";
case FunctionBinding::Param::TYPE_FLOAT:
o << "float";
break;
return "float";
case FunctionBinding::Param::TYPE_DOUBLE:
o << "double";
break;
return "double";
case FunctionBinding::Param::TYPE_ENUM:
o << Generator::getInstance()->getIdentifier(param.info);
break;
return Generator::getInstance()->getIdentifier(param.info).c_str();
case FunctionBinding::Param::TYPE_STRING:
if (param.info == "string")
o << "std::string";
return "std::string";
else
o << "const char";
break;
return "const char";
case FunctionBinding::Param::TYPE_OBJECT:
case FunctionBinding::Param::TYPE_CONSTRUCTOR:
o << Generator::getInstance()->getIdentifier(param.info);
break;
return Generator::getInstance()->getIdentifier(param.info).c_str();
case FunctionBinding::Param::TYPE_UNRECOGNIZED:
o << param.info;
break;
return param.info.c_str();
case FunctionBinding::Param::TYPE_DESTRUCTOR:
default:
break;
return "";
}
}

ostream& operator<<(ostream& o, const FunctionBinding::Param& param)
{
o << getTypeName(param);

if (param.kind == FunctionBinding::Param::KIND_POINTER)
o << "*";
Expand Down Expand Up @@ -735,7 +724,11 @@ static inline void outputGetParam(ostream& o, const FunctionBinding::Param& p, i
case FunctionBinding::Param::TYPE_STRING:
case FunctionBinding::Param::TYPE_ENUM:
indent(o, indentLevel);
o << p << " param" << i + 1 << " = ";
if (p.kind == FunctionBinding::Param::KIND_POINTER)
o << "ScriptUtil::LuaArray<" << getTypeName(p) << ">";
else
o << p;
o << " param" << i + 1 << " = ";
break;
default:
// Ignore these cases.
Expand Down Expand Up @@ -820,9 +813,7 @@ static inline void outputGetParam(ostream& o, const FunctionBinding::Param& p, i
break;
case FunctionBinding::Param::TYPE_OBJECT:
indent(o, indentLevel);
o << p;
if (p.kind != FunctionBinding::Param::KIND_POINTER)
o << "*";
o << "ScriptUtil::LuaArray<" << getTypeName(p) << ">";
o << " param" << i + 1 << " = ";
o << "ScriptUtil::getObjectPointer<";
o << Generator::getInstance()->getIdentifier(p.info) << ">(" << paramIndex;
Expand Down
39 changes: 20 additions & 19 deletions gameplay/src/ScriptController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,34 @@
if (!lua_istable(sc->_lua, index)) \
{ \
if (lua_islightuserdata(sc->_lua, index)) \
return (type*)lua_touserdata(sc->_lua, index); \
return LuaArray<type>((type*)lua_touserdata(sc->_lua, index)); \
lua_pushfstring(sc->_lua, "Expected a " #type " pointer (an array represented as a Lua table), got '%s' instead.", \
luaL_typename(sc->_lua, index)); \
lua_error(sc->_lua); \
return NULL; \
return LuaArray<type>((type*)NULL); \
} \
\
/* Get the size of the array. */ \
lua_len(sc->_lua, index); \
int size = luaL_checkint(sc->_lua, -1); \
if (size <= 0) \
return NULL; \
return LuaArray<type>((type*)NULL); \
\
/* Create an array to store the values. */ \
type* values = (type*)malloc(sizeof(type)*size); \
/* Declare a LuaArray to store the values. */ \
LuaArray<type> arr(size); \
\
/* Push the first key. */ \
lua_pushnil(sc->_lua); \
int i = 0; \
for (; lua_next(sc->_lua, index) != 0 && i < size; i++) \
{ \
values[i] = (checkFunc(sc->_lua, -1)); \
arr[i] = (checkFunc(sc->_lua, -1)); \
\
/* Remove the value we just retrieved, but leave the key for the next iteration. */ \
lua_pop(sc->_lua, 1); \
} \
\
return values
return arr

namespace gameplay
{
Expand Down Expand Up @@ -260,52 +260,52 @@ void ScriptUtil::addStringFromEnumConversionFunction(luaStringEnumConversionFunc
Game::getInstance()->getScriptController()->_stringFromEnum.push_back(stringFromEnum);
}

bool* ScriptUtil::getBoolPointer(int index)
ScriptUtil::LuaArray<bool> ScriptUtil::getBoolPointer(int index)
{
GENERATE_LUA_GET_POINTER(bool, luaCheckBool);
}

short* ScriptUtil::getShortPointer(int index)
ScriptUtil::LuaArray<short> ScriptUtil::getShortPointer(int index)
{
GENERATE_LUA_GET_POINTER(short, (short)luaL_checkint);
}

int* ScriptUtil::getIntPointer(int index)
ScriptUtil::LuaArray<int> ScriptUtil::getIntPointer(int index)
{
GENERATE_LUA_GET_POINTER(int, (int)luaL_checkint);
}

long* ScriptUtil::getLongPointer(int index)
ScriptUtil::LuaArray<long> ScriptUtil::getLongPointer(int index)
{
GENERATE_LUA_GET_POINTER(long, (long)luaL_checkint);
}

unsigned char* ScriptUtil::getUnsignedCharPointer(int index)
ScriptUtil::LuaArray<unsigned char> ScriptUtil::getUnsignedCharPointer(int index)
{
GENERATE_LUA_GET_POINTER(unsigned char, (unsigned char)luaL_checkunsigned);
}

unsigned short* ScriptUtil::getUnsignedShortPointer(int index)
ScriptUtil::LuaArray<unsigned short> ScriptUtil::getUnsignedShortPointer(int index)
{
GENERATE_LUA_GET_POINTER(unsigned short, (unsigned short)luaL_checkunsigned);
}

unsigned int* ScriptUtil::getUnsignedIntPointer(int index)
ScriptUtil::LuaArray<unsigned int> ScriptUtil::getUnsignedIntPointer(int index)
{
GENERATE_LUA_GET_POINTER(unsigned int, (unsigned int)luaL_checkunsigned);
}

unsigned long* ScriptUtil::getUnsignedLongPointer(int index)
ScriptUtil::LuaArray<unsigned long> ScriptUtil::getUnsignedLongPointer(int index)
{
GENERATE_LUA_GET_POINTER(unsigned long, (unsigned long)luaL_checkunsigned);
}

float* ScriptUtil::getFloatPointer(int index)
ScriptUtil::LuaArray<float> ScriptUtil::getFloatPointer(int index)
{
GENERATE_LUA_GET_POINTER(float, (float)luaL_checknumber);
}

double* ScriptUtil::getDoublePointer(int index)
ScriptUtil::LuaArray<double> ScriptUtil::getDoublePointer(int index)
{
GENERATE_LUA_GET_POINTER(double, (double)luaL_checknumber);
}
Expand Down Expand Up @@ -540,8 +540,8 @@ ScriptController::~ScriptController()
}

static const char* lua_print_function =
"function print(...)\n"
" ScriptController.print(table.concat({...},\"\\t\"), \"\\n\")\n"
"function print(...)\n"
" ScriptController.print(table.concat({...},\"\\t\"), \"\\n\")\n"
"end\n";

void ScriptController::initialize()
Expand Down Expand Up @@ -739,6 +739,7 @@ void ScriptController::executeFunctionHelper(int resultCount, const char* func,
}
default:
GP_ERROR("Invalid argument type '%d'.", *(sig - 1));
break;
}

argumentCount++;
Expand Down
Loading

0 comments on commit 38e3c3c

Please sign in to comment.