C callbacks getting a value of 0! Bug in D?

Johnson Jones via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Aug 28 16:47:21 PDT 2017


On Monday, 28 August 2017 at 21:35:27 UTC, Steven Schveighoffer 
wrote:
> On 8/27/17 10:17 PM, Johnson Jones wrote:
>> Looking at the assembly shows something like this:
>> 
>> 0041ea98  push 0x0
>> 0041ea9a  push 0x0
>> 0041ea9c  push 0x0
>> 0041ea9e  push dword 0x100
>> 0041eaa3  mov ecx, [typeid(PaStreamParameters)+0xe36fc 
>> (0x80d4cc)]
>> 0041eaa9  mov eax, [fs:0x2c]
>> 0041eaaf  mov edx, [eax+ecx*4]
>> 0041eab2  push dword [edx+0x1c]
>> 0041eab8  push dword [edx+0x18]
>> 0041eabe  push dword [ebp-0x54]
>> 0041eac1  push dword [ebp-0x5c]
>> 0041eac4  mov ebx, PA.stream (0x823f30)
>> 0041eac9  push ebx
>> 0041eaca  call dword near [Pa_OpenStream (0x823f18)]
>> 
>> I noticed that those 0's were the values being fed in to the 
>> function.
>> 
>> I remember converting c_ulong's to ulong's and that they were 
>> probably uint's in D. Converting those fixed the problem and 
>> the callback is now called! I converted all the ulongs to 
>> uint's but there were a few longs and I don't know if they are 
>> c_longs or d_longs...
>> 
>> Anyways, At least I'm on the right track.
>> 
>
> For C/C++ interaction, always use c_... types if they are 
> available. The idea is both that they will be correctly defined 
> for the width, and also it will mangle correctly for C++ 
> compilers (yes, long and int are mangled differently even when 
> they are the same thing).
>
> -Steve

In portaudio, this doesn't seem to be the case. I changed all the 
longs to ints and ran my code in x64 and it worked fine.

It may just be that the stuff that uses long is not used in my 
code. In port audio I see it using unsigned long and so this 
should be 64-bits in x64. Surprised it worked. Maybe conversion 
is taking place or the high bits of the long are 0'ed and so 
there is not much difference.

Anyways, I guess I'll deal with any of those bugs when I run in 
to them, if they exist.



More information about the Digitalmars-d-learn mailing list