コード例 #1
0
        public static bool isCatchError(int tryid, ASBinCode.RunTimeValueBase throwValue, ASBinCode.OpStep step, ASBinCode.RunTimeScope scope, StackFrame frame)
        {
            int id = ((ASBinCode.rtData.rtInt)((ASBinCode.rtData.RightValue)step.arg1).getValue(null, null)).value;

            if (tryid == id)
            {
                return(TypeConverter.testTypeMatch(throwValue, step.regType, frame.player.swc));
            }
            return(false);
        }
コード例 #2
0
        public static double ConvertToNumber(ASBinCode.RunTimeValueBase src)
        {
            return(src.toNumber());
            //switch (src.rtType)
            //{
            //    case rt.rt_boolean:
            //        if (((ASBinCode.rtData.rtBoolean)src).value == true)
            //        {
            //            return 1;// new ASBinCode.rtData.rtNumber(1);
            //        }
            //        else
            //        {
            //            return 0;// ASBinCode.rtData.rtNumber.zero;
            //        }
            //    case rt.rt_int:
            //        return ((ASBinCode.rtData.rtInt)src).value;// new ASBinCode.rtData.rtNumber(((ASBinCode.rtData.rtInt)src).value);
            //    case rt.rt_uint:
            //        return ((ASBinCode.rtData.rtUInt)src).value;// new ASBinCode.rtData.rtNumber(((ASBinCode.rtData.rtUInt)src).value);

            //    case rt.rt_number:
            //        return ((ASBinCode.rtData.rtNumber)src).value; //(ASBinCode.rtData.rtNumber)src;

            //    case rt.rt_string:
            //        {
            //            double r = 0;
            //            if (((ASBinCode.rtData.rtString)src).value == null)
            //            {
            //                return 0;// new ASBinCode.rtData.rtNumber(0);
            //            }
            //            else if (double.TryParse(((ASBinCode.rtData.rtString)src).value, out r))
            //            {
            //                return r;//new ASBinCode.rtData.rtNumber(r);
            //            }
            //            else
            //            {
            //                return double.NaN; //new ASBinCode.rtData.rtNumber(double.NaN);
            //            }
            //        }
            //    case rt.rt_void:
            //    case rt.fun_void:
            //        return double.NaN; //new ASBinCode.rtData.rtNumber(double.NaN);

            //    case rt.rt_null:
            //        return 0;// new ASBinCode.rtData.rtNumber(0);
            //    case rt.rt_function:
            //    case rt.rt_array:
            //        return double.NaN;
            //    case rt.unknown:
            //        return double.NaN;
            //    default:
            //        return double.NaN;// null;

            //}
        }
コード例 #3
0
ファイル: Iterator.cs プロジェクト: liuhong520/myHotUpdate
        internal Iterator(ASBinCode.RunTimeValueBase v, Player player)
        {
            this.player = player;

            if (v.rtType > ASBinCode.RunTimeDataType.unknown)
            {
                var cls = player.swc.getClassByRunTimeDataType(v.rtType);
                if (cls.isLink_System)
                {
                    var lobj = ((ASBinCode.rtti.LinkSystemObject)((ASBinCode.rtData.rtObjectBase)v).value).GetLinkData();

                    if (lobj is System.Collections.IEnumerator)
                    {
                        innerenumerator = (System.Collections.IEnumerator)lobj;
                    }
                    else if (lobj is System.Collections.IEnumerable)
                    {
                        innerenumerator = ((System.Collections.IEnumerable)lobj).GetEnumerator();
                    }
                    else
                    {
                        throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator");
                    }
                }
                else if (ASRuntime.TypeConverter.testImplicitConvert(v.rtType, player.swc.IEnumeratorInterface.getRtType(), player.swc))
                {
                    as3ienumerator = (ASBinCode.rtData.rtObjectBase)v;
                    get_current    = player.getMethod(as3ienumerator, "@current_get");
                    movenext       = player.getMethod(as3ienumerator, "moveNext");
                    reset          = player.getMethod(as3ienumerator, "reset");
                }
                else if (ASRuntime.TypeConverter.testImplicitConvert(v.rtType, player.swc.IEnumerableInterface.getRtType(), player.swc))
                {
                    var getenumerator = player.getMethod((ASBinCode.rtData.rtObjectBase)v, "getEnumerator");
                    as3ienumerator = (ASBinCode.rtData.rtObjectBase)player.InvokeFunction(getenumerator, 0, null, null, null, null, null, null);
                    get_current    = player.getMethod(as3ienumerator, "@current_get");
                    movenext       = player.getMethod(as3ienumerator, "moveNext");
                    reset          = player.getMethod(as3ienumerator, "reset");
                }
                else
                {
                    throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator");
                }
            }
            else
            {
                throw new InvalidCastException("不能将" + v.ToString() + "包装为Iterator");
            }
        }
