Для себя решение я, конечно, придумал. Опишу в двух словах.
1. Метод типа CValue::Reset, только с вызовом UnlinkContext(). Использую для очистки значений его везде.
2. Вызов CBLModule7::CallAsFunc выполняю примерно так:
int ExCallAsFunc(int Index,CValue &Value,PValue *Params,int ParamCount)
{
int Result;
CValue &FuncRetVal=pIntInfo->pExecutedModule->m_FuncRetVal;
if (&Value==&FuncRetVal)
{
CValue Temp; // Только через временную переменную, потому что при выходе из CallAsFunc почистится m_FuncRetVal и в Value будет пустота
Result=CBLModule7::CallAsFunc(Index,Temp,ParamCount,Params);
Value=Temp;
}
else
{
Result=CBLModule7::CallAsFunc(Index,Value,ParamCount,Params);
FuncRetVal.UnlinkContext(); // В CValue::Reset() нет UnlinkContext(), поэтому при возврате объекта ссылка на него зависнет в m_FuncRetVal
}
return Result;
}
Тут добавлена обработка ещё одного варианта, который возникает при вызове собственных методов модуля, но не напрямую, а через контекст. В итоге вложенные вызовы CBLModule7::CallAsFunc пишут возвращаемое значение в одну и ту же переменную, из-за чего образуется бардак.
Как глобально разобраться с проблемой UnlinkContext() – хз. Только трапов наставить на соответствующие методы CValue. Но они могут и инлайниться, так что без толку. А ведь эта проблема будет возникать везде, и корректная работа будет гарантирована только при использовании собственных модулей (и то только определенным образом).
В общем, это всё, что пока хотел сказать.