/// <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 bool Object_CanImplicit_ToPrimitive(rt classtype, ASBinCode.IClassFinder bin, out rt primitiveType) { if (classtype < rt.unknown) { primitiveType = rt.unknown; return(false); } var _class = bin.getClassByRunTimeDataType(classtype); return(Object_CanImplicit_ToPrimitive(_class, out primitiveType)); }
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); } }
public static bool ObjectImplicit_ToNumber(rt classtype, ASBinCode.IClassFinder bin) { if (classtype < rt.unknown) { return(false); } var _class = bin.getClassByRunTimeDataType(classtype); if (_class.staticClass == null) { return(false); } if (_class.staticClass.implicit_to != null) { var to = _class.staticClass.implicit_to_type; return(to == rt.rt_int || to == rt.rt_uint || to == rt.rt_number); } return(false); }
/// <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]); }
/// <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); }