コード例 #4
0
        /// <summary>
        /// 测试索引器类型是否匹配
        /// </summary>
        /// <returns></returns>
        public static bool testIndexGetSetMatch(ASBinCode.RunTimeValueBase src, rt dsttype, ASBinCode.CSWC swc)
        {
            if (src.rtType > rt.unknown && dsttype > rt.unknown)
            {
                return(ASBinCode.ClassMemberFinder.check_isinherits(src.rtType, dsttype, swc));
            }

            if (dsttype == rt.rt_void || dsttype == swc.ObjectClass.getRtType() ||
                src.rtType == dsttype)
            {
                return(true);
            }

            if (swc.LinkObjectClass != null)
            {
                if (dsttype == swc.LinkObjectClass.getRtType())
                {
                    if (src.rtType == rt.rt_boolean || src.rtType == rt.rt_int || src.rtType == rt.rt_null || src.rtType == rt.rt_number || src.rtType == rt.rt_string || src.rtType == rt.rt_uint)
                    {
                        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 || dsttype == rt.rt_int || dsttype == rt.rt_uint);
            }


            return(false);
        }
コード例 #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);
        }
コード例 #6
0
        public static ASBinCode.rtData.rtBoolean ConvertToBoolean(ASBinCode.RunTimeValueBase src, StackFrame frame, ASBinCode.SourceToken token)
        {
            switch (src.rtType)
            {
            case rt.rt_boolean:
                return((ASBinCode.rtData.rtBoolean)src);

            case rt.rt_int:
                if (((ASBinCode.rtData.rtInt)src).value == 0)
                {
                    return(ASBinCode.rtData.rtBoolean.False);
                }
                else
                {
                    return(ASBinCode.rtData.rtBoolean.True);
                }

            case rt.rt_uint:
                if (((ASBinCode.rtData.rtUInt)src).value == 0)
                {
                    return(ASBinCode.rtData.rtBoolean.False);
                }
                else
                {
                    return(ASBinCode.rtData.rtBoolean.True);
                }

            case rt.rt_number:
            {
                double r = ((ASBinCode.rtData.rtNumber)src).value;
                if (double.IsNaN(r) || r == 0)
                {
                    return(ASBinCode.rtData.rtBoolean.False);
                }
                else
                {
                    return(ASBinCode.rtData.rtBoolean.True);
                }
            }

            case rt.rt_string:
            {
                if (string.IsNullOrEmpty(((ASBinCode.rtData.rtString)src).value))
                {
                    return(ASBinCode.rtData.rtBoolean.False);
                }
                else
                {
                    return(ASBinCode.rtData.rtBoolean.True);
                }
            }

            case rt.rt_void:
            case rt.fun_void:
                return(ASBinCode.rtData.rtBoolean.False);

            case rt.rt_null:
                return(ASBinCode.rtData.rtBoolean.False);

            case rt.rt_function:
            case rt.rt_array:
                return(ASBinCode.rtData.rtBoolean.True);

            case rt.unknown:

                return(ASBinCode.rtData.rtBoolean.False);

            default:
                //凡是大于unknown的都是对象
                return(ASBinCode.rtData.rtBoolean.True);
            }
        }
コード例 #7
0
        public static string ConvertToString(ASBinCode.RunTimeValueBase src, StackFrame frame, ASBinCode.SourceToken token)
        {
            switch (src.rtType)
            {
            case rt.rt_boolean:
                return(((ASBinCode.rtData.rtBoolean)src).ToString());   // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtBoolean)src).ToString());

            case rt.rt_int:
                return(((ASBinCode.rtData.rtInt)src).ToString());   // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtInt)src).value.ToString());

            case rt.rt_uint:
                return(((ASBinCode.rtData.rtUInt)src).value.ToString());   // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtUInt)src).value.ToString());

            case rt.rt_number:
                return(((ASBinCode.rtData.rtNumber)src).ToString());   // new ASBinCode.rtData.rtString(((ASBinCode.rtData.rtNumber)src).value.ToString());

            case rt.rt_string:
                return(((ASBinCode.rtData.rtString)src).value);   //(ASBinCode.rtData.rtString)src;

            case rt.rt_void:
                return(null);

            case rt.fun_void:
                return(ASBinCode.rtData.rtUndefined.undefined.ToString());

            case rt.rt_null:
                return(null);   //new ASBinCode.rtData.rtString(null);

            case rt.rt_function:
                return("function Function() {}");

            case rt.rt_array:
                return(((ASBinCode.rtData.rtArray)src).ToString());

            case rt.unknown:
                return(null);

            default:
            {
                //ASBinCode.rtData.rtObject obj = (ASBinCode.rtData.rtObject)src;
                //var toStr = (ASBinCode.ClassMemberFinder.find(obj.value._class, "toString", obj.value._class));
                //if (toStr.type == rt.rt_function && !toStr.isStatic && toStr.isPublic
                //    && !toStr.isConstructor
                //    )
                //{
                //    operators.FunctionCaller fc = new operators.FunctionCaller(frame.player, frame, token);
                //    fc.function = (ASBinCode.rtData.rtFunction)obj.value.memberData[toStr.index].getValue();
                //    fc.loadDefineFromFunction();
                //    fc.createParaScope();
                //    fc.returnSlot = frame._tempSlot;
                //    fc.call();

                //    if (frame.player.step_toblockend())
                //    {
                //        return ConvertToString(fc.returnSlot.getValue(), frame, token, isthrow);
                //    }
                //    else
                //    {
                //        return null;
                //    }
                //}
                //else
                {
                    return(((ASBinCode.rtData.rtObjectBase)src).value.ToString());
                }
            }


                //return "object " + ((ASBinCode.rtData.rtObject)src).value._class.name;
            }
        }
