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