/// <summary>Calls the method.</summary> private IWorkshopTree ParseCall(ActionSet actionSet, MethodCall methodCall) { // Create the array used for continuing after a recursive call. continueArray = actionSet.VarCollection.Assign("_" + method.Name + "_recursiveContinue", actionSet.IsGlobal, false); nextContinue = actionSet.VarCollection.Assign("_" + method.Name + "_nextContinue", actionSet.IsGlobal, true); actionSet.InitialSet().AddAction(continueArray.SetVariable(new V_EmptyArray())); ReturnHandler returnHandler = methodCall.ReturnHandler ?? new ReturnHandler(actionSet, method.Name, method.multiplePaths); this.returnHandler = returnHandler; DefinedMethod.AssignParameters(actionSet, method.ParameterVars, methodCall.ParameterValues, true); actionSet.AddAction(Element.Part <A_While>(new V_True())); continueAt = new SkipStartMarker(actionSet); continueAt.SetSkipCount((Element)nextContinue.GetVariable()); actionSet.AddAction(continueAt); method.block.Translate(actionSet); PopParameterStacks(actionSet); // Pop the continueArray. actionSet.AddAction(Element.Part <A_SkipIf>(new V_Compare( Element.Part <V_CountOf>(continueArray.GetVariable()), Operators.Equal, new V_Number(0) ), new V_Number(3))); actionSet.AddAction(nextContinue.SetVariable(Element.Part <V_LastOf>(continueArray.GetVariable()))); actionSet.AddAction(continueArray.ModifyVariable(Operation.RemoveFromArrayByIndex, Element.Part <V_CountOf>(continueArray.GetVariable()) - 1)); actionSet.AddAction(endOfMethod); actionSet.AddAction(new A_End()); actionSet.AddAction(nextContinue.SetVariable(0)); return(returnHandler.GetReturnedValue()); }
public void Finish(Element switchValue) { // Set state to finished. State = SwitchBuilderState.Finished; // Mark the end of the switch. SkipEndMarker switchEnd = new SkipEndMarker(); actionSet.AddAction(switchEnd); // Update switch skips to skip to the end of the switch. foreach (SkipStartMarker skipToEnd in SkipToEnd) { skipToEnd.SetEndMarker(switchEnd); } // Default insert. // TODO: Default case if (!defaultAdded) { skipCounts.Insert(0, Skipper.GetSkipCount(switchEnd)); } // Skip to the case. Skipper.SetSkipCount( // Create an array of all skip counts. Element.CreateArray(skipCounts.ToArray())[ // Get the case with the value that matches. // IndexOfArrayValue will return -1 if the case is not found, // Add 1 and skip to the default case. Element.IndexOfArrayValue( Element.CreateArray(skipValues.ToArray()), switchValue ) + 1 ] ); }