Calling exported string functions - PB 4.2 beta 2

Just starting out? Need help? Post your questions and find answers here.
Mistrel
Addict
Addict
Posts: 3415
Joined: Sat Jun 30, 2007 8:04 pm

Post by Mistrel »

This bug is still preventing TailBite from functioning properly with PureBasic 4.20. Is this a PureBasic bug or a TailBite bug?

http://www.purebasic.fr/english/viewtopic.php?t=32585
Fred
Administrator
Administrator
Posts: 18162
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

It's definitely a tailbite bug, how could it be a PB one ?
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

<Asks humbly> Some hint on how to fix this tailbite issue would be great !
I am no asm guru myself.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Fred
Administrator
Administrator
Posts: 18162
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

The tailbite function should change the 'Ret' line to:

Code: Select all

RET    X+4 
Only when a string is returned. It should work then.
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Post by srod »

Fred wrote:The tailbite function should change the 'Ret' line to:

Code: Select all

RET    X+4 
Only when a string is returned. It should work then.
Yes - it works! :) (Tested with coffIT, manually editing the ASM files and creating the DESC file by hand. Tailbite should easily follow suit.)

Thanks Fred. Looking at it, the damn solution was obvious!!!

Can I ask why PB passes an extra parameter when calling compiled user lib functions?
I may look like a mule, but I'm not a complete ass.
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

It seems to work yes (I only made a few tests).
1. only add 'RET X + 4' to the exported functions, not the private functions
2. don't use exported functions in the library

I have just updated the custom Tailbite for jaPBe V3 : http://freenet-homepage.de/gnozal/TailBite.zip
Source included, search for 'PB4.20 fix'. It seems to work.
Sorry, it's not the ABBKlaus source, but I am more confortable with the old ElChoni source :oops:
Last edited by gnozal on Tue May 27, 2008 2:44 pm, edited 1 time in total.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Post by srod »

gnozal wrote:2. don't use exported functions in the library
That should be fine Gnozal. I see no reason why that should be a problem.
I may look like a mule, but I'm not a complete ass.
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

srod wrote:
gnozal wrote:2. don't use exported functions in the library
That should be fine Gnozal. I see no reason why that should be a problem.
I made some tests, and it crashed.
I am probably doing something wrong, but imho the '+ 4' fix is only for the exported functions when called from the outside (PB), it's not right if the function is called from the library itself.
But then again, I am no asm guru.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Post by srod »

Right, I'll have a crack at it! :)
I may look like a mule, but I'm not a complete ass.
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Post by srod »

gnozal wrote:
srod wrote:
gnozal wrote:2. don't use exported functions in the library
That should be fine Gnozal. I see no reason why that should be a problem.
I made some tests, and it crashed.
I am probably doing something wrong, but imho the '+ 4' fix is only for the exported functions when called from the outside (PB), it's not right if the function is called from the library itself.
But then again, I am no asm guru.
Confirmed. Crashes if one exported string function calls another! :( Yes, thinking about it -and considering the code posted by Klaus above, it's obvious now.

Mind you, in this case you'll just have to ensure that no function within a library calls a string function from the same library which is to be exported. Just add a 'dummy' function through which the exported string function operates.
I may look like a mule, but I'm not a complete ass.
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

srod wrote:Mind you, in this case you'll just have to ensure that no function within a library calls a string function from the same library which is to be exported. Just add a 'dummy' function through which the exported string function operates.
Yes, that's what I did for one test library.
I will check all my libs for this before recompiling them with PB4.20 final.
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
ABBKlaus
Addict
Addict
Posts: 1143
Joined: Sat Apr 10, 2004 1:20 pm
Location: Germany

Post by ABBKlaus »

Thanks Fred, i´m going to donate now :D
Fred
Administrator
Administrator
Posts: 18162
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

srod wrote:Can I ask why PB passes an extra parameter when calling compiled user lib functions?
PB could need to reuse this parameter value, after the function call. Before VC8, the parameter value was never changed by the called function (as it was pushed on the stack which is not in the function scope), so we could use a trick to get it back if needed. With VC8, this trick didn't work anymore (the function can modify the user-parameter stack), so we have to duplicate the push, to be able to get it back if needed.
Mistrel
Addict
Addict
Posts: 3415
Joined: Sat Jun 30, 2007 8:04 pm

Post by Mistrel »

Is there an inconsistency somewhere that prevents us from calling an exported function that returns a string from within the same library? I'm assuming that the ASM output is different between a Procedure and ProcedureDLL.

Would it be possible to keep the ASM the same so that we can call these functions again with TailBite?
Mistrel
Addict
Addict
Posts: 3415
Joined: Sat Jun 30, 2007 8:04 pm

Post by Mistrel »

Removed by Mistrel. (I fixed the problem)
Last edited by Mistrel on Fri May 30, 2008 8:04 am, edited 2 times in total.
Post Reply