Thread Perl Funktion von XS aufrufen (16 answers)
Opened by Max_Perlbeginner at 2019-01-02 16:28

Max_Perlbeginner
 2019-01-02 16:28
#189433 #189433
User since
2016-04-04
107 Artikel
BenutzerIn
[default_avatar]
Liebe Perler,

Ich versuche mich gerade etwas in XS einzuarbeiten (ich weiß, ist verrückt ;-) ) und bin hier auf eine schönes Beispiel für den Aufruf einer Perl Funktion aus XS gestoßen (S. 32 ff.).

Es klappt auch alles ganz wunderbar, wenn ich den Aufruf (im Beispiel unten die Funktion _call_perl) im XS Teil schreibe. Es scheint jedoch vom Autor so gemeint zu sein, dass die Funktion im C Teil geschrieben wird (Sonst wäre die Formatierung doch anders? CODE: ... RETVAL:..). Wenn ich die Funktion im C Teil schreibe, erhalte ich u.a. folgende Fehlermeldung (und viele andere Hinweise):

Quote
Simple.xs: In function ‘_call_perl’:
/usr/lib/x86_64-linux-gnu/perl/5.26/CORE/perl.h:176:16: error: ‘my_perl’ undeclared (first use in this function); did you mean ‘my_fork’?
# define aTHX my_perl


Weiß jemand, warum es nicht klappt, wenn der Code im C-Teil steht. Oder ist dies einfach ein kleiner Fehler in der Anleitung?

Hier die relevanten Teile meines nicht funktionierenden Codes:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"
(...)
// C-Teil
(...)
static SV *my_callback;

static int
_call_perl()
{
dSP;
int count;
int retval;

ENTER; SAVETMPS; PUSHMARK(SP);

PUTBACK;
count = perl_call_sv((SV*)my_callback, G_SCALAR);
SPAGAIN;

if (count != 1)
croak("Error");

retval = POPi;
}

// XS Teil
MODULE: ... PACKAGE: ...
BOOT:
my_callback = newSVsv(&PL_sv_undef);

void
set_my_callback(ctx,callback=0)
MPV::Simple ctx
SV * callback
CODE:
sv_setsv(my_callback,callback);

static int
call_perl(ctx)
MPV::Simple ctx
CODE:
{
int ret;
ret = _call_perl();
RETVAL = ret;
}
OUTPUT: RETVAL


Der Aufruf aus Perl sieht dann folgendermaßen aus:
Code: (dl )
1
2
$ctx->set_my_callback(sub {print "callback called\n";my $c = $a+$b; return $c;});
my $count = $ctx->call_perl();


Im Voraus vielen lieben Dank für hoffentlich mit Eurer Hilfe einen weiteren Erkenntnisgewinn..
LG Max
Last edited: 2019-01-02 16:29:57 +0100 (CET)

View full thread Perl Funktion von XS aufrufen