Ejemplo n.º 1
0
        public override RunTimeValueBase execute(RunTimeValueBase thisObj,SLOT[] argements,object stackframe,out string errormessage,out int errorno)
        {
            errormessage = null;
            errorno      = 0;

            rtArray arr  = (rtArray)((rtObjectBase)thisObj).value.memberData[0].getValue();
            var     args = argements[0].getValue();

            if (args.rtType == RunTimeDataType.rt_array)
            {
                var arglist = ((rtArray)args).innerArray;
                arr.innerArray.InsertRange(0,arglist);
            }

            return(new rtUInt((uint)arr.innerArray.Count));
        }
Ejemplo n.º 2
0
        //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements,object stackframe,  out string errormessage, out int errorno)
        //{
        //    errormessage = null;
        //    errorno = 0;

        //    rtArray arr = (rtArray)((rtObject)thisObj).value.memberData[0].getValue();

        //    int startindex =  ((rtInt)argements[0].getValue()).value;
        //    int endindex = ((rtInt)argements[1].getValue()).value;

        //    if (startindex >= arr.innerArray.Count)
        //    {
        //        return new rtArray();
        //    }
        //    else if (startindex < 0)
        //    {
        //        startindex = arr.innerArray.Count + startindex;
        //        if (startindex < 0)
        //        {
        //            startindex = 0;
        //        }
        //    }

        //    if (endindex > arr.innerArray.Count)
        //    {
        //        endindex = arr.innerArray.Count ;
        //    }
        //    else if (endindex < 0)
        //    {
        //        endindex = arr.innerArray.Count + endindex;
        //        if (endindex < 0)
        //        {
        //            endindex = 0;
        //        }
        //    }

        //    rtArray newArray = new rtArray();
        //    for (int i = startindex; i < endindex; i++)
        //    {
        //        newArray.innerArray.Add(arr.innerArray[i]);
        //    }

        //    return newArray;

        //}

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

            rtArray arr = (rtArray)((rtObjectBase)thisObj).value.memberData[0].getValue();

            int startindex = ((rtInt)argements[0]).value;
            int endindex   = ((rtInt)argements[1]).value;

            if (startindex >= arr.innerArray.Count)
            {
                //return new rtArray();
                returnSlot.directSet(new rtArray());
            }
            else if (startindex < 0)
            {
                startindex = arr.innerArray.Count + startindex;
                if (startindex < 0)
                {
                    startindex = 0;
                }
            }

            if (endindex > arr.innerArray.Count)
            {
                endindex = arr.innerArray.Count;
            }
            else if (endindex < 0)
            {
                endindex = arr.innerArray.Count + endindex;
                if (endindex < 0)
                {
                    endindex = 0;
                }
            }

            rtArray newArray = new rtArray();

            for (int i = startindex; i < endindex; i++)
            {
                newArray.innerArray.Add((RunTimeValueBase)arr.innerArray[i].Clone());
            }

            returnSlot.directSet(newArray);
            //return newArray;
        }
Ejemplo n.º 3
0
        //public override RunTimeValueBase execute(RunTimeValueBase thisObj, SLOT[] argements,object stackframe,  out string errormessage, out int errorno)
        //{
        //    errormessage = null;
        //    errorno = 0;

        //    rtArray arr = (rtArray)((rtObject)thisObj).value.memberData[0].getValue();

        //    if (arr.innerArray.Count > 0)
        //    {
        //        var result = arr.innerArray[arr.innerArray.Count - 1];
        //        arr.innerArray.RemoveAt(arr.innerArray.Count-1);
        //        return result;
        //    }
        //    else
        //    {
        //        return rtUndefined.undefined;
        //    }


        //}

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

            rtArray arr = (rtArray)((rtObjectBase)thisObj).value.memberData[0].getValue();

            if (arr.innerArray.Count > 0)
            {
                var result = arr.innerArray[arr.innerArray.Count - 1];
                arr.innerArray.RemoveAt(arr.innerArray.Count - 1);
                //return result;
                returnSlot.directSet(result);
            }
            else
            {
                //return rtUndefined.undefined;
                returnSlot.directSet(rtUndefined.undefined);
            }
        }
        private void _primitive_toObj(ASBinCode.RunTimeValueBase v1,
                                      ASBinCode.RunTimeValueBase v_temp,
                                      StackFrame frame,ASBinCode.OpStep step,
                                      ASBinCode.RunTimeScope scope)
        {
            var c = stackCallers.Pop();

            if (v1.rtType < RunTimeDataType.unknown)
            {
                //c.function.setThis(null);
                c.SetFunctionThis(null);
            }
            else
            {
                rtObjectBase rtObj = (rtObjectBase)v1;
                //c.function.setThis(rtObj);
                c.SetFunctionThis(rtObj);
            }

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

            SLOT[] argements = (SLOT[])c.tag;

            if (argements[1].getValue().rtType == RunTimeDataType.rt_array)
            {
                rtArray argArray = (rtArray)argements[1].getValue();
                for (int i = 0; i < argArray.innerArray.Count; i++)
                {
                    bool success;
                    c.pushParameter(argArray.innerArray[i],i,out success);
                }
            }

            c.call();
        }
