[Moscow.pm] perl xs : как передать объект класса из XS в Perl и обратно

aznaourian nikita nikita-aznaourian на yandex.ru
Чт Июл 1 06:14:48 PDT 2010


Всем привет.

Есть класс описанный в XS :

class A {
public:
      A() {a = 100;};
      void check() {printf("a is %d\n", a)};
      int a;
};

MODULE = Test::test1      PACKAGE = Test::test1::Package

A* A::new() 
CODE:
     RETVAL = new A();
OUTPUT:
     RETVAL


Также описание этого класса присутствует в typemap:

TYPEMAP
A * O_OBJECT

Далее объект этого класса создается в perl:

my $cppobject = Test::test1::Package->new()
и сохраняется.

Также в perl описана функция, которая возвращает этот объект:

sub getCpp {
     my ($self) = @_;
     return $self->[CppOBJECT];
}

Причем Dump показал, что на данном этапе сохранненый и текущие объекты совпадают:


В какой-томомент XS дергает эту функцию и получает объект класса А.

SV* cppObject = call_getCpp();

Далее если просто кастовать SV* к A* и вызывать функцию check - то значение a выведется неправильным.
Хотя все функции вызываются нормально.

Вопрос - как нужно правильно кастовать полученный объект к нужному типу, чтобы с ним можно было работать?


Подробная информация о списке рассылки Moscow-pm