Ejemplo n.º 1
0
        public SingleTerm GetValue(SuperUserDefinedMethodTerm udmt)
        {
            methodStack++;
            if (methodStack > 100)
            {
                //StackOverflowExceptionはcatchできない上に再現性がないので発生前に一定数で打ち切る。
                //環境によっては100以前にStackOverflowExceptionがでるかも?
                throw new CodeEE("関数の呼び出しスタックが溢れました(無限に再帰呼び出しされていませんか?)");
            }
            SingleTerm ret          = null;
            int        temp_current = state.currentMin;

            state.currentMin = state.functionCount;
            udmt.Call.updateRetAddress(state.CurrentLine);
            try
            {
                state.IntoFunction(udmt.Call, udmt.Argument, exm);
                //do whileの中でthrow されたエラーはここではキャッチされない。
                //#functionを全て抜けてDoScriptでキャッチされる。
                runScriptProc();
                ret = state.MethodReturnValue;
            }
            finally
            {
                if (udmt.Call.TopLabel.hasPrivDynamicVar)
                {
                    udmt.Call.TopLabel.Out();
                }
                //1756beta2+v3:こいつらはここにないとデバッグコンソールで式中関数が事故った時に大事故になる
                state.currentMin = temp_current;
                methodStack--;
            }
            return(ret);
        }
Ejemplo n.º 2
0
        public SingleTerm GetValue(SuperUserDefinedMethodTerm udmt)
        {
            methodStack++;
            if (methodStack > 100)
            {
                throw new CodeEE("関数の呼び出しスタックが溢れました(無限に再帰呼び出しされていませんか?)");
            }
            SingleTerm ret          = null;
            var        temp_current = getCurrentState.currentMin;

            getCurrentState.currentMin = getCurrentState.functionCount;
            udmt.Call.updateRetAddress(getCurrentState.CurrentLine);
            try
            {
                getCurrentState.IntoFunction(udmt.Call, udmt.Argument, exm);
                //do whileの中でthrow されたエラーはここではキャッチされない。
                //#functionを全て抜けてDoScriptでキャッチされる。
                runScriptProc();
                ret = getCurrentState.MethodReturnValue;
            }
            finally
            {
                if (udmt.Call.TopLabel.hasPrivDynamicVar)
                {
                    udmt.Call.TopLabel.Out();
                }
                //1756beta2+v3:こいつらはここにないとデバッグコンソールで式中関数が事故った時に大事故になる
                getCurrentState.currentMin = temp_current;
                methodStack--;
            }
            return(ret);
        }