Ejemplo n.º 5
0
        public override void executeAsync(RunTimeValueBase thisObj,SLOT[] argements,
                                          SLOT resultSlot,object callbacker,object stackframe,SourceToken token,RunTimeScope scope)
        {
            IBlockCallBack cb    = (IBlockCallBack)callbacker;
            StackFrame     frame = (StackFrame)stackframe;

            rtArray array = (rtArray)((rtObjectBase)thisObj).value.memberData[0].getValue();

            if (array.innerArray.Count == 0)
            {
                cb.call(cb.args);
                resultSlot.directSet(new rtString(string.Empty));
                return;
            }


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

            sepcb.scope   = scope;
            sepcb._intArg = 0;

            object[] sendargs = sepcb.cacheObjects;
            sendargs[0] = cb;
            sendargs[1] = array;
            sendargs[2] = frame;
            sendargs[3] = token;
            sendargs[4] = scope;
            sendargs[5] = argements[0].getValue();
            sendargs[6] = new StringBuilder();
            sendargs[7] = resultSlot;
            sendargs[8] = new rtInt(0);

            sepcb.args = sendargs;
            sepcb.setCallBacker(D_SeptoString_CB);

            operators.OpCast.CastValue(argements[0].getValue(),RunTimeDataType.rt_string,
                                       frame,token,scope,frame._tempSlot1,sepcb,false);
        }
