| 445 | } // namespace |
| 446 | |
| 447 | absl::Status ComprehensionInitStep::Evaluate(ExecutionFrame* frame) const { |
| 448 | if (!frame->value_stack().HasEnough(1)) { |
| 449 | return absl::Status(absl::StatusCode::kInternal, "Value stack underflow"); |
| 450 | } |
| 451 | |
| 452 | const Value& top = frame->value_stack().Peek(); |
| 453 | if (top.IsError() || top.IsUnknown()) { |
| 454 | return frame->JumpTo(error_jump_offset_); |
| 455 | } |
| 456 | |
| 457 | if (frame->enable_unknowns() && top.IsMap()) { |
| 458 | const AttributeTrail& top_attr = frame->value_stack().PeekAttribute(); |
| 459 | if (frame->attribute_utility().CheckForUnknownPartial(top_attr)) { |
| 460 | frame->value_stack().PopAndPush( |
| 461 | frame->attribute_utility().CreateUnknownSet(top_attr.attribute())); |
| 462 | return frame->JumpTo(error_jump_offset_); |
| 463 | } |
| 464 | } |
| 465 | |
| 466 | switch (top.kind()) { |
| 467 | case ValueKind::kList: { |
| 468 | CEL_ASSIGN_OR_RETURN(auto iterator, top.GetList().NewIterator()); |
| 469 | frame->iterator_stack().Push(std::move(iterator)); |
| 470 | } break; |
| 471 | case ValueKind::kMap: { |
| 472 | CEL_ASSIGN_OR_RETURN(auto iterator, top.GetMap().NewIterator()); |
| 473 | frame->iterator_stack().Push(std::move(iterator)); |
| 474 | } break; |
| 475 | default: |
| 476 | // Replace <iter_range> with an error and jump past |
| 477 | // ComprehensionFinishStep. |
| 478 | frame->value_stack().PopAndPush( |
| 479 | cel::ErrorValue(CreateNoMatchingOverloadError("<iter_range>"))); |
| 480 | return frame->JumpTo(error_jump_offset_); |
| 481 | } |
| 482 | |
| 483 | return absl::OkStatus(); |
| 484 | } |
| 485 | |
| 486 | absl::Status ComprehensionNextStep::Evaluate1(ExecutionFrame* frame) const { |
| 487 | if (!frame->value_stack().HasEnough(2)) { |
no test coverage detected