コード例 #1
0
        private void exec_step3(ASBinCode.rtData.rtObjectBase rtobject)
        {
            if (constructor == null)
            {
                objectResult = rtobject;
                //objectResult.directSet(rtobject);
                if (callbacker != null)
                {
                    callbacker.call(this);
                    callbacker = null;
                }
            }
            else
            {
                HeapSlot _temp = tempSlot; _temp.directSet(ASBinCode.rtData.rtUndefined.undefined);
                _function_constructor.returnSlot = _temp;
                //_function_constructor.function = (ASBinCode.rtData.rtFunction)TypeConverter.ObjectImplicit_ToPrimitive(constructor).Clone();
                //_function_constructor.function.setThis(rtobject);
                _function_constructor.SetFunction((ASBinCode.rtData.rtFunction)TypeConverter.ObjectImplicit_ToPrimitive(constructor),rtobject);

                BlockCallBackBase cb = player.blockCallBackPool.create();
                cb.args            = cb.cacheObjects; //new object[] { rtobject , _temp };
                cb.cacheObjects[0] = rtobject;
                cb.cacheObjects[1] = _temp;

                cb.setCallBacker(_finalStep);

                _function_constructor.callbacker = cb;
                _function_constructor.call();
                _function_constructor = null;
            }
        }
コード例 #2
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 ASRunTimeException();
        //}

        //public override void execute2(RunTimeValueBase thisObj, FunctionDefine functionDefine, SLOT[] argements, SLOT returnSlot, SourceToken token, object stackframe, out bool success)
        //{

        //    success = true;

        //    ASBinCode.rtData.rtObject obj = argements[0].getValue() as ASBinCode.rtData.rtObject;
        //    if (obj == null)
        //    {
        //        returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
        //        return;
        //    }

        //    LinkSystemObject other = obj.value as LinkSystemObject;
        //    if (other == null)
        //    {
        //        returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
        //        return;
        //    }


        //    LinkSystemObject iv = ((LinkSystemObject)((ASBinCode.rtData.rtObject)thisObj).value);

        //    if (System.Object.Equals(iv, other))
        //    {
        //        returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
        //        return;
        //    }
        //    else
        //    {
        //        returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
        //        return;
        //    }

        //}

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

            ASBinCode.rtData.rtObjectBase obj = argements[0] as ASBinCode.rtData.rtObjectBase;
            if (obj == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }

            LinkSystemObject other = obj.value as LinkSystemObject;

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


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

            if (System.Object.Equals(iv,other))
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
                return;
            }
            else
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }
        }
コード例 #3
0
        public override RunTimeValueBase execute(RunTimeValueBase thisObj,SLOT[] argements,object stackframe,out string errormessage,out int errorno)
        {
            errormessage = null;
            errorno      = 0;

            string name   = TypeConverter.ConvertToString(argements[0].getValue(),null,null);
            bool   isEnum = TypeConverter.ConvertToBoolean(argements[1].getValue(),null,null).value;

            if (string.IsNullOrEmpty(name))
            {
                return(ASBinCode.rtData.rtUndefined.undefined);
            }

            ASBinCode.rtData.rtObjectBase obj = (ASBinCode.rtData.rtObjectBase)thisObj;
            if (!(obj.value is ASBinCode.rtti.DynamicObject))
            {
                return(ASBinCode.rtData.rtUndefined.undefined);
            }

            ASBinCode.rtti.DynamicObject dobj = (ASBinCode.rtti.DynamicObject)obj.value;

            if (dobj is ASBinCode.rtti.DictionaryObject)
            {
                return(ASBinCode.rtData.rtUndefined.undefined);
            }

            if (dobj.hasproperty(name))
            {
                dobj.setPropertyIsEnumerable(name,isEnum);
            }
            return(ASBinCode.rtData.rtUndefined.undefined);
        }
コード例 #4
0
 public ObjectMemberSlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType FunctionClassRtType, RunTimeDataType slottype, IClassFinder classfinder)
 {
     this.obj                 = obj;
     this.isConstMember       = false;
     this.FunctionClassRtType = FunctionClassRtType;
     this.slottype            = slottype;
     this.classfinder         = classfinder;
 }
