Пример #1
0
        /// <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?"访问器":"变量") ;
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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]);
        }
Пример #6
0
        /// <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);
        }