Обновлено: когда нужно «заглушить» переменную в Perl Inline :: C - PullRequest
5 голосов
/ 02 марта 2011

Я пытаюсь обернуть библиотеку C в Perl. Я возился с XS, но, потерпев неудачу, подумал, что начинать нужно просто с Inline::C. Мой вопрос о смертности. Я читал perlguts так хорошо, как только мог, но все еще в замешательстве. Нужно ли мне вызывать sv_2mortal на SV *, который должен быть возвращен, если я не помещаю его в стек?

(PS Я действительно работаю над слабым знанием C, которое мне больно. У меня есть друг, который знает, что C помогает мне, но он не знает Perl).

Я предоставляю образец ниже. Функция FLIGetLibVersion просто помещает len символов версии библиотеки на символ * ver. У меня вопрос, будет ли version_return форма моей памяти кода С утечки?

N.B. любые другие комментарии к этому коду приветствуются.

#!/usr/bin/perl

use strict;
use warnings;

use 5.10.1;

use Inline (
  C => 'DATA',
  LIBS => '-lm -lfli',
  FORCE_BUILD => 1,
);

say version_stack();
say version_return();

__DATA__
__C__

#include <stdio.h>

#include "libfli.h"

void version_stack() {

  Inline_Stack_Vars;
  Inline_Stack_Reset;

  size_t len = 50;
  char ver[len];

  FLIGetLibVersion(ver, len);

  Inline_Stack_Push(sv_2mortal(newSVpv(ver,strlen(ver))));
  Inline_Stack_Done;

}

SV* version_return() {

  size_t len = 50;
  char ver[len];

  FLIGetLibVersion(ver, len);
  SV* ret = newSVpv(ver, strlen(ver));

  return ret;

}

Edit:

Пытаясь ответить на этот вопрос самостоятельно, я попытался изменить строку на

SV* ret = sv_2mortal(newSVpv(ver, strlen(ver)));

и теперь, когда я запускаю скрипт, я получаю тот же вывод, что и раньше, плюс дополнительное предупреждение. Вот вывод:

Software Development Library for Linux 1.99
Software Development Library for Linux 1.99
Attempt to free unreferenced scalar: SV 0x2308aa8, Perl interpreter: 0x22cb010.

Я полагаю, это означает, что мне не нужно смертельно в этом случае? Я подозреваю, что ошибка говорит о том, что я пометил для коллекции то, что уже было в очереди на сбор. Может ли кто-нибудь подтвердить для меня, что это означает то предупреждение?

1 Ответ

1 голос
/ 03 марта 2011

Я поддерживаю Set :: Object в течение многих лет, и у меня тоже был этот вопрос - возможно, лучше всего взглянуть на источник этого кода, чтобы увидеть, когда что-то должно быть смертельно (github.com/samv/Set-Object),Я знаю, что Set :: Object имеет это сразу после многих изменений.Тем не менее, я думаю, это когда вы помещаете SV в стек возврата.Не уверен, как Inline все это меняет.

...