コード例 #5
0
        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;
            }
        }
コード例 #6
0
ファイル: OpAssigning.cs プロジェクト: ikvm/ASTool
        public static void _doSetThisItem(ASBinCode.rtData.rtObjectBase thisObj,
                                          RunTimeValueBase v,RunTimeValueBase index,StackSlot slot,StackFrame frame,OpStep step
                                          )
        {
            //***读取setter***
            RunTimeValueBase func;

            func = ((MethodGetterBase)thisObj.value._class.set_this_item.bindField).getMethod(
                thisObj
                );

            //***调用设置器***

            var funCaller = frame.player.funcCallerPool.create(frame,step.token);

            funCaller.SetFunction((ASBinCode.rtData.rtFunction)func); ((ASBinCode.rtData.rtFunction)func).Clear();
            funCaller.loadDefineFromFunction();
            if (!funCaller.createParaScope())
            {
                return;
            }

            //funCaller.releaseAfterCall = true;

            bool success;

            funCaller.pushParameter(v,0,out success);

            if (!success)
            {
                frame.endStep(step);
                return;
            }

            funCaller.pushParameter(index,1,out success);
            if (!success)
            {
                frame.endStep(step);
                return;
            }

            funCaller._tempSlot  = frame._tempSlot1;
            funCaller.returnSlot = frame._tempSlot1;

            BlockCallBackBase cb = frame.player.blockCallBackPool.create();

            cb.setCallBacker(_setthisitem_callbacker);
            cb.step = step;
            cb.args = frame;


            funCaller.callbacker = cb;
            funCaller.call();

            return;
        }
コード例 #7
0
        private static void afterCreateInstanceDataCallBacker(BlockCallBackBase sender,object args)
        {
            InstanceCreator ic = (InstanceCreator)sender.args;

            ASBinCode.rtti.Object obj      = (ASBinCode.rtti.Object)sender.cacheObjects[0];
            RunTimeScope          objScope = (RunTimeScope)sender.cacheObjects[2];

            ASBinCode.rtData.rtObjectBase rtObject = (ASBinCode.rtData.rtObjectBase)sender.cacheObjects[1];

            ic.toNoticeFailed1 = sender;
            ic.exec_step2(obj,objScope,rtObject);
            ic.toNoticeFailed1 = null;
        }
コード例 #8
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");
            }
        }
コード例 #9
0
        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;

            ASBinCode.rtData.rtObjectBase obj = argements[0].getValue() 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 = argements[1].getValue() 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 (System.Object.Equals(o1,o2))
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
                return;
            }
            else
            {
                returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                return;
            }
        }
コード例 #10
0
        public void clear()
        {
            token             = null;
            _class            = null;
            step              = null;
            callbacker        = null;
            constructorCaller = null;
            objectResult      = null;

            constructor           = null;
            _function_constructor = null;
            objectStoreToSlot     = null;

            toNoticeFailed1 = null;
            toNoticeFailed2 = null;


            tempSlot.directSet(ASBinCode.rtData.rtUndefined.undefined);
        }
コード例 #11
0
        public override RunTimeValueBase execute(RunTimeValueBase thisObj,SLOT[] argements,object stackframe,out string errormessage,out int errorno)
        {
            errormessage = null;
            errorno      = 0;

            string name = TypeConverter.ConvertToString(argements[0].getValue(),null,null);

            if (String.IsNullOrEmpty(name))
            {
                return(ASBinCode.rtData.rtBoolean.False);
            }

            //固定实例属性 — 对象类定义的非静态变量、常量或方法;
            //继承的固定实例属性 — 对象类继承的变量、常量或方法;
            //动态属性 — 对象实例化后添加到其中的属性(在其类定义之外)。要添加动态属性,必须用 dynamic 关键字声明对象的定义类。

            //return new ASBinCode.rtData.rtString(TypeConverter.ConvertToString(thisObj, null, null));

            ASBinCode.rtData.rtObjectBase obj = (ASBinCode.rtData.rtObjectBase)thisObj;

            if (ClassMemberFinder.find(obj.value._class,name,null) != null)
            {
                return(ASBinCode.rtData.rtBoolean.True);
            }

            if (obj.value is ASBinCode.rtti.DynamicObject)
            {
                ASBinCode.rtti.DynamicObject d = (ASBinCode.rtti.DynamicObject)obj.value;

                if (d.hasproperty(name))
                {
                    return(ASBinCode.rtData.rtBoolean.True);
                }
                else
                {
                    return(ASBinCode.rtData.rtBoolean.False);
                }
            }
            return(ASBinCode.rtData.rtBoolean.False);
        }
