Null references (oh no, not again!)
Max Samukha
samukha at voliacable.com.removethis
Thu Mar 5 00:49:55 PST 2009
On Thu, 05 Mar 2009 09:09:42 +0100, Don <nospam at nospam.com> wrote:
>Denis Koroskin wrote:
>> On Wed, 04 Mar 2009 19:39:06 +0300, Don <nospam at nospam.com> wrote:
>>
>>> Andrei Alexandrescu wrote:
>>>> Don wrote:
>>>>> Andrei Alexandrescu wrote:
>>>>>> And there is no reference type with two subtypes. It's one type in
>>>>>> the language and one in the library. Maybe-null (the library) is a
>>>>>> supertype of non-null (the default).
>>>>>
>>>>> One problem I can see is with extern(C),(Windows) functions, since
>>>>> pointers are maybe-null in C. The name-mangling has to work out.
>>>>> I can't see how this can be done without the compiler knowing
>>>>> SOMETHING about both nullable and non-nullable types.
>>>>> At the bare minimum, you need to deal with maybe-null returns and
>>>>> reference parameters from C functions.
>>>> Walter is thinking of making only references non-null and leaving
>>>> pointers as they are. (I know, cry of horror.) But say pointers are
>>>> also non-null. Then:
>>>> extern(C) MaybeNull!(void*) malloc(size_t s);
>>>> will work, provided that MaybeNull has no size overhead and that
>>>> word-sized structs are returned in the same register as word returns
>>>> (I seem to remember Walter told me that's the case already).
>>>
>>> Here's a typical annoying Windows API function
>>> --------
>>> int GetTextCharsetInfo(
>>> HDC hdc, // handle to DC
>>> LPFONTSIGNATURE lpSig, // data buffer
>>> DWORD dwFlags // reserved; must be zero
>>> );
>>>
>>> lpSig
>>> [out] Pointer to a FONTSIGNATURE data structure that receives
>>> font-signature information. The lpSig parameter can be NULL if you do
>>> not need the FONTSIGNATURE information.
>>> ---------
>>> How do you do this?
>>>
>>> Don.
>>
>> extern(System) int GetTextCharsetInfo(
>> HDC hdc,
>> MaybeNull!(FONTSIGNATURE*) lpSig, // or whatever
>> DWORD dwFlags);
>>
>> GetTextCharsetInfo(hdc, null, flags); // fine
>> GetTextCharsetInfo(hdc, &sig, flags); // also ok
>>
>But it needs to have the type name mangled as LPFONTSIGNATURE, not as
>MaybeNull!(FONTSIGNATURE*). Otherwise it can't link to Windows.
Parameter names are not mangled for stacall, only their total size.
IIRC, the above will get mangled into _GetTextCharsetInfo at 12 just like
it would without MaybeNull
More information about the Digitalmars-d
mailing list