コード例 #8
0
        public static uint ConvertToUInt(ASBinCode.RunTimeValueBase src, StackFrame frame, ASBinCode.SourceToken token)
        {
            switch (src.rtType)
            {
            case rt.rt_boolean:
                if (((ASBinCode.rtData.rtBoolean)src).value == true)
                {
                    return(1);   // new ASBinCode.rtData.rtUInt(1);
                }
                else
                {
                    return(0);   // ASBinCode.rtData.rtUInt.zero;
                }

            case rt.rt_int:
                return((uint)((ASBinCode.rtData.rtInt)src).value);   // new ASBinCode.rtData.rtUInt((uint)((ASBinCode.rtData.rtInt)src).value);

            case rt.rt_uint:
                return(((ASBinCode.rtData.rtUInt)src).value);    //(ASBinCode.rtData.rtUInt)src;

            case rt.rt_number:
            {
                double r = ((ASBinCode.rtData.rtNumber)src).value;
                if (double.IsNaN(r) || double.IsInfinity(r))
                {
                    return(0);       // new ASBinCode.rtData.rtUInt(0);
                }
                else
                {
                    return((uint)((long)r));       // new ASBinCode.rtData.rtUInt((uint)r);
                }
            }

            case rt.rt_string:
            {
                double r = 0;
                if (((ASBinCode.rtData.rtString)src).value == null)
                {
                    return(0);       // new ASBinCode.rtData.rtUInt(0);
                }
                else if (double.TryParse(((ASBinCode.rtData.rtString)src).value, out r))
                {
                    if (double.IsNaN(r) || double.IsInfinity(r))
                    {
                        return(0);       // new ASBinCode.rtData.rtUInt(0);
                    }
                    else
                    {
                        return((uint)((long)r));       // new ASBinCode.rtData.rtUInt((uint)r);
                    }
                }
                else
                {
                    return(0);       // new ASBinCode.rtData.rtUInt(0);
                }
            }

            case rt.rt_void:
            case rt.fun_void:
                return(0);   // new ASBinCode.rtData.rtUInt(0);

            case rt.rt_null:
                return(0);   // new ASBinCode.rtData.rtUInt(0);

            case rt.unknown:
            case rt.rt_function:
            case rt.rt_array:
            default:
                return(0);
            }
        }
コード例 #9
0
        public static int ConvertToInt(ASBinCode.RunTimeValueBase src)
        {
            switch (src.rtType)
            {
            case rt.rt_boolean:
                if (((ASBinCode.rtData.rtBoolean)src).value == true)
                {
                    return(1);   // new ASBinCode.rtData.rtInt(1);
                }
                else
                {
                    return(0);   // ASBinCode.rtData.rtInt.zero;
                }

            case rt.rt_int:
                return(((ASBinCode.rtData.rtInt)src).value);    //(ASBinCode.rtData.rtInt)src;

            case rt.rt_uint:
                return((int)((ASBinCode.rtData.rtUInt)src).value);    //new ASBinCode.rtData.rtInt((int)((ASBinCode.rtData.rtUInt)src).value  );

            case rt.rt_number:
            {
                double r = ((ASBinCode.rtData.rtNumber)src).value;
                if (double.IsNaN(r) || double.IsInfinity(r))
                {
                    return(0);        //new ASBinCode.rtData.rtInt(0);
                }
                else
                {
                    return((int)((long)r));
                    //new ASBinCode.rtData.rtInt((int)r);
                }
            }

            case rt.rt_string:
            {
                double r = 0;
                if (((ASBinCode.rtData.rtString)src).value == null)
                {
                    return(0);       // new ASBinCode.rtData.rtInt(0);
                }
                else if (double.TryParse(((ASBinCode.rtData.rtString)src).value, out r))
                {
                    if (double.IsNaN(r) || double.IsInfinity(r))
                    {
                        return(0);       // new ASBinCode.rtData.rtInt(0);
                    }
                    else
                    {
                        return((int)((long)r));       // new ASBinCode.rtData.rtInt((int)r);
                    }
                }
                else
                {
                    return(0);       // new ASBinCode.rtData.rtInt(0);
                }
            }

            case rt.rt_void:
            case rt.fun_void:
                return(0);   // new ASBinCode.rtData.rtInt(0);

            case rt.rt_null:
            case rt.rt_function:
            case rt.rt_array:
                return(0);   // new ASBinCode.rtData.rtInt(0);

            case rt.unknown:
            default:
                //if (isthrow)
                //{
                //    frame.throwCastException(token, rt.unknown, rt.rt_int);
                //}
                return(0);
            }
        }