| 55 | leave_on_stack_(leave_on_stack) {} |
| 56 | |
| 57 | absl::Status Evaluate(ExecutionFrame* frame) const override { |
| 58 | // Peek the top value |
| 59 | if (!frame->value_stack().HasEnough(1)) { |
| 60 | return absl::Status(absl::StatusCode::kInternal, "Value stack underflow"); |
| 61 | } |
| 62 | |
| 63 | const auto& value = frame->value_stack().Peek(); |
| 64 | const auto should_jump = value.Is<BoolValue>() && |
| 65 | jump_condition_ == value.GetBool().NativeValue(); |
| 66 | |
| 67 | if (!leave_on_stack_) { |
| 68 | frame->value_stack().Pop(1); |
| 69 | } |
| 70 | |
| 71 | if (should_jump) { |
| 72 | return Jump(frame); |
| 73 | } |
| 74 | |
| 75 | return absl::OkStatus(); |
| 76 | } |
| 77 | |
| 78 | private: |
| 79 | const bool jump_condition_; |