On 10/19/20 6:28 PM, Nicholas Wilson wrote:> On Tuesday, 20 October 2020 at 00:16:48 UTC, Ali Çehreli wrote:
>> On the D side, both of the following extern(C) functions take the same
>> arguments.
>
> https://github.com/dlang/dmd/pull/8120
>
> there are issues with structs. Not sure about length/ptr.

Thank you, Nic.

I see that doing the following is undefined behavior:

extern(C)
void dFunc(int[] arr) {                // <-- Takes slice
  assert(arr.equal(3.iota));
}

// A C function
void dFunc(size_t length, int * ptr);  // <-- Passes length+pointer

  int arr[] = { 0, 1, 2 };
  dFunc(3, arr);

C does not define an ABI. So, length+pointer can be passed in any way from there. The good thing is that D is aware of the "C Application Binary Interface of the target system"[1] but that means D would support taking length+pointer as well. Slice arguments are still strictly in length+pointer order for D.

So, it works on my Linux system by chance.

Ali

[1] https://dlang.org/spec/abi.html


Reply via email to