Example #1
0
 public void pushParameterNativeModeConstParameter(nativefuncs.NativeConstParameterFunction nf,RunTimeValueBase argement,int id,out bool success)
 {
     nf.bin = player.swc;
     ((nativefuncs.NativeConstParameterFunction)nf).pushParameter(toCallFunc,id,argement,
                                                                  token,invokerFrame,out success);
     if (success)
     {
         pushedArgs++;
     }
     else
     {
         clear_para_slot(invokerFrame,onstackparametercount);
         if (callbacker != null)
         {
             callbacker.noticeRunFailed();
         }
         release();
     }
 }
Example #2
0
        public bool createParaScope()
        {
            if (toCallFunc.isNative)
            {
                //if (toCallFunc.native_index < 0)
                //{
                //    toCallFunc.native_index = player.swc.nativefunctionNameIndex[toCallFunc.native_name];
                //}
                //var nf = player.swc.nativefunctions[toCallFunc.native_index];
                var nf = player.swc.getNativeFunction(toCallFunc.functionid);
                if (nf == null)
                {
                    invokerFrame.throwAneException(token,"函数 " + toCallFunc.name + "([" + toCallFunc.native_name + "])" + "的本地代码没找到");
                    invokerFrame.endStep();
                    if (callbacker != null)
                    {
                        callbacker.noticeRunFailed();
                    }
                    release();
                    return(false);
                }
                nf.bin = player.swc;
                if (nf.mode == NativeFunctionBase.NativeFunctionMode.const_parameter_0)
                {
                    nativefuncs.NativeConstParameterFunction func = ((nativefuncs.NativeConstParameterFunction)nf);


                    if (/*invokerFrame.offset +
                         *          invokerFrame.block.totalRegisters + 1 + 1 +
                         *          invokerFrame.call_parameter_slotCount*/invokerFrame.baseBottomSlotIndex + invokerFrame.call_parameter_slotCount + func.TotalArgs >= Player.STACKSLOTLENGTH)
                    {
                        invokerFrame.throwError(new error.InternalError(invokerFrame.player.swc,token,"stack overflow"));
                        invokerFrame.endStep();
                        if (callbacker != null)
                        {
                            callbacker.noticeRunFailed();
                        }
                        release();

                        return(false);
                    }
                    invokerFrame.call_parameter_slotCount += func.TotalArgs;
                    onstackparametercount = func.TotalArgs;

                    func.prepareParameter(toCallFunc,invokerFrame.stack,invokerFrame.baseBottomSlotIndex + invokerFrame.call_parameter_slotCount /*invokerFrame.offset +
                                                                                                                                                  * invokerFrame.block.totalRegisters + 1 + 1 + invokerFrame.call_parameter_slotCount*/- onstackparametercount);

                    return(true);
                }
            }

            ASBinCode.rtti.FunctionSignature signature = toCallFunc.signature;


            if (invokerFrame.baseBottomSlotIndex + invokerFrame.call_parameter_slotCount + signature.onStackParameters  /*invokerFrame.offset +
                                                                                                                         * invokerFrame.block.totalRegisters + 1 + 1 +
                                                                                                                         * invokerFrame.call_parameter_slotCount+signature.onStackParameters*/>= Player.STACKSLOTLENGTH)
            {
                invokerFrame.throwError(new error.InternalError(invokerFrame.player.swc,token,"stack overflow"));
                invokerFrame.endStep();
                if (callbacker != null)
                {
                    callbacker.noticeRunFailed();
                }
                release();

                return(false);
            }
            invokerFrame.call_parameter_slotCount += signature.onStackParameters;
            onstackparametercount = signature.onStackParameters;

            CallFuncHeap =
                player.genHeapFromCodeBlock(player.swc.blocks[toCallFunc.blockid]);

            var parameters = signature.parameters; int len = parameters.Count;

            for (int i = 0; i < len; i++)
            {
                var parameter = parameters[i];
                if (parameter.defaultValue != null)
                {
                    var dv = getDefaultParameterValue(signature,i);

                    _storeArgementToSlot(i,dv);
                }
                else if (parameter.isPara)
                {
                    _storeArgementToSlot(i,new ASBinCode.rtData.rtArray());
                }
                //else
                //{
                //    _storeArgementToSlot(i, ASBinCode.rtData.rtUndefined.undefined);
                //}
            }

            return(true);
        }