Ejemplo n.º 6
0
        private void _ValueToString_CB(BlockCallBackBase sender,object args)
        {
            object[]   receiveArgs = (object[])sender.args;
            StackFrame frame       = (StackFrame)receiveArgs[2];
            rtArray    array       = (rtArray)receiveArgs[1];

            //((rtInt)receiveArgs[8]).value++;
            sender._intArg2++;

            if (sender._intArg2 == 10) //((rtInt)receiveArgs[8]).value == 10)    //堆栈清理,防止溢出...
            {
                sender._intArg2 = 0;   //((rtInt)receiveArgs[8]).value = 0;
                BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
                valueCB._intArg = sender._intArg; valueCB._intArg2 = 0;
                valueCB.args    = valueCB.copyFromReceiveArgs(receiveArgs);
                valueCB.setCallBacker(_ValueToString_CB);

                frame.player.CallBlankBlock(valueCB);
                return;
            }


            StringBuilder sb    = (StringBuilder)receiveArgs[6];
            SourceToken   token = (SourceToken)receiveArgs[3];

            string aSep = (string)receiveArgs[5];

            sb.Append(

                TypeConverter.ConvertToString(frame._tempSlot1.getValue(),frame,token) == null?"null":
                TypeConverter.ConvertToString(frame._tempSlot1.getValue(),frame,token)

                );
            if (sender._intArg < array.innerArray.Count)
            {
                sb.Append(aSep);


                BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
                valueCB._intArg = sender._intArg + 1; valueCB._intArg2 = sender._intArg2;
                valueCB.args    = valueCB.copyFromReceiveArgs(receiveArgs);
                valueCB.setCallBacker(_ValueToString_CB);

                var v = array.innerArray[sender._intArg];
                if (v.rtType == RunTimeDataType.rt_void)
                {
                    v = UNDEFINED;
                }

                operators.OpCast.CastValue(v,RunTimeDataType.rt_string,
                                           frame,
                                           (SourceToken)receiveArgs[3],
                                           (RunTimeScope)receiveArgs[4],
                                           frame._tempSlot1,
                                           valueCB,false
                                           );
            }
            else
            {
                //ISLOT result = (ISLOT)receiveArgs[7];

                //result.directSet(new rtString(sb.ToString()));
                if (frame.player.infoOutput != null)
                {
                    frame.player.infoOutput.Info(sb.ToString());
                }
                IBlockCallBack cb = (IBlockCallBack)receiveArgs[0];
                cb.call(cb.args);
            }
        }
        public static void forin_get_enumerator(StackFrame frame, OpStep step, RunTimeScope scope)
        {
            var player = frame.player;

            SLOT slot = step.reg.getSlot(scope,frame);

            ASBinCode.rtti.HostedDynamicObject saveObj = new HostedDynamicObject(player.swc.ObjectClass);
            rtObject save = new rtObject(saveObj,null);

            slot.directSet(save);

            var obj = step.arg1.getValue(scope,frame);

            if (obj.rtType > RunTimeDataType.unknown)
            {
                rtObject rtObj = (rtObject)obj;

                if (ClassMemberFinder.isInherits(rtObj.value._class,
                                                 player.swc.primitive_to_class_table[RunTimeDataType.rt_array]))
                {
                    rtArray arr = (rtArray)rtObj.value.memberData[0].getValue();
                    saveObj.hosted_object = getArrayForIn(arr.innerArray);
                }
                else if (player.swc.dict_Vector_type.ContainsKey(rtObj.value._class))
                {
                    saveObj.hosted_object = getArrayForIn(((Vector_Data)((HostedObject)rtObj.value).hosted_object).innnerList);
                }
                else if (ClassMemberFinder.isImplements(rtObj.value._class,player.swc.IEnumerableInterface))
                {
                    //***调用getIEnumerator方法****
                    var movenext = ClassMemberFinder.find(
                        frame.player.swc.IEnumerableInterface,"getEnumerator",
                        frame.player.swc.IEnumerableInterface);

                    var method = ((InterfaceMethodGetter)movenext.bindField).getMethod(
                        rtObj);

                    //***调用方法***
                    var funCaller = player.funcCallerPool.create(frame,step.token);
                    //funCaller.releaseAfterCall = true;
                    funCaller.SetFunction((rtFunction)method); ((rtFunction)method).Clear();
                    funCaller.loadDefineFromFunction();
                    if (!funCaller.createParaScope())
                    {
                        return;
                    }

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

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

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

                    return;
                }
                else if (ClassMemberFinder.isImplements(
                             rtObj.value._class,player.swc.IEnumeratorInterface))
                {
                    saveObj.hosted_object = rtObj;
                }
                else
                {
                    IEnumerator <RunTimeValueBase> forinenum = getForinIEnumerator(player,rtObj.value,frame,step,scope);
                    saveObj.hosted_object = forinenum;
                }
            }

            frame.endStep();
        }
