public override void Eval(VM vm) { HeronValue initVal = initial.Eval(vm); VarDesc desc = new VarDesc(name); using (vm.CreateScope()) { vm.AddVar(desc, initVal); while (true) { HeronValue condVal = vm.Eval(condition); bool b = condVal.ToBool(); if (!b) { return; } vm.Eval(body); if (vm.ShouldExitScope()) { return; } vm.Eval(next); } } }
public override HeronValue InvokeBinaryOperator(VM vm, OpCode opcode, HeronValue val) { bool x = GetValue(); bool y = val.ToBool(); switch (opcode) { case OpCode.opAnd: return(vm.MakeTemporary(x && y)); case OpCode.opOr: return(vm.MakeTemporary(x || y)); case OpCode.opXOr: return(vm.MakeTemporary(x ^ y)); default: return(base.InvokeBinaryOperator(vm, opcode, val)); } }
public override void Eval(VM vm) { while (true) { HeronValue o = condition.Eval(vm); bool b = o.ToBool(); if (!b) { break; } vm.Eval(body); if (vm.ShouldExitScope()) { break; } } }