| 71 | absl::variant<ExprRecord, ArgRecord, ComprehensionRecord>; |
| 72 | |
| 73 | struct StackRecord { |
| 74 | public: |
| 75 | ABSL_ATTRIBUTE_UNUSED static constexpr int kNotCallArg = -1; |
| 76 | static constexpr int kTarget = -2; |
| 77 | |
| 78 | StackRecord(Expr* e, const SourceInfo* info) { |
| 79 | ExprRecord record; |
| 80 | record.expr = e; |
| 81 | record.source_info = info; |
| 82 | record_variant = record; |
| 83 | } |
| 84 | |
| 85 | StackRecord(Expr* e, const SourceInfo* info, Comprehension* comprehension, |
| 86 | Expr* comprehension_expr, ComprehensionArg comprehension_arg, |
| 87 | bool use_comprehension_callbacks) { |
| 88 | if (use_comprehension_callbacks) { |
| 89 | ComprehensionRecord record; |
| 90 | record.expr = e; |
| 91 | record.source_info = info; |
| 92 | record.comprehension = comprehension; |
| 93 | record.comprehension_expr = comprehension_expr; |
| 94 | record.comprehension_arg = comprehension_arg; |
| 95 | record.use_comprehension_callbacks = use_comprehension_callbacks; |
| 96 | record_variant = record; |
| 97 | return; |
| 98 | } |
| 99 | ArgRecord record; |
| 100 | record.expr = e; |
| 101 | record.source_info = info; |
| 102 | record.calling_expr = comprehension_expr; |
| 103 | record.call_arg = comprehension_arg; |
| 104 | record_variant = record; |
| 105 | } |
| 106 | |
| 107 | StackRecord(Expr* e, const SourceInfo* info, const Expr* call, int argnum) { |
| 108 | ArgRecord record; |
| 109 | record.expr = e; |
| 110 | record.source_info = info; |
| 111 | record.calling_expr = call; |
| 112 | record.call_arg = argnum; |
| 113 | record_variant = record; |
| 114 | } |
| 115 | |
| 116 | Expr* expr() const { return absl::get<ExprRecord>(record_variant).expr; } |
| 117 | |
| 118 | const SourceInfo* source_info() const { |
| 119 | return absl::get<ExprRecord>(record_variant).source_info; |
| 120 | } |
| 121 | |
| 122 | bool IsExprRecord() const { |
| 123 | return absl::holds_alternative<ExprRecord>(record_variant); |
| 124 | } |
| 125 | |
| 126 | StackRecordKind record_variant; |
| 127 | bool visited = false; |
| 128 | }; |
| 129 | |
| 130 | struct PreVisitor { |
no outgoing calls
no test coverage detected