[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