Schrift
[thread]6669[/thread]

(Referenzen auf) CVs per Hand erzeugen: geht das? geht das in purem Perl?



<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
murphy
 2005-01-27 19:35
#51373 #51373
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Angenommen, ich weiß, wo im Speicher der Maschinencode einer Funktion mit ganz normaler, systemüblicher, C-Aufrufkonvention liegt. Gibt es dann irgendeine Möglichkeit, die Addresse dieser Funktion und das Wissen über Art und Zahl ihrer Parameter in eine Perl-CV-Referenz zu verwandeln?

Das Problem ist vor allem, dass ich

* das Ganze zur Laufzeit meines Perlskriptes erledigen will, ich also nicht im Vorfeld XSUB-Wrapper für die fragliche Funktion generieren kann.

* die Routine nicht einem Namen zuweisen möchte; eine Referenz darauf ist mir lieber.

* im Idealfall eine Lösung in purem Perl einer Implementation als XSUB vorziehen würde (Nicht dass man mich falsch versteht: Die Funktion, auf die ich eine Referenz haben will, kann ich nicht in ein XSUB packen. Die Funktion, die das Verpacken als Referenz erledigt möchte ich lieber in purem Perl haben, das muss aber nicht sein).
When C++ is your hammer, every problem looks like your thumb.
sri
 2005-01-28 04:01
#51374 #51374
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also ich glaube ich verstehe was du vor hast und eventuell habe ich auch eine Loesung.

chromatic hat mal versucht Parrot's Native Call Interface nach Perl5 zu portieren, das kann zwar soweit ich weiss nicht direkt auf Speicheraddressen zugreifen sollte aber genug sein um dich auf den richtigen Weg zu bringen.

P5NCI.tar.gz\n\n

<!--EDIT|sri|1106877759-->
murphy
 2005-01-28 16:29
#51375 #51375
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Danke für den Code. Ich habe mir das ganze mal durchgelesen und festgestellt, dass es vom Konzept her meiner geplanten Fallback-Lösung entspricht, die ich implementieren wollte, wenn mir nix besseres einfällt.

Die gewählte Technik ist halt im Endeffekt relativ codeaufwendig (ein XSUB für jede mögliche Funktionssignatur!) und nicht das effizienteste, was ich mir vorstellen kann.

Trotzdem ist diese Lösung besser als keine Lösung!\n\n

<!--EDIT|murphy|1106922803-->
When C++ is your hammer, every problem looks like your thumb.
esskar
 2005-01-28 22:19
#51376 #51376
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm...
du könntest dir in XS eine funktion schreiben, die als parameter die speicheradresse der eigentlichen funktion und die parameter gekommt... dann kannst du diese funktion im speicher aufrufen und fertig ist!

oder falsch verstanden?
murphy
 2005-01-29 00:11
#51377 #51377
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@esskar: Was du sagst stimmt. Genau das tut auch der Code, den sri in seinem Posting verlinkt hat. Man muss nur dazu sagen, dass die XSUB Routine eben zur Kompilationszeit wissen muss, wieviele und welche Art von Parametern die aufzurufende Funktion bekommt! Will man mit dieser Methode verschiedene Funktionssignaturen unterstützen, so braucht man unter Umständen jede Menge XSUBs!

Es gibt allerdings kaum Alternativen zu dieser Lösung. Irgendein CPAN Modul "löst" das Problem zum Beispiel durch den echt hässlichen Hack, anzunehmen, alle Parameter seien kleiner als ein long int, und man könne gefahrlos jeder Funktion dreißig Parameter übergeben, egal wieviele sie wirklich will.

Ich muss mir fast überlegen, ob ich nicht zusätzlich zu meinem aktuellen Hobbyprojekt, Wrapper für GNU Lightning zu erzeugen, auch noch Perl-Wrapper zu libffi erstellen soll. Dann ließe sich das Problem portabel erschlagen -- allerdings wird das ganze dann derart ineffizient, dass ich mir gleich das Wrappen von Lightning sparen kann...
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2005-01-29 01:22
#51378 #51378
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Und wenn Du in den XS-Wrapper ein bisschen Assembler einbaust? So koenntest Du doch eine beliebige Parameteruebergabe an Deine C-Funktion organisieren
esskar
 2005-01-29 01:24
#51379 #51379
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmmm...
du könntest immer nur einen parameter übergeben; aber diesen binär
Code: (dl )
1
2
3
 Typ  |  Length             | Data                     | Typ
------------------------------------------------------------
0x01   0x00 0x00 0x00 0x05   0x48 0x61 0x6c 0x6c 0x6f   0x00


Typ 0x01 ist z.B. String; Length ist die Länge als 32Bit zahl; dann die Daten der Länge Length und dann wieder ein Typ;
wenn typ = 0, dann pillo.
und ich denke, dass du kaum mehr zeugs als Zahlen + Strings brauchst, oder?
und den konverter Perl nach Binär kannst du dir locker mit pack zusammen bauen...

das XS muss dann wieder außeinander bauen und einfach übergeben....
esskar
 2005-01-29 01:25
#51380 #51380
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=betterworld,29.01.2005, 00:22]Und wenn Du in den XS-Wrapper ein bisschen Assembler einbaust?  So koenntest Du doch eine beliebige Parameteruebergabe an Deine C-Funktion organisieren[/quote]
dazu brauch er nicht mal assembler :)
murphy
 2005-01-29 02:03
#51381 #51381
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@betterworld: Assembler ist nicht portabel, daher möchte ich lieber darauf verzichten.

@esskar: Das Problem ist ja eben gerade nicht die Parameterübergabe Perl->XSUB sondern die Übergabe XSUB->Funktionspointer. An der Stelle hilft es mir nichts, irgendein geniales Interface zum Packen der Parameter in einen Binärstring zu erfinden, wenn die Funktion am anderen Ende des Pointers keine Ahnung davon hat.
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2005-01-29 02:21
#51382 #51382
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Sehe ich das richtig, dass Du etwas in Perl machen moechtest, was derartig lowlevel ist, dass es nicht einmal in C geht?
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2005-01-27 19:35.