Ejemplo n.º 8
0
        private static void _ValueToString_CB(BlockCallBackBase sender,object args)
        {
            object[]   receiveArgs = (object[])sender.args;
            StackFrame frame       = (StackFrame)receiveArgs[2];
            rtArray    array       = (rtArray)receiveArgs[1];

            ((rtInt)receiveArgs[8]).value++;

            if (((rtInt)receiveArgs[8]).value == 10)    //堆栈清理,防止溢出...
            {
                ((rtInt)receiveArgs[8]).value = 0;
                BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
                valueCB._intArg = sender._intArg;
                valueCB.args    = valueCB.copyFromReceiveArgs(receiveArgs);
                valueCB.setCallBacker(D_ValueToString_CB);

                frame.player.CallBlankBlock(valueCB);
                return;
            }


            StringBuilder sb    = (StringBuilder)receiveArgs[6];
            SourceToken   token = (SourceToken)receiveArgs[3];

            string aSep     = (string)receiveArgs[5];
            string toappend = TypeConverter.ConvertToString(frame._tempSlot1.getValue(),frame,token);

            while (true)
            {
                sb.Append(toappend == null ? "null" : toappend);
                if (sender._intArg < array.innerArray.Count)
                {
                    sb.Append(aSep);

                    if (//sender._intArg  < array.innerArray.Count
                        //&&
                        array.innerArray[sender._intArg].rtType < RunTimeDataType.unknown
                        )
                    {
                        toappend = TypeConverter.ConvertToString(array.innerArray[sender._intArg],frame,token);
                        sender._intArg++;
                        continue;
                    }
                    else
                    {
                        BlockCallBackBase valueCB = frame.player.blockCallBackPool.create();
                        valueCB._intArg = sender._intArg + 1;
                        valueCB.args    = valueCB.copyFromReceiveArgs(receiveArgs);
                        valueCB.setCallBacker(D_ValueToString_CB);

                        operators.OpCast.CastValue(array.innerArray[sender._intArg],RunTimeDataType.rt_string,
                                                   frame,
                                                   (SourceToken)receiveArgs[3],
                                                   (RunTimeScope)receiveArgs[4],
                                                   frame._tempSlot1,
                                                   valueCB,false
                                                   );
                        break;
                    }
                }
                else
                {
                    SLOT result = (SLOT)receiveArgs[7];

                    result.directSet(new rtString(sb.ToString()));

                    IBlockCallBack cb = (IBlockCallBack)receiveArgs[0];
                    cb.call(cb.args);
                    break;
                }
            }
        }
        public override void executeAsync(RunTimeValueBase thisObj,SLOT[] argements,SLOT resultSlot,
                                          object callbacker,
                                          object stackframe,
                                          SourceToken token,RunTimeScope scope)
        {
            //base.executeAsync(thisObj, argements, resultSlot, callbacker, stackframe, token, scope);

            var thisArg = argements[0].getValue();


            rtFunction func    = (rtFunction)((rtObjectBase)thisObj).value.memberData[0].getValue();
            rtFunction toApply = (rtFunction)func;            //.Clone();


            if (!func.ismethod)             //方法无法更改this
            {
                if (!(thisArg is rtObjectBase))
                {
                    var player  = ((StackFrame)stackframe).player;
                    var objtype = thisArg.rtType;
                    if (objtype < RunTimeDataType.unknown
                        &&
                        player.swc.primitive_to_class_table[objtype] != null
                        )
                    {
                        FunctionCaller toInsertStack = ((StackFrame)stackframe).player.funcCallerPool.create((StackFrame)(stackframe),token);
                        toInsertStack.callbacker = (IBlockCallBack)callbacker;
                        toInsertStack.SetFunction(toApply);
                        toInsertStack._tempSlot  = ((StackFrame)stackframe)._tempSlot1;
                        toInsertStack.returnSlot = resultSlot;
                        toInsertStack.tag        = argements;

                        stackCallers.Push(toInsertStack);

                        //***转换为对象***
                        OpCast.Primitive_to_Object(thisArg,(StackFrame)stackframe,token,scope,
                                                   ((StackFrame)stackframe)._tempSlot1,
                                                   null,_primitive_toObj);


                        return;
                    }
                    else
                    {
                        var fd    = player.swc.functions[toApply.functionId];
                        var block = player.swc.blocks[fd.blockid];
                        //if (block.isoutclass )将this复位
                        {
                            var oc = player.outpackage_runtimescope[block.define_class_id];
                            toApply.setThis(oc.this_pointer);
                        }
                        //else
                        //{
                        //    caller.function.setThis(null);
                        //}
                    }
                }
                else
                {
                    toApply.setThis((rtObjectBase)thisArg);
                }
            }

            FunctionCaller caller = ((StackFrame)stackframe).player.funcCallerPool.create((StackFrame)(stackframe),token);

            caller.callbacker = (IBlockCallBack)callbacker;
            caller.SetFunction(toApply);
            caller._tempSlot  = ((StackFrame)stackframe)._tempSlot1;
            caller.returnSlot = resultSlot;

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



            if (argements[1].getValue().rtType == RunTimeDataType.rt_array)
            {
                rtArray argArray = (rtArray)argements[1].getValue();
                for (int i = 0; i < argArray.innerArray.Count; i++)
                {
                    bool success;
                    caller.pushParameter(argArray.innerArray[i],i,out success);
                }
            }


            caller.call();
        }