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)); }
//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; }
//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(); }
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); }
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(); }
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(); }