[Moscow.pm] Fwd: Re: Re: Вопрос про возвращаемые значения из Perl XS
Nikita Aznauryan
nikita-aznaourian на yandex.ru
Пт Июл 9 09:43:03 PDT 2010
09.07.10, 19:54, "Mons Anderson" :
> On Friday 09 July 2010 19:12:28 aznaourian nikita wrote:
> > Есть XS процедура, которая возвращает ссылку на массив SV*.
> >
> > В процедуре создается новый массив
> >
> > AV* array = (AV*)sv_2mortal((SV*)newAV());
> >
> > AV* array2 = newAV();
> >
> > av_push(newArray, newSVpv("value2", 0));
> > av_push(newArray, (SV*)newArray2);
> >
> > return newRV((SV*)newArray);
> >
> > При этом в перле выводится следующее:
> > [
> > 'value',
> > undef
> > ];
> >
>
> По моему вы делаете что-то очень страшное
>
> Если вы хотите вернуть ссылку на массив, это
> SV* arrayref = newRV_noinc( newAV() );
>
> можно также заморталить:
> SV* mortal_arrayref = sv_2mortal(newRV_noinc( newAV() ));
>
> ваш вариант по видимому
>
> AV* array = newAV();
> AV* array2 = newAV();
>
> av_push(array, newSVpv("value2", 0));
> av_push(array, newRV_noinc( array2 ));
>
> return sv_2mortal(newRV_noinc(array));
Попробовал написать так и получил как раз "Attempt to free...". Видимо из-за последней строки , где мы создаем
новую мортальную ссылку и тут же ее уничтожаем при выходе из процедуры а заодно и массив, на который она ссылалась, если я не ошибаюсь.
Правильно работает в этом случае вот такой вариант :
AV* array = (AV*)sv_2mortal((SV*)newAV());
av_push(array, newSVpv("value2", 0));
av_push(array, newRV_noinc( (SV*)newAV() ));
return newRV((SV*)array);
Но мне все еще не понятно , в чем отличие второй строчки от третьей?
Почему , если я хочу записать вторым элементом не ссылку на массив, а сам массив, я не могу написать вот так?
AV* array = (AV*)sv_2mortal((SV*)newAV());
av_push(array, newSVpv("value2", 0));
av_push(array, (SV*)newAV() );
return newRV((SV*)array);
В этом случае, если я правильно понимаю (а это видимо не так), создается массив, с REFCNT = 1 и он записывается вторым элементом основного массива. Аналогично во второй строчке создается SV и записывается первым элементом массива.
Но почему первый элемент не уничтожается , а второй уничтожается? Ведь у обоих REF= 1
Подробная информация о списке рассылки Moscow-pm