예제 #1
0
        public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success)
        {
            success = true;

            LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)thisObj).value;

            (returnSlot).setValue((int)lo.GetLinkData());
        }
        public override void execute2(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT[] argements,SLOT returnSlot,SourceToken token,object stackframe,out bool success)
        {
            //base.execute2(thisObj, functionDefine, argements, returnSlot, stackframe, out success);
            success = true;

            var a1 = argements[0].getValue();
            var a2 = argements[1].getValue();

            if (a1.rtType == a2.rtType && a1.rtType == RunTimeDataType.rt_null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
                return;
            }


            ASBinCode.rtData.rtObjectBase obj = a1 as ASBinCode.rtData.rtObjectBase;
            if (obj == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }

            LinkSystemObject o1 = obj.value as LinkSystemObject;

            if (o1 == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }


            ASBinCode.rtData.rtObjectBase obj2 = a2 as ASBinCode.rtData.rtObjectBase;
            if (obj2 == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }

            LinkSystemObject o2 = obj2.value as LinkSystemObject;

            if (o2 == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }

            if (object.ReferenceEquals(o1.GetLinkData(),o2.GetLinkData()))
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
                return;
            }
            else
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }
        }
예제 #3
0
        //public override NativeFunctionMode mode
        //{
        //    get
        //    {
        //        return NativeFunctionMode.normal_1;
        //    }
        //}

        //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements, object stackframe, out string errormessage, out int errorno)
        //{
        //    throw new NotImplementedException();
        //}

        //public override void execute2(RunTimeValueBase thisObj,
        //    FunctionDefine functionDefine,
        //    SLOT[] argements,
        //    SLOT returnSlot,
        //    SourceToken token,
        //    object stackframe, out bool success)
        //{
        //    LinkObj<T> lobj = (LinkObj<T>)((ASBinCode.rtData.rtObject)thisObj).value;

        //    StackFrame frame = (StackFrame)stackframe;

        //    var arg = argements[0].getValue();
        //    if (arg.rtType == RunTimeDataType.rt_null)
        //    {
        //        ((StackSlot)returnSlot).setValue(lobj.value.CompareTo(null));
        //    }
        //    else
        //    {
        //        LinkSystemObject argObj = (LinkSystemObject)((ASBinCode.rtData.rtObject)arg).value;
        //        ((StackSlot)returnSlot).setValue(lobj.value.CompareTo(argObj.GetLinkData()));

        //    }
        //    success = true;
        //}

        public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success)
        {
            LinkObj <T> lobj = (LinkObj <T>)((ASBinCode.rtData.rtObjectBase)thisObj).value;

            StackFrame frame = stackframe;

            var arg = argements[0];

            if (arg.rtType == RunTimeDataType.rt_null)
            {
                (returnSlot).setValue(lobj.value.CompareTo(null));
            }
            else
            {
                LinkSystemObject argObj = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)arg).value;
                (returnSlot).setValue(lobj.value.CompareTo(argObj.GetLinkData()));
            }
            success = true;
        }
        public bool rtValueToLinkObject
            (RunTimeValueBase value,Type linkType,IClassFinder bin,bool needclone,out object linkobject)
        {
            RunTimeDataType vt = value.rtType;

            if (vt == RunTimeDataType.rt_null)
            {
                linkobject = null;
                return(true);
            }

            if (vt > RunTimeDataType.unknown)
            {
                var cls = bin.getClassByRunTimeDataType(vt);

                RunTimeDataType ot;
                if (TypeConverter.Object_CanImplicit_ToPrimitive(
                        cls,out ot
                        ))
                {
                    vt    = ot;
                    value = TypeConverter.ObjectImplicit_ToPrimitive((ASBinCode.rtData.rtObjectBase)value);
                }
                else if (linkType is AS3Class_Type && cls.staticClass == null)
                {
                    if (cls.getRtType() == ((AS3Class_Type)linkType).rttype)
                    {
                        linkobject = ((AS3Class_Type)linkType).linktype;
                        return(true);
                    }
                }
            }
            RunTimeDataType at =
                getRuntimeDataType(
                    linkType);

            if (at == RunTimeDataType.rt_int)
            {
                linkobject = (TypeConverter.ConvertToInt(value));
            }
            else if (at == RunTimeDataType.rt_uint)
            {
                linkobject = (TypeConverter.ConvertToUInt(value,null,null));
            }
            else if (at == RunTimeDataType.rt_string)
            {
                linkobject = (TypeConverter.ConvertToString(value,null,null));
            }
            else if (at == RunTimeDataType.rt_number)
            {
                linkobject = (TypeConverter.ConvertToNumber(value));
            }
            else if (at == RunTimeDataType.rt_boolean)
            {
                var b = TypeConverter.ConvertToBoolean(value,null,null);
                linkobject = b.value;
            }
            else if (at == RunTimeDataType.rt_array)
            {
                linkobject = (ASBinCode.rtData.rtArray)value;
            }
            else if (at == RunTimeDataType.rt_function)
            {
                if (needclone)
                {
                    linkobject = (ASBinCode.rtData.rtFunction)value;
                }
                else
                {
                    linkobject = ((ASBinCode.rtData.rtFunction)value).Clone();
                }
            }
            else if (at == _OBJECT_LINK)
            {
                if (vt > RunTimeDataType.unknown)
                {
                    if (needclone)
                    {
                        linkobject = ((ASBinCode.rtData.rtObjectBase)value).Clone();
                    }
                    else
                    {
                        linkobject = (ASBinCode.rtData.rtObjectBase)value;
                    }
                }
                else
                {
                    if (needclone)
                    {
                        linkobject = value.Clone();
                    }
                    else
                    {
                        linkobject = value;
                    }
                }
            }
            else if (at > RunTimeDataType.unknown)
            {
                if (vt > RunTimeDataType.unknown)
                {
                    Class c = bin.getClassByRunTimeDataType(vt);
                    if (c.isLink_System)
                    {
                        LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value;
                        linkobject = lo.GetLinkData();
                    }
                    else if (c.isCrossExtend)
                    {
                        LinkSystemObject lo = (LinkSystemObject)((ASBinCode.rtData.rtObjectBase)value).value;
                        linkobject = lo.GetLinkData();
                    }
                    else if (c.staticClass == null)
                    {
                        if (c.instanceClass.isCrossExtend)
                        {
                            //***isCrossExtend Class转换为 基础类型的type
                            var sc = c.instanceClass.super;
                            while (!sc.isLink_System)
                            {
                                sc = sc.super;
                            }

                            var nf = (ICrossExtendAdapterCreator)swc.getNativeFunction(((ClassMethodGetter)sc.crossExtendAdapterCreator.bindField).functionId);

                            linkobject = nf.GetAdapterType();
                        }
                        else
                        {
                            linkobject = null;
                            return(false);
                        }
                    }
                    else
                    {
                        linkobject = null;
                        return(false);
                    }
                }
                else if (at == _objectType_) //托管object
                {
                    if (vt == RunTimeDataType.rt_int)
                    {
                        linkobject = (TypeConverter.ConvertToInt(value));
                    }
                    else if (vt == RunTimeDataType.rt_uint)
                    {
                        linkobject = (TypeConverter.ConvertToUInt(value,null,null));
                    }
                    else if (vt == RunTimeDataType.rt_string)
                    {
                        linkobject = (TypeConverter.ConvertToString(value,null,null));
                    }
                    else if (vt == RunTimeDataType.rt_number)
                    {
                        linkobject = (TypeConverter.ConvertToNumber(value));
                    }
                    else if (vt == RunTimeDataType.rt_boolean)
                    {
                        var b = TypeConverter.ConvertToBoolean(value,null,null);
                        linkobject = b.value;
                    }
                    else if (vt == RunTimeDataType.rt_void)
                    {
                        linkobject = null;
                    }
                    else
                    {
                        linkobject = null;
                        return(false);
                    }
                }
                else
                {
                    linkobject = null;
                    return(false);
                }
            }
            else
            {
                linkobject = null;
                return(false);
            }

            return(true);
        }
        public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success)
        {
            if (argements[0].rtType == RunTimeDataType.rt_null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "不能为null");

                return;
            }
            else if (argements[0].rtType < RunTimeDataType.unknown)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "应该是托管数组");

                return;
            }

            LinkSystemObject indicesObj = ((ASBinCode.rtData.rtObjectBase)argements[0]).value as LinkSystemObject;

            if (indicesObj == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "应该是托管数组");

                return;
            }
            int[] indices = indicesObj.GetLinkData() as int[];
            if (indices == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "应该是托管数组int[]");

                return;
            }

            Array array =
                (Array)((LinkObj <object>)((ASBinCode.rtData.rtObjectBase)thisObj).value).value;

            try
            {
                object obj = array.GetValue(indices);
                stackframe.player.linktypemapper.storeLinkObject_ToSlot(obj,functionDefine.signature.returnType,returnSlot,bin,stackframe.player);
                //returnSlot.setValue((int)array.GetValue(index));
                success = true;
            }
            catch (RuntimeLinkTypeMapper.TypeLinkClassException tlc)
            {
                success = false;
                stackframe.throwAneException(token,tlc.Message);
            }
            catch (KeyNotFoundException)
            {
                success = false;
                stackframe.throwAneException(token,array.ToString() + "没有链接到脚本");
            }
            catch (ArgumentException a)
            {
                success = false;
                stackframe.throwAneException(token,a.Message);
            }
            catch (IndexOutOfRangeException i)
            {
                success = false;
                stackframe.throwAneException(token,i.Message);
            }
        }
        public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success)
        {
            success = true;

            if (argements[0].rtType == RunTimeDataType.rt_null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[0].name + "不能为null");

                return;
            }

            Class cls = bin.getClassByRunTimeDataType(argements[0].rtType).instanceClass;

            if (argements[1].rtType == RunTimeDataType.rt_null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "不能为null");

                return;
            }
            else if (argements[1].rtType < RunTimeDataType.unknown)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组");

                return;
            }

            LinkSystemObject lengthsObj = ((ASBinCode.rtData.rtObjectBase)argements[1]).value as LinkSystemObject;

            if (lengthsObj == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组");

                return;
            }
            int[] lengths = lengthsObj.GetLinkData() as int[];
            if (lengths == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组int[]");

                return;
            }

            //int length = TypeConverter.ConvertToInt(argements[1], stackframe, token);

            Class _array_ = ((ASBinCode.rtData.rtObjectBase)thisObj).value._class;

            var arr = stackframe.player.alloc_pureHostedOrLinkedObject(_array_.instanceClass);

            LinkSystemObject lo = (LinkSystemObject)arr.value;


            try
            {
                RunTimeDataType et = cls.getRtType();
                RunTimeDataType ot;
                if (TypeConverter.Object_CanImplicit_ToPrimitive(cls,out ot))
                {
                    et = ot;
                }

                Type elementType = stackframe.player.linktypemapper.getLinkType(et);
                lo.SetLinkData(Array.CreateInstance(elementType,lengths));

                returnSlot.directSet(arr);
            }
            catch (KeyNotFoundException)
            {
                success = false;
                stackframe.throwArgementException(token,"类型" + cls + "不是一个链接到系统类库的对象,不能创建托管数组");
            }
            catch (ArgumentOutOfRangeException a)
            {
                success = false;
                stackframe.throwAneException(token,a.Message);
            }
            catch
            {
                throw new EngineException();
            }
        }
        public override void execute3(RunTimeValueBase thisObj,FunctionDefine functionDefine,SLOT returnSlot,SourceToken token,StackFrame stackframe,out bool success)
        {
            if (argements[1].rtType == RunTimeDataType.rt_null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "不能为null");

                return;
            }
            else if (argements[1].rtType < RunTimeDataType.unknown)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组");

                return;
            }

            LinkSystemObject indicesObj = ((ASBinCode.rtData.rtObjectBase)argements[1]).value as LinkSystemObject;

            if (indicesObj == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组");

                return;
            }
            int[] indices = indicesObj.GetLinkData() as int[];
            if (indices == null)
            {
                success = false;
                stackframe.throwArgementException(token,"参数" + functionDefine.signature.parameters[1].name + "应该是托管数组int[]");

                return;
            }


            Array array =
                (Array)((LinkObj <object>)((ASBinCode.rtData.rtObjectBase)thisObj).value).value;

            try
            {
                object lo;
                if (stackframe.player.linktypemapper.rtValueToLinkObject(
                        argements[0],array.GetType().GetElementType(),bin,true,out lo
                        ))
                {
                    array.SetValue(lo,indices);
                    returnSlot.setValue(ASBinCode.rtData.rtUndefined.undefined);
                    success = true;
                }
                else
                {
                    stackframe.throwCastException(token,argements[0].rtType,
                                                  stackframe.player.linktypemapper.getRuntimeDataType(array.GetType().GetElementType())
                                                  );
                    success = false;
                }
            }
            catch (RuntimeLinkTypeMapper.TypeLinkClassException tlc)
            {
                success = false;
                stackframe.throwAneException(token,tlc.Message);
            }
            catch (InvalidCastException ic)
            {
                success = false;
                stackframe.throwAneException(token,ic.Message);
            }
            catch (ArgumentException a)
            {
                success = false;
                stackframe.throwAneException(token,a.Message);
            }
            catch (IndexOutOfRangeException i)
            {
                success = false;
                stackframe.throwAneException(token,i.Message);
            }
        }