Mit XS versuche ich, Werte von einem C-Array in ein Perl-Array zu übergeben, das im Skript verwendet werden kann.
Hier ist der Code aus meiner xs-Datei:
%Vor%Es kompiliert gut, aber wenn ich folgendes in Perl ausführe:
%Vor% Es druckt nur ARRAY(0x1408cdc)
, wenn ich erwarte, dass es eine Liste von Zahlen ausgibt.
Wie kann ich meinen Code so ändern, dass er ein Perl-Array korrekt zurückgibt?
Perl Subs können nur (0 oder mehr) Skalare zurückgeben. Wenn Sie versuchten, ein Array zurückzugeben (unmöglich, ohne Perl zu crashen!), Lieferte die typemap-Standard-Map stattdessen einen Verweis auf dieses Array.
Beachten Sie, dass Ihr Programm auch Speicher verliert (weil die Standardtypemap für AV*
Ihr Array mortalisieren sollte, aber nicht).
Zurückgeben einer Referenz, Methode 1
%Vor%Speicherleckprüfung:
newAV
) -1 [verzögert] ( sv_2mortal
) +1 ( newRV
) = 1 [verzögert] (im Besitz von durch Bezugnahme) newRV
) -1 [verzögert] ( sv_2mortal
) = 0 [verzögert]
Perl:
%Vor%Zurückgeben einer Referenz, Methode 2
%Vor%Speicherleckprüfung:
newAV
) +0 ( newRV_noinc
) = 1 (gehört zur Referenz) newRV_noinc
) -1 [verzögert] ( sv_2mortal
) = 0 [verzögert]
Perl: & lt; wie oben & gt;
Zurückgeben einer Referenz, Methode 3
%Vor%Speicherleckprüfung:
newAV
) +0 ( newRV_noinc
) = 1 (gehört zur Referenz) newRV_noinc
) -1 [verzögert] ( mXPUSHs
) = 0 [verzögert]
Perl: & lt; wie oben & gt;
Skalare zurückgeben
Wir müssen den Kontext überprüfen, weil wir nicht mehr als einen Skalar außerhalb des Listenkontexts auf dem Stapel platzieren können.
%Vor%Perl:
%Vor% Hinweis: Das Refcnt-Dekrement um sv_2mortal
wird verzögert, bis der Aufrufer die Refcnt erhöhen kann.