Utilisations des librairies

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Utilisations des librairies

Message par Anonyme2 »

Fred,

je pense que tu as déjà du y penser.

Il serait possible dans une version future (pas dans 20 ans :D ) d'appeller une commande sans que PB empile l'adresse de retour mais en empilant les paramètres de manière à éviter un CALL/RET et de pouvoir optimiser certains codes des librairies. Je pense qu'une option de plus dans le descripteur permettrai de faire ça simplement avec par exemple l'option NoReT ajoutée à celle existante (ou autre chose)

Ex

IsFonctionOk, Long, (#gadget) - Test le résultat de la fonction
Long | NoReT

IsFonction1Ok, Long, (#gadget) - Test le résultat de la fonction
Long | StdCall | NoReT
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Je ne vois pas trop ce que tu veux faire, peux tu poster un petit exemple ?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Fred a écrit :Je ne vois pas trop ce que tu veux faire, peux tu poster un petit exemple ?
Ma question au départ était que j'aurais aimé que PB appelle une fonction et que ma fonction soit en fait une macro asm avec les paramètres sans retour puis je me suis dit ça pourrait être utilisé pour n'importe quel code mais en essayant de faire ça sur papier, je me rend compte que ça n'apporte pas grand chose (on se rapproche du code de l'API).

On a ceci lorsque l'on appelle une commande de ce type là en StCall pour une fonction qui s'appelle fonction et qui a 3 paramètres de type long

fonction(Param1, Param2, Param3)

PB empile Param3, Puis Param2 puis param1 puis le pointeur d'instruction est empilé (adresse de retour) par le call PB_fonction

Ensuite dans la routine, il y a de grandes chance que l'on empile une nouvelle fois les paramètres à partir de leurs emplacements respectifs pour l'appel d'une API ou msg ou d'une commande PB ou utilisateur

Je pensais que PB pourrait empiller les paramètres définis dans le desc puis inclure le code directement sans appel de fonction, ce qui ressemble à une macro commande.

Voilà un petit exemple de ce que je voudrais faire

Voici une code asm d'une de mes libs perso d'une commande qui retourne #true si la statusbar est au format UNICODE ou 0 si elle est au format ANSI (passage de 1er param par eax)

Code : Tout sélectionner

section '.text' code readable executable

PB_IsStatusBarUnicode:
; IsStatusBarUnicode(StatusBarID)
	SUB	 edx,edx
	PUSH	 edx
	PUSH	 edx
	PUSH	 dword SB_GETUNICODEFORMAT
	PUSH	 StatusBarID
	CALL   _SendMessageA@16
_Retour:
	RET
ça correspond au message PB

Code : Tout sélectionner

SendMessage_(StatusBarID, #SB_GETUNICODEFORMAT, 0, 0)

PB va appeller cette commande comme ça

Code : Tout sélectionner

PUSH  dword [type]
PUSH  StatusBarID
CALL  IsStatusBarUnicode

Moi je voudrais ça

le message a besoin de 4 param dont dans ce cas là 2 paramètres à 0

On pourrait indiquer dans le desc que la fonction a 4 paramètres dont deux à 0 et qu'il est inutile de l'indiquer dans la commande écrite en PB, de même une autre valeur du message est connue à l'avance, il s'agit de la valeur #SB_GETUNICODEFORMAT donc la commande pourrait s'appeller en PB :

Code : Tout sélectionner

IsStatusBarUnicode(StatusBarID)
PB empilerait donc en fonction du desc tous les paramètres dont 3 pourraient dans ce cas là être définis dans le descripteur, ensuite pas de call d'une fonction mais le code direct (je ne sais pas si c'est possible)

Code : Tout sélectionner

IsStatusBarUnicode,  Long, Long = #SB_GETUNICODEFORMAT,  Long =0, Long = 0, (StatusBarID) - Get If StatusBar text is ANSI or UNICODE
Long
PB empile tous les paramètres dans le bon ordre avec les bonnes valeurs.

le code de la fonction (= macro) se charge de remettre le pointeur de pile à la bonne valeur (dans ce cas c'est un appel à msg MS)

Ca permettrait dans certains cas d'optimiser le code (oui je sais on peut mettre le msg directement mais tout le monde ne connait pas forcément les API MS et c'est un cas avec des API mais ça peut être une commande PB ou utilisateur.

Reste à trouver par quoi remplacer le Call dans le code asm généré par PB pour que on ne puisse pas pomper tout le code asm des commandes

C'est peut-être une usine à gaz :roll:

C'est clair ?

Bon si c'est pas possible, je m'en remettrais :D
Répondre