public bool Assignable(RealStatePtr L, int index, Type type) { if (LuaAPI.lua_type(L, index) == LuaTypes.LUA_TUSERDATA) // 快路径 { int udata = LuaAPI.xlua_tocsobj_safe(L, index); object obj; if (udata != -1 && objects.TryGetValue(udata, out obj)) { return(type.IsAssignableFrom(obj.GetType())); } int type_id = LuaAPI.xlua_gettypeid(L, index); Type type_of_struct; if (type_id != -1 && typeMap.TryGetValue(type_id, out type_of_struct)) // is struct { return(type.IsAssignableFrom(type_of_struct)); } } return(objectCheckers.GetChecker(type)(L, index)); }
static int _m_GetChecker(RealStatePtr L) { try { ObjectTranslator translator = ObjectTranslatorPool.Instance.Find(L); XLua.ObjectCheckers gen_to_be_invoked = (XLua.ObjectCheckers)translator.FastGetCSObj(L, 1); { System.Type _type = (System.Type)translator.GetObject(L, 2, typeof(System.Type)); XLua.ObjectCheck gen_ret = gen_to_be_invoked.GetChecker(_type); translator.Push(L, gen_ret); return(1); } } catch (System.Exception gen_e) { return(LuaAPI.luaL_error(L, "c# exception:" + gen_e)); } }
public void Init(ObjectCheckers objCheckers, ObjectCasters objCasters) { if (typeof(Delegate).IsAssignableFrom(targetType) || !method.IsStatic || method.IsConstructor) { luaStackPosStart = 2; if (!method.IsConstructor) { targetNeeded = true; } } var paramInfos = method.GetParameters(); refPos = new int[paramInfos.Length]; List<int> inPosList = new List<int>(); List<int> outPosList = new List<int>(); List<ObjectCheck> paramsChecks = new List<ObjectCheck>(); List<ObjectCast> paramsCasts = new List<ObjectCast>(); List<bool> isOptionalList = new List<bool>(); List<object> defaultValueList = new List<object>(); for(int i = 0; i < paramInfos.Length; i++) { refPos[i] = -1; if (!paramInfos[i].IsIn && paramInfos[i].IsOut) // out parameter { outPosList.Add(i); } else { if(paramInfos[i].ParameterType.IsByRef) { var ttype = paramInfos[i].ParameterType.GetElementType(); if(CopyByValue.IsStruct(ttype) && ttype != typeof(decimal)) { refPos[i] = inPosList.Count; } outPosList.Add(i); } inPosList.Add(i); var paramType = paramInfos[i].IsDefined(typeof(ParamArrayAttribute), false) || (!paramInfos[i].ParameterType.IsArray && paramInfos[i].ParameterType.IsByRef ) ? paramInfos[i].ParameterType.GetElementType() : paramInfos[i].ParameterType; paramsChecks.Add (objCheckers.GetChecker(paramType)); paramsCasts.Add (objCasters.GetCaster(paramType)); isOptionalList.Add(paramInfos[i].IsOptional); var defalutValue = paramInfos[i].DefaultValue; if (paramInfos[i].IsOptional) { if (defalutValue != null && defalutValue.GetType() != paramInfos[i].ParameterType) { defalutValue = defalutValue.GetType() == typeof(Missing) ? Activator.CreateInstance(paramInfos[i].ParameterType) : Convert.ChangeType(defalutValue, paramInfos[i].ParameterType); } HasDefalutValue = true; } defaultValueList.Add(paramInfos[i].IsOptional ? defalutValue : null); } } checkArray = paramsChecks.ToArray(); castArray = paramsCasts.ToArray(); inPosArray = inPosList.ToArray(); outPosArray = outPosList.ToArray(); isOptionalArray = isOptionalList.ToArray(); defaultValueArray = defaultValueList.ToArray(); if (paramInfos.Length > 0 && paramInfos[paramInfos.Length - 1].IsDefined(typeof(ParamArrayAttribute), false)) { paramsType = paramInfos[paramInfos.Length - 1].ParameterType.GetElementType(); } args = new object[paramInfos.Length]; if (method is MethodInfo) //constructor is not MethodInfo? { isVoid = (method as MethodInfo).ReturnType == typeof(void); } else if(method is ConstructorInfo) { isVoid = false; } }
public void Init(ObjectCheckers objCheckers, ObjectCasters objCasters) { if (typeof(Delegate).IsAssignableFrom(targetType) || !method.IsStatic || method.IsConstructor) { luaStackPosStart = 2; if (!method.IsConstructor) { targetNeeded = true; } } var paramInfos = method.GetParameters(); refPos = new int[paramInfos.Length]; List <int> inPosList = new List <int>(); List <int> outPosList = new List <int>(); List <ObjectCheck> paramsChecks = new List <ObjectCheck>(); List <ObjectCast> paramsCasts = new List <ObjectCast>(); List <bool> isOptionalList = new List <bool>(); List <object> defaultValueList = new List <object>(); for (int i = 0; i < paramInfos.Length; i++) { refPos[i] = -1; if (!paramInfos[i].IsIn && paramInfos[i].IsOut) // out parameter { outPosList.Add(i); } else { if (paramInfos[i].ParameterType.IsByRef) { var ttype = paramInfos[i].ParameterType.GetElementType(); if (CopyByValue.IsStruct(ttype) && ttype != typeof(decimal)) { refPos[i] = inPosList.Count; } outPosList.Add(i); } inPosList.Add(i); var paramType = paramInfos[i].IsDefined(typeof(ParamArrayAttribute), false) || (!paramInfos[i].ParameterType.IsArray && paramInfos[i].ParameterType.IsByRef) ? paramInfos[i].ParameterType.GetElementType() : paramInfos[i].ParameterType; paramsChecks.Add(objCheckers.GetChecker(paramType)); paramsCasts.Add(objCasters.GetCaster(paramType)); isOptionalList.Add(paramInfos[i].IsOptional); var defalutValue = paramInfos[i].DefaultValue; if (paramInfos[i].IsOptional) { if (defalutValue != null && defalutValue.GetType() != paramInfos[i].ParameterType) { defalutValue = defalutValue.GetType() == typeof(Missing) ? Activator.CreateInstance(paramInfos[i].ParameterType) : Convert.ChangeType(defalutValue, paramInfos[i].ParameterType); } HasDefalutValue = true; } defaultValueList.Add(paramInfos[i].IsOptional ? defalutValue : null); } } checkArray = paramsChecks.ToArray(); castArray = paramsCasts.ToArray(); inPosArray = inPosList.ToArray(); outPosArray = outPosList.ToArray(); isOptionalArray = isOptionalList.ToArray(); defaultValueArray = defaultValueList.ToArray(); if (paramInfos.Length > 0 && paramInfos[paramInfos.Length - 1].IsDefined(typeof(ParamArrayAttribute), false)) { paramsType = paramInfos[paramInfos.Length - 1].ParameterType.GetElementType(); } args = new object[paramInfos.Length]; if (method is MethodInfo) //constructor is not MethodInfo? { isVoid = (method as MethodInfo).ReturnType == typeof(void); } else if (method is ConstructorInfo) { isVoid = false; } }