コード例 #12
0
        public override RunTimeValueBase execute(RunTimeValueBase thisObj,SLOT[] argements,object stackframe,out string errormessage,out int errorno)
        {
            errormessage = null;
            errorno      = 0;

            string name = TypeConverter.ConvertToString(argements[0].getValue(),null,null);

            if (string.IsNullOrEmpty(name))
            {
                return(ASBinCode.rtData.rtBoolean.False);
            }

            ASBinCode.rtData.rtObjectBase obj = (ASBinCode.rtData.rtObjectBase)thisObj;
            if (!(obj.value is ASBinCode.rtti.DynamicObject))
            {
                return(ASBinCode.rtData.rtBoolean.False);
            }

            ASBinCode.rtti.DynamicObject dobj = (ASBinCode.rtti.DynamicObject)obj.value;

            if (dobj.hasproperty(name))
            {
                if (dobj.propertyIsEnumerable(name))
                {
                    return(ASBinCode.rtData.rtBoolean.True);
                }
                else
                {
                    return(ASBinCode.rtData.rtBoolean.False);
                }
            }
            else
            {
                return(ASBinCode.rtData.rtBoolean.False);
            }
        }
コード例 #13
0
 public DictionarySlot(ASBinCode.rtData.rtObjectBase obj, RunTimeDataType functionClassRtType) : base(obj, functionClassRtType, RunTimeDataType.rt_void, null)
 {
     propertyIsEnumerable = false;
 }
