Merge pull request #5575 from edolstra/attrset-call

Don't hang when calling an attrset
This commit is contained in:
Eelco Dolstra 2021-11-16 19:13:02 +01:00 committed by GitHub
commit 9a9afca712
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1275,6 +1275,8 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
} }
}; };
Attr * functor;
while (nrArgs > 0) { while (nrArgs > 0) {
if (vCur.isLambda()) { if (vCur.isLambda()) {
@ -1403,16 +1405,14 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
} }
} }
else if (vCur.type() == nAttrs) { else if (vCur.type() == nAttrs && (functor = vCur.attrs->get(sFunctor))) {
if (auto functor = vCur.attrs->get(sFunctor)) { /* 'vCur" may be allocated on the stack of the calling
/* 'vCur" may be allocated on the stack of the calling function, but for functors we may keep a reference, so
function, but for functors we may keep a reference, heap-allocate a copy and use that instead. */
so heap-allocate a copy and use that instead. */ Value * args2[] = {allocValue()};
Value * args2[] = {allocValue()}; *args2[0] = vCur;
*args2[0] = vCur; /* !!! Should we use the attr pos here? */
/* !!! Should we use the attr pos here? */ callFunction(*functor->value, 1, args2, vCur, pos);
callFunction(*functor->value, 1, args2, vCur, pos);
}
} }
else else