private void HandleCall(Call call) { int index = 1; foreach (var p in call.args) { Setvariable($"%{index++}", p.GetValue()); } OldStacks.Push(CurrentStack); BlockStack.Push(CurrentBlock); var func = (m_Statements[0] as Block).statements.FirstOrDefault(t => ((t is Func tt) && tt.ident == call.ident)) as Block; CurrentBlock = func; CurrentStack = CurrentBlock.GetStack(); CurrentStatment = CurrentStack.Pop(); }
public void Statement() { if (CurrentBlock == null && CurrentStack == null) { CurrentBlock = m_Statements[0] as Block; CurrentStack = CurrentBlock.GetStack(); CurrentStatment = CurrentStack.Pop(); } if (CurrentStatment is Goto go) { HandleGoto(go); } else if (CurrentStatment is Call call) { HandleCall(call); } else if (CurrentStatment is Break) { //pop till we leave a loop TODO CurrentBlock = BlockStack.Pop(); CurrentStack = OldStacks.Pop(); CurrentStatment = CurrentStack.Pop(); } else if (CurrentStatment is Return ret) { if (ret.expr != null) { Setvariable("#result", ret.expr.GetValue()); } //pop till we leave a Func TODO CurrentBlock = BlockStack.Pop(); CurrentStack = OldStacks.Pop(); CurrentStatment = CurrentStack.Pop(); } else if (CurrentStatment is Continue) { CurrentStack = CurrentBlock.GetStack(); CurrentStatment = CurrentStack.Pop(); } else if (CurrentStatment is Block block) { if (CurrentStatment.Execute()) { if (block is BaseLoopBlock loop) { CurrentStack.Push(block); } OldStacks.Push(CurrentStack); BlockStack.Push(CurrentBlock); CurrentBlock = block; CurrentStack = CurrentBlock.GetStack(); CurrentStatment = CurrentStack.Pop(); //foreach ( var s in CurrentBlock.statements ) // CurrentStack.Push( s ); } else { if (CurrentStack.Count > 0) { CurrentStatment = CurrentStack.Pop(); } else { CurrentStatment = null; } } } //DEBUG DONT EXECUTE STATEMENTS else if (CurrentStatment != null && CurrentStatment.Execute()) { if (CurrentStack.Count > 0) { CurrentStatment = CurrentStack.Pop(); } else { CurrentStatment = null; } } // if (CurrentStatment == null) { if (BlockStack.Count > 0) { CurrentBlock = BlockStack.Pop(); CurrentStack = OldStacks.Pop(); if (CurrentStack.Count > 0) { CurrentStatment = CurrentStack.Pop(); } } else { CurrentBlock = null; CurrentStack = null; } } }