Доступ к значению, хранящемуся в объекте 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 ответа:
SvRV
получите вы хэш (какSV*
) из ссылки,MUTABLE_HV
бросит его в AHV*
,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).
Удачи вам!