public static ASBinCode.RightValueBase getDefaultValue(ASBinCode.RunTimeDataType type) { switch (type) { case rt.rt_boolean: return(new ASBinCode.rtData.RightValue(ASBinCode.rtData.rtBoolean.False)); case rt.rt_int: return(new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtInt(0))); case rt.rt_uint: return(new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtUInt(0))); case rt.rt_number: return(new ASBinCode.rtData.RightValue(new ASBinCode.rtData.rtNumber(double.NaN))); case rt.rt_string: return(new ASBinCode.rtData.RightValue(ASBinCode.rtData.rtNull.nullptr)); case rt.rt_void: case rt.fun_void: return(new ASBinCode.rtData.RightValue(ASBinCode.rtData.rtUndefined.undefined)); case rt.rt_null: case rt.rt_function: case rt.rt_array: return(new ASBinCode.rtData.RightValue(ASBinCode.rtData.rtNull.nullptr)); case rt.unknown: return(null); default: return(new ASBinCode.rtData.RightValue(ASBinCode.rtData.rtNull.nullptr)); } }
/// <summary> /// /// </summary> /// <param name="line"></param> /// <param name="ptr"></param> /// <param name="srcFile"></param> /// <param name="f"></param> /// <param name="t"></param> /// <param name="classfinder"></param> /// <param name="type">0--变量 1--访问器 2--参数</param> public BuildTypeError(int line, int ptr, string srcFile, ASBinCode.RunTimeDataType f, ASBinCode.RunTimeDataType t, ASBinCode.IClassFinder classfinder, int type = 0) : base(line, ptr, srcFile, null) { string ft = f.toAS3Name(); string tt = t.toAS3Name(); if (f > ASBinCode.RunTimeDataType.unknown) { var fc = classfinder.getClassByRunTimeDataType(f); ft = fc.package + (string.IsNullOrEmpty(fc.package)?"":".") + fc.name; } if (t > ASBinCode.RunTimeDataType.unknown) { var fc = classfinder.getClassByRunTimeDataType(t); tt = fc.package + (string.IsNullOrEmpty(fc.package) ? "" : ".") + fc.name; } if (type == 0) { errorMsg = "不能将[" + ft + "]类型赋值给[" + tt + "]类型的变量"; } else if (type == 1) { errorMsg = "不能将[" + ft + "]类型赋值给[" + tt + "]类型的访问器"; } else { errorMsg = "不能将[" + ft + "]类型传递给[" + tt + "]类型的参数"; } //errorMsg = "不能将[" + ft + "]类型赋值给[" + tt+ "]类型的" + (var_or_gettersetter?"访问器":"变量") ; }
public static rt getImplicitOpType(ASBinCode.RunTimeDataType v1, ASBinCode.RunTimeDataType v2, ASBinCode.OpCode op, ASBinCode.IClassFinder lib) { if (v1 > rt.unknown) { if (ObjectImplicit_ToNumber(v1, lib)) { v1 = rt.rt_number; } } if (v2 > rt.unknown) { if (ObjectImplicit_ToNumber(v2, lib)) { v2 = rt.rt_number; } } if (op == ASBinCode.OpCode.add) { if (v1 > rt.unknown || v2 > rt.unknown) { //**执行动态计算 return(rt.rt_void); } return(implicit_opadd_coverttable[(int)v1, (int)v2]); } else if (op == ASBinCode.OpCode.sub) { if (v1 > rt.unknown || v2 > rt.unknown) { return(rt.unknown); } return(implicit_opsub_coverttable[(int)v1, (int)v2]); } else if (op == ASBinCode.OpCode.multi || op == ASBinCode.OpCode.div || op == ASBinCode.OpCode.mod) { if (v1 > rt.unknown || v2 > rt.unknown) { return(rt.unknown); } return(implicit_opmulti_coverttable[(int)v1, (int)v2]); } else { return(rt.unknown); } }
/// <summary> /// 是否已经手工绑定。 /// </summary> /// <param name="type"></param> /// <returns></returns> public static bool IsSkipCreator(Type type) { if (type == null) { return(true); } if (Equals(type, typeof(Type))) { return(true); } if (type.IsArray) { return(IsSkipCreator(type.GetElementType())); } ASBinCode.RunTimeDataType rttype = MethodNativeCodeCreator.GetAS3Runtimetype(type); if (rttype < ASBinCode.RunTimeDataType._OBJECT) { return(true); } string fn = type.FullName; if (fn == "System.ValueType") { return(true); } if (SkipCreateTypes.Contains(fn)) { return(true); } return(false); }
/// <summary> /// 比较值src是否和值dst类型匹配 /// </summary> /// <param name="src"></param> /// <param name="dst"></param> /// <returns></returns> public static bool testTypeMatch(ASBinCode.RunTimeValueBase src, ASBinCode.RunTimeDataType dsttype, ASBinCode.IClassFinder classfinder) { if (src.rtType > rt.unknown && dsttype > rt.unknown) { return(ASBinCode.ClassMemberFinder.check_isinherits(src, dsttype, classfinder)); } if (dsttype == rt.rt_void || src.rtType == dsttype) { return(true); } if (src.rtType == rt.rt_number && dsttype == rt.rt_int) { double v = ((ASBinCode.rtData.rtNumber)src).value; if (v == (int)(long)v) { return(true); } } if (src.rtType == rt.rt_number && dsttype == rt.rt_uint) { double v = ((ASBinCode.rtData.rtNumber)src).value; if (v == (uint)(long)v) { return(true); } } if (src.rtType == rt.rt_int || src.rtType == rt.rt_uint) { return(dsttype == rt.rt_number); } return(false); }
public string GetAS3TypeString(Type type, Dictionary <Type, string> typeimports, Type checktype, System.Reflection.MethodBase checkmethod, System.Reflection.ParameterInfo checkparameter) { if (type.IsByRef) { if (!typeimports.ContainsValue("import as3runtime.RefOutStore;")) { typeimports.Add(typeof(ASRuntime.nativefuncs.linksystem.RefOutStore), "import as3runtime.RefOutStore;"); } return(GetAS3TypeString(type.GetElementType(), typeimports, checktype, checkmethod, checkparameter)); } if (checkparameter != null) { if (checkmethod.DeclaringType == typeof(System.Collections.IList) || isMapToInterface(checkmethod, typeof(System.Collections.IList)) != null ) { if (isMapToInterface(checkmethod, typeof(System.Collections.IList)) != null) { checkmethod = isMapToInterface(checkmethod, typeof(System.Collections.IList)); } if (checkmethod.Name == "set_Item" && checkparameter.Name == "value") { return("*"); } else if (checkmethod.Name == "Add") { return("*"); } else if (checkmethod.Name == "Contains") { return("*"); } else if (checkmethod.Name == "IndexOf") { return("*"); } else if (checkmethod.Name == "Insert" && checkparameter.Name == "value") { return("*"); } else if (checkmethod.Name == "Remove") { return("*"); } } if (checkmethod.DeclaringType == typeof(System.Collections.IDictionary) || isMapToInterface(checkmethod, typeof(System.Collections.IDictionary)) != null ) { if (isMapToInterface(checkmethod, typeof(System.Collections.IDictionary)) != null) { checkmethod = isMapToInterface(checkmethod, typeof(System.Collections.IDictionary)); } if (checkmethod.Name == "get_Item" && checkparameter.Name == "key") { return("Object"); } else if (checkmethod.Name == "set_Item" && checkparameter.Name == "value") { return("*"); } else if (checkmethod.Name == "set_Item" && checkparameter.Name == "key") { return("Object"); } else if (checkmethod.Name == "Add" && checkparameter.Name == "key") { return("Object"); } else if (checkmethod.Name == "Add" && checkparameter.Name == "value") { return("*"); } else if (checkmethod.Name == "Contains") { return("Object"); } else if (checkmethod.Name == "Remove") { return("Object"); } } } if (checktype == typeof(System.Collections.IEnumerator)) { if (checkmethod.Name == "System.Collections.IEnumerator.get_Current" || checkmethod.Name == "get_Current" ) { return("*"); } } else if (checktype == typeof(System.Collections.IList)) { if (checkmethod.Name == "get_Item" || checkmethod.Name == "System.Collections.IList.get_Item" ) { return("*"); } } else if (checktype == typeof(System.Collections.IDictionary)) { if (checkmethod.Name == "get_Item" || checkmethod.Name == "System.Collections.IDictionary.get_Item" ) { return("*"); } } else if (checktype == typeof(System.Collections.IDictionaryEnumerator)) { if (checkmethod.Name == "get_Key" || isMapToInterface(checkmethod, typeof(System.Collections.IDictionaryEnumerator)) != null ) { return("Object"); } else if (checkmethod.Name == "get_Value" || isMapToInterface(checkmethod, typeof(System.Collections.IDictionaryEnumerator)) != null ) { return("*"); } } if (type.Equals(typeof(ASBinCode.RunTimeValueBase))) { return("*"); } ASBinCode.RunTimeDataType rttype = MethodNativeCodeCreator.GetAS3Runtimetype(type); if (rttype == ASBinCode.RunTimeDataType.fun_void) { return("void"); } else if (rttype == ASBinCode.RunTimeDataType.rt_number) { return("Number"); } else if (rttype == ASBinCode.RunTimeDataType.rt_int) { return("int"); } else if (rttype == ASBinCode.RunTimeDataType.rt_uint) { return("uint"); } else if (rttype == ASBinCode.RunTimeDataType.rt_boolean) { return("Boolean"); } else if (rttype == ASBinCode.RunTimeDataType.rt_string) { return("String"); } do { if (type == typeof(Type)) { break; } if (type == typeof(Array) || type.IsArray) { if (!typeimports.ContainsValue("import system._Array_;")) { typeimports.Add(typeof(Array), "import system._Array_;"); } } else if (this.type.Namespace != type.Namespace) { if (!typeimports.ContainsKey(type)) { typeimports.Add(type, "import " + type.Namespace.ToLower() + "." + GetAS3ClassOrInterfaceName(type) + ";"); } } } while (false); string name = GetAS3ClassOrInterfaceName(type); return(name); }
/// <summary> /// 隐式类型转换表 /// </summary> /// <param name="f"></param> /// <param name="t"></param> /// <returns></returns> public static bool testImplicitConvert(ASBinCode.RunTimeDataType f, ASBinCode.RunTimeDataType t, ASBinCode.IClassFinder classfinder) { if (f == t) { return(true); } if (f > rt.unknown && t == rt.rt_boolean) { return(true); } if (f > rt.unknown && t == ASBinCode.RunTimeDataType.rt_void) { return(true); } if (f == rt.rt_void && t > rt.unknown) { return(true); } if (f == rt.rt_null && t > rt.unknown) { return(true); } if (f > rt.unknown && t < rt.unknown) { rt outtype; if (Object_CanImplicit_ToPrimitive(f, classfinder, out outtype)) { f = outtype; } else { return(false); } } if (f < rt.unknown && t > rt.unknown) { if (t == rt._OBJECT) { return(true); } var tc = classfinder.getClassByRunTimeDataType(t); if (tc.staticClass != null) { tc = tc.staticClass; } else { return(false); } if (tc.implicit_from != null) { return(testImplicitConvert(f, tc.implicit_from_type, classfinder)); } else { return(false); } } if (f == rt.unknown || t == rt.unknown) { return(false); } if (f > rt.unknown || t > rt.unknown) { var c1 = classfinder.getClassByRunTimeDataType(f); var c2 = classfinder.getClassByRunTimeDataType(t); //if (ReferenceEquals(c1.staticClass, c2) // || // ReferenceEquals(c2.staticClass,c1) // ) //{ // return false; //} if (ASBinCode.ClassMemberFinder.isInherits(c1, c2)) //检查继承关系 { return(true); } if (ASBinCode.ClassMemberFinder.isImplements(c1, c2)) //检查接口实现关系 { return(true); } return(false); } return(implicitcoverttable[(int)f, (int)t]); }