| 57 | absl::variant<ExprRecord, ArgRecord, ComprehensionRecord>; |
| 58 | |
| 59 | struct StackRecord { |
| 60 | public: |
| 61 | static constexpr int kTarget = -2; |
| 62 | |
| 63 | explicit StackRecord(Expr* e) { |
| 64 | ExprRecord record; |
| 65 | record.expr = e; |
| 66 | record_variant = record; |
| 67 | } |
| 68 | |
| 69 | StackRecord(Expr* e, ComprehensionExpr* comprehension, |
| 70 | Expr* comprehension_expr, ComprehensionArg comprehension_arg, |
| 71 | bool use_comprehension_callbacks) { |
| 72 | if (use_comprehension_callbacks) { |
| 73 | ComprehensionRecord record; |
| 74 | record.expr = e; |
| 75 | record.comprehension = comprehension; |
| 76 | record.comprehension_expr = comprehension_expr; |
| 77 | record.comprehension_arg = comprehension_arg; |
| 78 | record.use_comprehension_callbacks = use_comprehension_callbacks; |
| 79 | record_variant = record; |
| 80 | return; |
| 81 | } |
| 82 | ArgRecord record; |
| 83 | record.expr = e; |
| 84 | record.calling_expr = comprehension_expr; |
| 85 | record.call_arg = comprehension_arg; |
| 86 | record_variant = record; |
| 87 | } |
| 88 | |
| 89 | StackRecord(Expr* e, const Expr* call, int argnum) { |
| 90 | ArgRecord record; |
| 91 | record.expr = e; |
| 92 | record.calling_expr = call; |
| 93 | record.call_arg = argnum; |
| 94 | record_variant = record; |
| 95 | } |
| 96 | |
| 97 | Expr* expr() const { return absl::get<ExprRecord>(record_variant).expr; } |
| 98 | |
| 99 | bool IsExprRecord() const { |
| 100 | return absl::holds_alternative<ExprRecord>(record_variant); |
| 101 | } |
| 102 | |
| 103 | StackRecordKind record_variant; |
| 104 | bool visited = false; |
| 105 | }; |
| 106 | |
| 107 | struct PreVisitor { |
| 108 | void operator()(const ExprRecord& record) { |
no outgoing calls
no test coverage detected