Доступ к значению, хранящемуся в объекте perl (благословенный хэш) из XS


У меня есть объект perl (благословенная ссылка на хэш), как это.

sub funcname {
  #some code
}

my $o = My::Class->new();
$o->{internal_data} = &funcname; #I know it is not nice

В другом месте где-то в коде XS, где у меня есть ссылка $o, мне нужно получить значение $o->{internal_data}.

/* at some point in XS code */
SV *obj = ... /* $o value passed to a XS function */
SV *func;
...
/* here I do not know how to load $o->{internal_data} value into func */
...
call_sv(func,G_SCALAR);

Возможно, есть какая-то глава в perl (api / xstut / guts|???). Я просто не смог его найти.

Заранее спасибо за любую подсказку.

-- kmx

2 3

2 ответа:

SvRV получите вы хэш (как SV*) из ссылки, MUTABLE_HV бросит его в A HV*, hv_fetch/hv_fetchs принесу из гашиша.

SV*  obj;
HV*  obj_hash;
SV** callback_ptr;
SV*  callback;

obj = ...;
obj_hash = MUTABLE_HV(SvRV(obj));
callback_ptr = hv_fetchs(obj_hash, "internal_data", 0);
if (!callback_ptr)
    croak("...");
callback = *callback_ptr;

Update : Теперь с codey goodness.

Если вы используете "стандартные" объекты, это в основном просто хэш, поэтому вы можете использовать методы HV. См., например, http://perldoc.perl.org/perlguts.html#Working-with-HVs (на самом деле, вся страница perlguts была бы хорошим чтением для этого...)

Ваш SV * на объект является ссылкой, поэтому вы можете использовать SvRV для "разыменования" его, приведя его к HV для передачи в функции hv_xxx (например, hv_fetch).

Удачи вам!