Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
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?"访问器":"变量") ;
        }
Exemplo n.º 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);
            }
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
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]);
        }