Народ, у 1С есть серьезная бага, связанная с сабжем.http://www.1cpp.ru/bugs/show_bug.cgi?id=3903artbear писал(а) 04. Июня 2008 :: 14:30:Интереснейший баг/фича/факт нарисовался при реализации этих функций.
Код С++
int CComponentClassImpl::CallAsFunc(int iMethNum,CValue & rValue,CValue * *ppValue)
{
if(iMethNum==iNumOfSpecialMethod_Virt)
{
rValue.AssignContext(CBLModuleWrapper::GetContextFromModule(m_pMod));
return TRUE;
}
Неверно работает, если в классе определить функцию
Функция ПолучитьКонтекст() Экспорт
Возврат вирт();
КонецФункции
и вызвать в тестовом коде как Объект.ПолучитьКонтекст() несколько раз, хотя бы пару.
Все, баг обеспечен, второй и последующие вызовы дадут пустой объект

Долго думал

Но все-таки разобрался

Правильный вариант
int CComponentClassImpl::CallAsFunc(int iMethNum,CValue & rValue,CValue * *ppValue)
{
if(iMethNum==iNumOfSpecialMethod_Virt)
{
rValue.Reset(); // Вот оно !!
CBLContext* pCont = CBLModuleWrapper::GetContextFromModule(m_pMod);
rValue.AssignContext(pCont);
return TRUE;
}
Нужно подумать насчет подобной реализации внутри различных методов классов 1С++
Приходит на память Палыч и его пожиратель памяти, похожая бага
orefkov писал(а) 05. Июня 2008 :: 05:26:Насчет Reset это точно.
С trad'ом как-то разбирались с подобной фигней.
Выяснили, что при вызове функций движок 1С использует для retVal статический объект CValue. И это приводит к разным траблам. Например, если мы в своем методе присвоили retVal ссылку на контекст, а потом сгенерили RuntimeError, то так как retVal статическая, а не на стеке, для нее не вызывается деструктор, и на тот контекст (который записывали в retVal), ссылка сохраняется, до того момента, пока 1С не вызовет какой-либо другой метод, в котором retVal присвоится другое значение. А в случаях, когда в коде 1С пишут Возврат ВызовНекойФункции(); , ссылки на объекты могут вообще считаться криво.
Поэтому внутри вызовов CallAsFunc для своих контекстов нужно обязательно делать RetValue.Reset, иначе могут пойти различные косяки
ИМХО нужно пересмотреть реализации вызовов функций различных классов в 1С++ и других ВК