MCPcopy Create free account
hub / github.com/MikePopoloski/slang / eval

Method eval

source/ast/builtins/ArrayMethods.cpp:148–207  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

146 }
147
148 ConstantValue eval(EvalContext& context, const Args& args, SourceRange,
149 const CallExpression::SystemCallInfo& callInfo) const final {
150 auto lval = args[0]->evalLValue(context);
151 if (!lval)
152 return nullptr;
153
154 auto target = lval.resolve();
155 if (!target)
156 return nullptr;
157
158 auto [iterExpr, iterVar] = callInfo.getIteratorInfo();
159 if (iterExpr) {
160 SLANG_ASSERT(iterVar);
161 auto guard = context.disableCaching();
162 auto iterVal = context.createLocal(iterVar);
163
164 auto sortTarget = [&, ie = iterExpr](auto& target) {
165 auto pred = [&, ie = ie](ConstantValue& a, ConstantValue& b) {
166 *iterVal = a;
167 ConstantValue cva = ie->eval(context);
168
169 *iterVal = b;
170 ConstantValue cvb = ie->eval(context);
171
172 return cva < cvb;
173 };
174
175 if (reversed)
176 std::ranges::sort(target.rbegin(), target.rend(), pred);
177 else
178 std::ranges::sort(target, pred);
179 };
180
181 if (target->isQueue()) {
182 sortTarget(*target->queue());
183 }
184 else {
185 auto& vec = std::get<ConstantValue::Elements>(target->getVariant());
186 sortTarget(vec);
187 }
188 }
189 else {
190 auto sortTarget = [&](auto& target) {
191 if (reversed)
192 std::ranges::sort(target.rbegin(), target.rend(), std::less<>{});
193 else
194 std::ranges::sort(target, std::less<>{});
195 };
196
197 if (target->isQueue()) {
198 sortTarget(*target->queue());
199 }
200 else {
201 auto& vec = std::get<ConstantValue::Elements>(target->getVariant());
202 sortTarget(vec);
203 }
204 }
205

Callers

nothing calls this directly

Calls 7

evalLValueMethod · 0.80
getIteratorInfoMethod · 0.80
createLocalMethod · 0.80
rbeginMethod · 0.80
rendMethod · 0.80
resolveMethod · 0.45
evalMethod · 0.45

Tested by

no test coverage detected