internal ExtractValue checkType(IntPtr luaState, int stackPos, Type paramType)
{
LuaTypes luatype = LuaDLL.lua_type(luaState, stackPos);
if (paramType.IsByRef)
{
paramType = paramType.GetElementType();
}
Type underlyingType = Nullable.GetUnderlyingType(paramType);
if (underlyingType != null)
{
paramType = underlyingType; // Silently convert nullable types to their non null requics
}
long runtimeHandleValue = paramType.TypeHandle.Value.ToInt64();
if (paramType.Equals(typeof(object)))
{
return(extractValues[runtimeHandleValue]);
}
//CP: Added support for generic parameters
if (paramType.IsGenericParameter)
{
if (luatype == LuaTypes.LUA_TBOOLEAN)
{
return(extractValues[typeof(bool).TypeHandle.Value.ToInt64()]);
}
else if (luatype == LuaTypes.LUA_TSTRING)
{
return(extractValues[typeof(string).TypeHandle.Value.ToInt64()]);
}
else if (luatype == LuaTypes.LUA_TTABLE)
{
return(extractValues[typeof(LuaTable).TypeHandle.Value.ToInt64()]);
}
else if (luatype == LuaTypes.LUA_TUSERDATA)
{
return(extractValues[typeof(object).TypeHandle.Value.ToInt64()]);
}
else if (luatype == LuaTypes.LUA_TFUNCTION)
{
return(extractValues[typeof(LuaFunction).TypeHandle.Value.ToInt64()]);
}
else if (luatype == LuaTypes.LUA_TNUMBER)
{
return(extractValues[typeof(double).TypeHandle.Value.ToInt64()]);
}
//else // suppress CS0642
; //an unsupported type was encountered
}
if (paramType.IsValueType && luatype == LuaTypes.LUA_TTABLE)
{
int oldTop = LuaDLL.lua_gettop(luaState);
ExtractValue ret = null;
LuaDLL.lua_pushvalue(luaState, stackPos);
LuaDLL.lua_pushstring(luaState, "class");
LuaDLL.lua_gettable(luaState, -2);
if (!LuaDLL.lua_isnil(luaState, -1))
{
string cls = LuaDLL.lua_tostring(luaState, -1);
if (cls == "Vector3" && paramType == typeof(Vector3))
{
ret = extractValues[typeof(Vector3).TypeHandle.Value.ToInt64()];
}
else if (cls == "Vector2" && paramType == typeof(Vector2))
{
ret = extractValues[typeof(Vector2).TypeHandle.Value.ToInt64()];
}
else if (cls == "Quaternion" && paramType == typeof(Quaternion))
{
ret = extractValues[typeof(Quaternion).TypeHandle.Value.ToInt64()];
}
else if (cls == "Color" && paramType == typeof(Color))
{
ret = extractValues[typeof(Color).TypeHandle.Value.ToInt64()];
}
else if (cls == "Vector4" && paramType == typeof(Vector4))
{
ret = extractValues[typeof(Vector4).TypeHandle.Value.ToInt64()];
}
else if (cls == "Ray" && paramType == typeof(Ray))
{
ret = extractValues[typeof(Ray).TypeHandle.Value.ToInt64()];
}
else
{
ret = null;
}
}
LuaDLL.lua_settop(luaState, oldTop);
if (ret != null)
{
return(ret);
}
}
if (LuaDLL.lua_isnumber(luaState, stackPos))
{
return(extractValues[runtimeHandleValue]);
}
if (paramType == typeof(bool))
{
if (LuaDLL.lua_isboolean(luaState, stackPos))
{
return(extractValues[runtimeHandleValue]);
}
}
else if (paramType == typeof(string))
{
if (LuaDLL.lua_isstring(luaState, stackPos))
{
return(extractValues[runtimeHandleValue]);
}
else if (luatype == LuaTypes.LUA_TNIL)
{
return(extractNetObject); // kevinh - silently convert nil to a null string pointer
}
}
else if (paramType == typeof(LuaTable))
{
if (luatype == LuaTypes.LUA_TTABLE)
{
return(extractValues[runtimeHandleValue]);
}
}
else if (paramType == typeof(LuaFunction))
{
if (luatype == LuaTypes.LUA_TFUNCTION)
{
return(extractValues[runtimeHandleValue]);
}
}
else if (typeof(Delegate).IsAssignableFrom(paramType) && luatype == LuaTypes.LUA_TFUNCTION)
{
#if __NOGEN__
translator.throwError(luaState, "Delegates not implemnented");
#else
return(new ExtractValue(new DelegateGenerator(translator, paramType).extractGenerated));
#endif
}
else if (paramType.IsInterface && luatype == LuaTypes.LUA_TTABLE)
{
#if __NOGEN__
translator.throwError(luaState, "Interfaces not implemnented");
#else
return(new ExtractValue(new ClassGenerator(translator, paramType).extractGenerated));
#endif
}
else if ((paramType.IsInterface || paramType.IsClass) && luatype == LuaTypes.LUA_TNIL)
{
// kevinh - allow nil to be silently converted to null - extractNetObject will return null when the item ain't found
return(extractNetObject);
}
else if (LuaDLL.lua_type(luaState, stackPos) == LuaTypes.LUA_TTABLE)
{
if (LuaTypes.LUA_TNIL != LuaDLL.luaL_getmetafield(luaState, stackPos, "__index"))
{
object obj = translator.getNetObject(luaState, -1);
LuaDLL.lua_settop(luaState, -2);
if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
{
return(extractNetObject);
}
}
}
else
{
//object obj = translator.getNetObject(luaState, stackPos); //topameng 修改这里使支持注册到c#的lua类
object obj = translator.getRawNetObject(luaState, stackPos);
if (obj != null && paramType.IsAssignableFrom(obj.GetType()))
{
return(extractNetObject);
}
}
return(null);
}