public void release() { if (!hasReleased) { //check_para_id = 0; //pushedArgs = 0; //onstackparametercount = 0; hasReleased = true; callbacker = null; CallFuncHeap = null; toCallFunc = null; returnSlot = null; _tempSlot = null; invokerFrame = null; token = null; tag = null; function.Clear(); player.funcCallerPool.ret(this); } }
void IBlockCallBack.call(object args) { #if DEBUG clear_para_slot(invokerFrame,onstackparametercount); #else { int count = onstackparametercount; while (count > 0) { --count; StackSlot slot = invokerFrame.stack[invokerFrame.baseBottomSlotIndex + (--invokerFrame.call_parameter_slotCount)]; if (slot.refPropChanged) { slot.refPropChanged = false; slot.stackObjects = StackSlot.StackObjects.EMPTY; if (slot.needclear) { slot.linktarget = null; slot._cache_arraySlot.clear(); slot._cache_vectorSlot.clear(); slot._cache_prototypeSlot.clear(); slot._cache_setthisslot.clear(); slot._linkObjCache.clearRefObj(); slot._functionValue.Clear(); slot._functon_result.Clear(); slot.needclear = false; } slot.store[StackSlot.COMMREFTYPEOBJ] = ASBinCode.rtData.rtNull.nullptr; } slot.index = (int)RunTimeDataType.unknown; } } #endif onstackparametercount = 0; invokerFrame.endStepNoError(); //release(); //人肉内联release if (!hasReleased) { hasReleased = true; callbacker = null; CallFuncHeap = null; toCallFunc = null; returnSlot = null; _tempSlot = null; invokerFrame = null; token = null; tag = null; function.Clear(); player.funcCallerPool.ret(this); } }
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; } }
private void _finalStep(BlockCallBackBase sender,object args) { object[] a = (object[])sender.args; objectResult = (ASBinCode.rtData.rtObjectBase)a[0]; //***如果有返回值**** var returnvalue = ((SLOT)a[1]).getValue(); ((SLOT)a[1]).directSet(ASBinCode.rtData.rtUndefined.undefined); if (returnvalue.rtType != RunTimeDataType.rt_void && returnvalue.rtType != RunTimeDataType.rt_string && returnvalue.rtType != RunTimeDataType.rt_number && returnvalue.rtType != RunTimeDataType.rt_int && returnvalue.rtType != RunTimeDataType.rt_boolean && returnvalue.rtType != RunTimeDataType.rt_uint ) { objectResult = returnvalue; } //objectResult.directSet((ASBinCode.rtData.rtObject)sender.args); if (callbacker != null) { callbacker.call(this); callbacker = null; } }
private static void _convertCB(BlockCallBackBase sender, object args) { object[] a = (object[])sender.args; if (sender.isSuccess) { ASBinCode.rtti.Vector_Data vd = (ASBinCode.rtti.Vector_Data)a[0]; var v = ((StackFrame)a[5])._tempSlot1.getValue().Clone(); //必须Clone var list = (List <RunTimeValueBase>)a[1]; vd.innnerList.Add((RunTimeValueBase)v); sender._intArg = sender._intArg + 1; if (sender._intArg >= list.Count) { IBlockCallBack cb = (IBlockCallBack)a[4]; cb.call(cb.args); } else { OpCast.CastValue(list[sender._intArg], vd.vector_type, (StackFrame)a[5], (SourceToken)a[2], (RunTimeScope)a[3], ((StackFrame)a[5])._tempSlot1, sender, false); } } }
private static void callfun_cb(BlockCallBackBase sender,object args) { IBlockCallBack callbacker = sender.cacheObjects[0] as IBlockCallBack; StackFrame frame = (StackFrame)sender.cacheObjects[1]; clear_para_slot(frame,sender._intArg); if (callbacker != null) { callbacker.call(callbacker.args); } }
private void callfun_failed(BlockCallBackBase sender,object args) { IBlockCallBack callbacker = sender.cacheObjects[0] as IBlockCallBack; StackFrame frame = (StackFrame)sender.cacheObjects[1]; clear_para_slot(frame,sender._intArg); if (callbacker != null) { callbacker.noticeRunFailed(); } }
private bool make_outpackage_scope(Class cls,IBlockCallBack cb) { ASBinCode.CodeBlock codeblock = player.swc.blocks[cls.outscopeblockid]; HeapSlot[] globaldata = player.genHeapFromCodeBlock(codeblock); Global_Object global = Global_Object.formCodeBlock(codeblock,globaldata,player.swc.classes[0]); ASBinCode.rtData.rtObject globalObj = new ASBinCode.rtData.rtObject(global,null); ASBinCode.RunTimeScope rtscope = player.callBlock( codeblock,globaldata,null, null, //player.static_instance[cls.staticClass.classid].objScope, step.token, cb, globalObj, RunTimeScopeType.outpackagemember ); if (rtscope == null) { invokerFrame.endStep(step); return(false); } globalObj.objScope = rtscope; player.outpackage_runtimescope.Add(cls.classid,rtscope); { var slot = new DynamicPropertySlot(globalObj,true,player.swc.FunctionClass.getRtType()); slot.directSet(player.static_instance[cls.staticClass.classid]); global.createproperty(cls.name,slot); } for (int i = 0; i < player.swc.classes.Count; i++) { if (player.swc.classes[i].mainClass == cls) { if (init_static_class(player.swc.classes[i])) { var slot = new DynamicPropertySlot(globalObj,true,player.swc.FunctionClass.getRtType()); slot.directSet(player.static_instance[player.swc.classes[i].staticClass.classid]); global.createproperty(player.swc.classes[i].name,slot); } else { //***出错了 invokerFrame.endStep(step); return(false); } } } return(true); }
private void _movenext_callbacker(BlockCallBackBase sender,object args) { ASBinCode.rtti.YieldObject yieldObj = (ASBinCode.rtti.YieldObject)sender.args; yieldObj._moveNextResultSlot.directSet(yieldObj.argements[yieldObj.argements.Length - 1].getValue()); yieldObj._moveNextResultSlot = null; IBlockCallBack cb = ((IBlockCallBack)yieldObj._callbacker); yieldObj._callbacker = null; cb.call(cb.args); }
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; if (argements[0].getValue().rtType == RunTimeDataType.rt_null) { if (frame.player.infoOutput != null) { frame.player.infoOutput.Info(string.Empty); } cb.call(cb.args); return; } rtArray array = (rtArray)(argements[0].getValue()); if (array.innerArray.Count == 0) { if (frame.player.infoOutput != null) { frame.player.infoOutput.Info(string.Empty); } cb.call(cb.args); return; } BlockCallBackBase sepcb = frame.player.blockCallBackPool.create(); sepcb.scope = scope; sepcb._intArg = 0; sepcb.setCallBacker(null); sepcb._intArg2 = 0; object[] sendargs = sepcb.cacheObjects; sendargs[0] = cb; sendargs[1] = array; sendargs[2] = frame; sendargs[3] = token; sendargs[4] = scope; sendargs[5] = " "; sendargs[6] = new StringBuilder(); sendargs[7] = resultSlot; //sendargs[8] = new rtInt(0); sepcb.args = sendargs; _SeptoString_CB(sepcb,sendargs); }
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); }
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); }
public static void pushAllElementToVector(ASBinCode.rtti.Vector_Data vd, List <RunTimeValueBase> datalist, StackFrame frame, SourceToken token, RunTimeScope scope, IBlockCallBack callbacker ) { BlockCallBackBase convertCb = frame.player.blockCallBackPool.create(); convertCb._intArg = 0; convertCb.setCallBacker(_convertCB); object[] args = convertCb.cacheObjects; //new object[6]; args[0] = vd; args[1] = datalist; args[2] = token; args[3] = scope; args[4] = callbacker; args[5] = frame; convertCb.args = args; OpCast.CastValue(datalist[convertCb._intArg], vd.vector_type, frame, token, scope, frame._tempSlot1, convertCb, 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); } }
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; } } }