private static bool TryGetValue(Type t, lua_State L, int idx, Dictionary<IntPtr,LuaDotNetObjectProxy> proxiedByUserdata, out object value)
{
if (t.IsPrimitive)
{
if (t == typeof(Boolean))
{
if (InvokeLua.lua_type(L, idx) != InvokeLua.LUA_TBOOLEAN)
{
value = null;
return false;
}
value = InvokeLua.lua_toboolean(L, idx);
return true;
}
if (t == typeof(Char))
{
switch (InvokeLua.lua_type(L, idx))
{
case InvokeLua.LUA_TNUMBER:
value = (char)InvokeLua.lua_tonumber(L, idx);
return true;
case InvokeLua.LUA_TSTRING:
if (InvokeLua.lua_strlen(L, idx) == (UIntPtr)1)
{
value = InvokeLua.lua_tostring(L, idx)[0];
return true;
}
break;
}
value = null;
return false;
}
if (t == typeof(Byte) || t == typeof(SByte) || t == typeof(Int16) || t == typeof(UInt16)
|| t == typeof(Int32) || t == typeof(UInt32) || t == typeof(Int64) || t == typeof(UInt64)
|| t == typeof(Single) || t == typeof(Double) || t == typeof(Decimal))
{
if (!InvokeLua.lua_isnumber(L, idx))
{
value = null;
return false;
}
}
value = null;
return false;
}
else
{
if (InvokeLua.lua_isnil(L, idx))
{
value = null;
return true;
}
if (!InvokeLua.lua_isuserdata(L, idx) || InvokeLua.lua_islightuserdata(L, idx))
{
value = null;
return false;
}
LuaDotNetObjectProxy proxy;
if (proxiedByUserdata.TryGetValue(InvokeLua.lua_touserdata(L, idx), out proxy))
{
if (proxy.ProxyObject.GetType() == t)
{
value = proxy.ProxyObject;
return true;
}
}
value = null;
return false;
}
}