コード例 #14
0
        public void storeLinkObject_ToSlot(object obj, RunTimeDataType defineReturnType, SLOT returnSlot,IClassFinder bin,Player player)
        {
            if (obj is ICrossExtendAdapter)
            {
                obj = ((ICrossExtendAdapter)obj).AS3Object;
            }

            if (obj == null)
            {
                returnSlot.setValue(ASBinCode.rtData.rtNull.nullptr);
            }
            else
            {
                RunTimeDataType rt = defineReturnType;                 //getLinkType(funcDefine.signature.returnType);
                //RunTimeDataType rt =
                //    getRuntimeDataType(obj.GetType());
                if (rt == RunTimeDataType.rt_void)
                {
                    rt = getRuntimeDataType(obj.GetType());

                    if (rt == _FLOAT)
                    {
                        rt = RunTimeDataType.rt_number;
                    }
                    else if (rt == _SHORT)
                    {
                        rt = RunTimeDataType.rt_int;
                    }
                    else if (rt == _USHORT)
                    {
                        rt = RunTimeDataType.rt_uint;
                    }
                }

                if (rt == _DICT_KEY)
                {
                    DictionaryKey key = (DictionaryKey)obj;
                    rt  = _OBJECT_LINK;
                    obj = key.key;
                }

                if (rt == RunTimeDataType._OBJECT)
                {
                    rt = _OBJECT_LINK;
                }
                if (rt == _OBJECT_LINK)
                {
                    rt = ((RunTimeValueBase)obj).rtType;
                    if (rt < RunTimeDataType.unknown)                    //否则走下面的Object路径
                    {
                        returnSlot.directSet((RunTimeValueBase)obj);
                        return;
                    }
                }

                if (rt == RunTimeDataType.rt_int)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_uint)
                    {
                        returnSlot.setValue((int)(uint)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_number)
                    {
                        returnSlot.setValue((int)(double)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((int)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((int)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((int)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((int)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_uint)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_int)
                    {
                        returnSlot.setValue((uint)(int)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_number)
                    {
                        returnSlot.setValue((uint)(double)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((uint)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((uint)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((uint)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((uint)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_string)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    returnSlot.setValue((string)obj);
                }
                else if (rt == RunTimeDataType.rt_number)
                {
                    var realObjType = getRuntimeDataType(obj.GetType());
                    if (realObjType == RunTimeDataType.rt_uint)
                    {
                        returnSlot.setValue((double)(uint)obj);
                    }
                    else if (realObjType == RunTimeDataType.rt_int)
                    {
                        returnSlot.setValue((double)(int)obj);
                    }
                    else if (realObjType == _FLOAT)
                    {
                        returnSlot.setValue((double)(float)obj);
                    }
                    else if (realObjType == _SHORT)
                    {
                        returnSlot.setValue((double)(short)obj);
                    }
                    else if (realObjType == _USHORT)
                    {
                        returnSlot.setValue((double)(ushort)obj);
                    }
                    else
                    {
                        returnSlot.setValue((double)obj);
                    }
                }
                else if (rt == RunTimeDataType.rt_boolean)
                {
                    if ((bool)obj)
                    {
                        returnSlot.setValue(ASBinCode.rtData.rtBoolean.True);
                    }
                    else
                    {
                        returnSlot.setValue(ASBinCode.rtData.rtBoolean.False);
                    }
                }
                else if (rt == RunTimeDataType.rt_array)
                {
                    returnSlot.directSet((ASBinCode.rtData.rtArray)obj);
                }
                else if (rt == RunTimeDataType.rt_function)
                {
                    returnSlot.directSet((ASBinCode.rtData.rtFunction)obj);
                }
                else if (rt > RunTimeDataType.unknown)
                {
                    Class rtCls;                    // = ((ASBinCode.rtData.rtObject)obj).value._class; //bin.getClassByRunTimeDataType(rt);
                    ASBinCode.rtData.rtObjectBase testObj = obj as ASBinCode.rtData.rtObjectBase;
                    if (testObj != null)
                    {
                        rtCls = ((ASBinCode.rtData.rtObjectBase)obj).value._class;

                        if (rtCls.isLink_System)
                        {
                            var f = ((CSWC)bin).class_Creator[rtCls];
                            f.setLinkObjectValueToSlot(returnSlot,player,
                                                       ((LinkSystemObject)testObj.value).GetLinkData(),rtCls);
                        }
                        else
                        {
                            returnSlot.directSet((ASBinCode.rtData.rtObjectBase)obj);
                        }
                    }
                    else
                    {
                        rtCls = bin.getClassByRunTimeDataType(rt);

                        if (rtCls.classid == player.swc.TypeClass.classid)
                        {
                            Type type = obj as Type;
                            if (type != null)
                            {
                                try
                                {
                                    var rttype = getRuntimeDataType(type);
                                    if (rttype < RunTimeDataType.unknown
                                        &&
                                        player.swc.primitive_to_class_table[rttype] != null
                                        )
                                    {
                                        rttype = player.swc.primitive_to_class_table[rttype].getRtType();
                                    }

                                    var rtcls = bin.getClassByRunTimeDataType(rttype);

                                    if (player.init_static_class(rtcls,SourceToken.Empty))
                                    {
                                        returnSlot.directSet(
                                            player.static_instance[rtcls.staticClass.classid]);
                                    }
                                    else
                                    {
                                        throw new ASRunTimeException("转换Class失败",String.Empty);
                                    }
                                }
                                catch (KeyNotFoundException)
                                {
                                    throw new TypeLinkClassException(type.FullName + " 没有链接到脚本");
                                }
                            }
                            else
                            {
                                throw new ASRunTimeException("没有将Class链接到Type",String.Empty);
                            }
                        }
                        else
                        {
                            var f = ((CSWC)bin).class_Creator[rtCls];
                            f.setLinkObjectValueToSlot(returnSlot,player,obj,rtCls);
                        }
                    }
                }
                else
                {
                    throw new ASRunTimeException("意外的链接类型",String.Empty);
                }
            }
        }
コード例 #15
0
        private static ASBinCode.rtti.Object createObject(CSWC swc,Class cls,InstanceCreator creator,
                                                          out ASBinCode.rtData.rtObjectBase rtObjectBase,
                                                          out ASBinCode.rtData.rtObjectBase linkrtobj,
                                                          out string errinfo
                                                          )
        {
            ASBinCode.rtti.Object obj = null;// = new ASBinCode.rtti.Object(cls);
            rtObjectBase = null; linkrtobj = null; errinfo = null;
            if (cls.isLink_System)
            {
                if (creator != null)
                {
                    StackSlot stackSlot = creator.objectStoreToSlot as StackSlot;
                    if (stackSlot != null)
                    {
                        rtObjectBase = stackSlot.getStackCacheObject(cls);
                        return(rtObjectBase.value);
                    }
                }


                var func = (NativeFunctionBase)swc.class_Creator[cls];

                string err; int no;
                ASBinCode.rtData.rtObjectBase rtObj =
                    func.execute(null,null,cls,out err,out no) as ASBinCode.rtData.rtObjectBase;
                linkrtobj = rtObj;
                if (rtObj == null)
                {
                    errinfo = cls.ToString() + " create linksystem object failed";
                    return(null);
                }
                else
                {
                    return(rtObj.value);
                }
            }
            else if (cls.isCrossExtend)
            {
                var scls = cls.super;
                while (!scls.isLink_System)
                {
                    scls = scls.super;
                }

                var cextend = scls.staticClass.linkObjCreator;
                var func    = swc.getNativeFunction(((ClassMethodGetter)cextend.bindField).functionId);

                if (func == null)
                {
                    errinfo = cls.ToString() + " create crossextend object failed, creator function not found";
                    return(null);
                }

                string err; int no;
                ASBinCode.rtData.rtObjectBase rtObj =
                    func.execute(null,null,cls,out err,out no) as ASBinCode.rtData.rtObjectBase;
                linkrtobj = rtObj;
                if (rtObj == null)
                {
                    errinfo = cls.ToString() + " create crossextend object failed";
                    return(null);
                }
                else
                {
                    LinkSystemObject lo = (LinkSystemObject)rtObj.value;
                    return(lo);
                }
            }
            else if (
                swc.DictionaryClass != null
                &&
                ClassMemberFinder.isInherits(cls,swc.DictionaryClass))
            {
                obj = new DictionaryObject(cls);
            }
            else if (cls.dynamic)
            {
                if (cls.isUnmanaged)
                {
                    obj = new HostedDynamicObject(cls);
                }
                else
                {
                    obj = new DynamicObject(cls);
                }
            }
            else if (cls.isUnmanaged)
            {
                obj = new HostedObject(cls);
            }
            else
            {
                obj = new ASBinCode.rtti.Object(cls);
            }

            return(obj);
        }
コード例 #16
0
 public void SetAS3RuntimeEnvironment(Player player, Class typeclass, ASBinCode.rtData.rtObjectBase bindAS3Object)
 {
     this.player        = player;
     this.typeclass     = typeclass;
     this.bindAS3Object = bindAS3Object;
 }
コード例 #17
0
        public static void _do_prop_read(
            ClassPropertyGetter prop,StackFrame frame,OpStep step,Player player,RunTimeScope scope,
            ASBinCode.rtData.rtObjectBase propBindObj,Class superPropBindClass
            )
        {
            do
            {
                //***调用访问器。***

                if (prop.getter == null)
                {
                    frame.throwError(
                        step.token,0,"Illegal read of write-only property"
                        );
                    break;
                }
                //检查访问权限
                CodeBlock block = player.swc.blocks[scope.blockId];
                Class     finder;
                if (block.isoutclass)
                {
                    var c = prop._class;
                    if (c.instanceClass != null)
                    {
                        c = c.instanceClass;
                    }
                    if (c.mainClass != null)
                    {
                        c = c.mainClass;
                    }

                    if (block.define_class_id == c.classid)
                    {
                        finder = player.swc.classes[block.define_class_id];
                    }
                    else
                    {
                        finder = null;
                    }
                }
                else
                {
                    finder = player.swc.classes[block.define_class_id];
                }

                var getter = ClassMemberFinder.find(prop._class,prop.getter.name,finder);
                if (getter == null || getter.bindField != prop.getter)
                {
                    frame.throwError(
                        step.token,0,"Illegal read of write-only property"
                        );
                    break;
                }

                //***读取getter***


                RunTimeValueBase func;

                if (superPropBindClass != null)
                {
                    func = ((MethodGetterBase)getter.bindField).getSuperMethod(
                        //propslot.bindObj.objScope
                        propBindObj.objScope,
                        superPropBindClass

                        );
                }
                else
                {
                    func = ((MethodGetterBase)getter.bindField).getMethod(
                        //propslot.bindObj.objScope
                        propBindObj
                        );
                }

                //***调用访问器***

                var funCaller = player.funcCallerPool.create(frame,step.token);
                //funCaller.releaseAfterCall = true;
                funCaller.SetFunction((ASBinCode.rtData.rtFunction)func); ((ASBinCode.rtData.rtFunction)func).Clear();

                funCaller.loadDefineFromFunction();
                if (!funCaller.createParaScope())
                {
                    return;
                }

                funCaller._tempSlot  = frame._tempSlot1;
                funCaller.returnSlot = step.reg.getSlot(scope,frame);

                ((StackSlot)funCaller.returnSlot).stackObjects.propGetSet  = prop; ((StackSlot)funCaller.returnSlot).refPropChanged = true;
                ((StackSlot)funCaller.returnSlot).stackObjects.propBindObj = propBindObj;


                BlockCallBackBase cb = frame.player.blockCallBackPool.create();
                cb.setCallBacker(D_getter_callbacker);
                cb.step = step;
                cb.args = frame;

                funCaller.callbacker = cb;
                funCaller.call();

                return;
            } while (false);


            frame.endStep(step);
        }
コード例 #18
0
        private void exec_step2(
            ASBinCode.rtti.Object obj,
            RunTimeScope objScope,ASBinCode.rtData.rtObjectBase _object)
        {
            //***添加Object的动态对象****
            if (
                //(obj._class.classid == 0)
                obj is DynamicObject &&
                obj._class.staticClass != null)
            {
                DynamicObject dobj = (DynamicObject)obj;

                if (constructor == null)
                {
                    dobj.createproperty("constructor",new DynamicPropertySlot(_object,false,player.swc.FunctionClass.getRtType()));
                    dobj["constructor"].directSet(player.static_instance[obj._class.staticClass.classid]);
                    dobj._prototype_ = (DynamicObject)player.static_instance[_class.staticClass.classid].value;
                }
                else
                {
                    dobj._prototype_ = (DynamicObject)constructor.value;
                }
            }

            ClassMember ctor = obj._class.constructor;

            //if (obj._class.isCrossExtend)
            //{
            //	//***创建Adapter***
            //	var scls = obj._class.super;
            //	while (!scls.isLink_System)
            //	{
            //		scls = scls.super;
            //	}

            //	ctor = scls.crossExtendAdapterCreator;

            //	var nf = player.swc.getNativeFunction(((MethodGetterBase)ctor.bindField).functionId);
            //	if (!(nf is ICrossExtendAdapterCreator))
            //	{
            //		invokerFrame.throwAneException(token, "adapter不是ICrossExtendAdapterCreator");
            //		callbacker.noticeRunFailed();
            //		noticeWhenCreateAneFailed();
            //		invokerFrame.endStep();
            //		return;

            //	}

            //	constructorCaller.toCallFunc =  player.swc.functions[((MethodGetterBase)ctor.bindField).functionId];

            //}


            //调用构造函数
            if (ctor != null)
            {
                ASBinCode.rtData.rtFunction function =
                    (ASBinCode.rtData.rtFunction)((MethodGetterBase)ctor.bindField).getConstructor(objScope);


                HeapSlot _temp = tempSlot;
                constructorCaller.returnSlot = _temp;
                constructorCaller.SetFunction(function); function.Clear();


                //afterCallConstructor callbacker = new afterCallConstructor();
                var callbacker = player.blockCallBackPool.create();
                callbacker.args = this;
                //callbacker.obj = obj;
                //callbacker.objScope = objScope;
                //callbacker.rtObject = _object;
                callbacker.cacheObjects[0] = _object;
                callbacker.setWhenFailed(creatorFailed);
                callbacker.setCallBacker(afterCallConstructorCallbacker);


                constructorCaller.callbacker = callbacker;

                toNoticeFailed2 = callbacker;
                constructorCaller.call();
                toNoticeFailed2 = null;

                constructorCaller = null;
            }
            else
            {
                exec_step3(_object);
            }
        }
コード例 #19
0
ファイル: OpAssigning.cs プロジェクト: ikvm/ASTool
        public static void _doPropAssigning(ClassPropertyGetter prop,StackFrame frame,
                                            OpStep step,Player player,RunTimeScope scope,
                                            ASBinCode.rtData.rtObjectBase bindobj,RunTimeValueBase v,StackSlot sslot)
        {
            do
            {
                if (prop.setter == null)
                {
                    frame.throwError(
                        step.token,0,"Illegal write to read-only property "
                        );
                    break;
                }
                //检查访问权限
                CodeBlock block = player.swc.blocks[scope.blockId];
                Class     finder;
                if (block.isoutclass)
                {
                    var c = prop._class;
                    if (c.instanceClass != null)
                    {
                        c = c.instanceClass;
                    }
                    if (c.mainClass != null)
                    {
                        c = c.mainClass;
                    }

                    if (block.define_class_id == c.classid)
                    {
                        finder = player.swc.classes[block.define_class_id];
                    }
                    else
                    {
                        finder = null;
                    }
                }
                else
                {
                    finder = player.swc.classes[block.define_class_id];
                }

                var setter = ClassMemberFinder.find(prop._class,prop.setter.name,finder);
                if (setter == null || setter.bindField != prop.setter)
                {
                    frame.throwError(
                        step.token,0,"Illegal write to read-only property "
                        );
                    break;
                }

                //***读取setter***
                RunTimeValueBase func;

                if (sslot.stackObjects.superPropBindClass != null)
                {
                    func = ((MethodGetterBase)setter.bindField).getSuperMethod(
                        bindobj.objScope,
                        sslot.stackObjects.superPropBindClass
                        );
                }
                else
                {
                    func = ((MethodGetterBase)setter.bindField).getMethod(
                        bindobj
                        );
                }
                //***调用设置器***

                var funCaller = frame.player.funcCallerPool.create(frame,step.token);
                funCaller.SetFunction((ASBinCode.rtData.rtFunction)func); ((ASBinCode.rtData.rtFunction)func).Clear();
                funCaller.loadDefineFromFunction();
                if (!funCaller.createParaScope())
                {
                    return;
                }

                //funCaller.releaseAfterCall = true;

                bool success;
                funCaller.pushParameter(v,0,out success);
                if (!success)
                {
                    frame.endStep(step);
                    return;
                }

                funCaller._tempSlot  = frame._tempSlot1;
                funCaller.returnSlot = frame._tempSlot1;

                BlockCallBackBase cb = frame.player.blockCallBackPool.create();
                cb.setCallBacker(_assign_callbacker);
                cb.step = step;
                cb.args = frame;

                funCaller.callbacker = cb;
                funCaller.call();

                return;
            } while (false);


            frame.endStep(step);
        }
コード例 #20
0
        /// <summary>
        /// 对于可以隐式转换到基本类型的对象,执行隐式转换
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static ASBinCode.RunTimeValueBase ObjectImplicit_ToPrimitive(ASBinCode.rtData.rtObjectBase obj)
        {
            //return ASBinCode.rtData.rtUndefined.undefined;

            return(obj.value.memberData[0].getValue());
        }