/// <summary> /// Generates code for a let command node /// </summary> /// <param name="letCommand">The node to generate code for</param> private void GenerateCodeForLetCommand(LetCommandNode letCommand) { Debugger.Write("Generating code for Let Command"); scopes.AddScope(); GenerateCodeFor(letCommand.Declaration); GenerateCodeFor(letCommand.Command); code.AddInstruction(OpCode.POP, 0, 0, scopes.GetLocalScopeSize()); scopes.RemoveScope(); }
private void GenerateCodeForForCommand(ForCommandNode forCommand) { Debugger.Write("Generating code for the ForCommandNode"); scopes.AddScope(); GenerateCodeFor(forCommand.Assign); Address forJumpAddress = code.NextAddress; GenerateCodeFor(forCommand.Expression); Address commandJumpAddress = code.NextAddress; code.AddInstruction(OpCode.JUMPIF, Register.CB, FalseValue, 0); GenerateCodeFor(forCommand.Command); code.AddInstruction(OpCode.JUMP, Register.CB, 0, forJumpAddress); code.PatchInstructionToJumpHere(commandJumpAddress); code.AddInstruction(OpCode.POP, 0, 0, scopes.GetLocalScopeSize()); scopes.RemoveScope(); }
private void GenerateCodeForForCommand(ForCommandNode forCommand) { scopes.AddScope(); Debugger.WriteDebuggingInfo("Generating code for For command"); GenerateCodeFor(forCommand.Expression); Address forJumpAddress = code.NextAddress; code.AddInstruction(OpCode.JUMPIF, Register.CB, FalseValue, 0); code.PatchInstructionToJumpHere(forJumpAddress); GenerateCodeFor(forCommand.Identifier); Address idJumpAddress = code.NextAddress; code.PatchInstructionToJumpHere(idJumpAddress); // code.AddInstruction(OpCode.JUMPIF, Register.CB, FalseValue, 0); GenerateCodeFor(forCommand.ToExpression); Address toJumpAddress = code.NextAddress; code.PatchInstructionToJumpHere(toJumpAddress); // code.AddInstruction(OpCode.JUMPIF, Register.CB, FalseValue, 0); GenerateCodeFor(forCommand.BecomesExpression); Address becomesJumpAddress = code.NextAddress; code.PatchInstructionToJumpHere(becomesJumpAddress); }