| |
| Posted by Manu in reply to Gregor Mückl | PermalinkReply |
|
Manu
Posted in reply to Gregor Mückl
| On Tue, 20 Aug 2024 at 10:26, Gregor Mückl via Digitalmars-d < digitalmars-d@puremagic.com> wrote:
> On Sunday, 18 August 2024 at 09:42:16 UTC, Nicholas Wilson wrote:
> > On Sunday, 18 August 2024 at 04:43:34 UTC, Manu wrote:
> >> I just tried using ImportC for the first time ever, but I was
> >> surprised
> >> when I immediately received a sea of errors calling the C
> >> symbols from
> >> `nothrow @nogc` functions.
> >> My entire program is `nothrow @nogc`... I assumed ImportC
> >> would be
> >> supremely suitable in this context, but apparently not...
> >>
> >> Is there something I've missed? Is there a plan for this?
> >> I found just one single very short forum thread...
> >>
> >> This is classic D experience; so much work has been done on this, and then the moment I try and use something I encounter a showstopping oversight >_<
> >
> > Well, C may call C++ which may throw. It is very unlikely to call the GC however.
> >
> > I don't think it would be hard to add a switch that "`extern(C)` functions being called from import C are `@nogc`".
>
> Here's what I'm thinking:
>
> The C function interface has no notion of C++ exceptions (AFAIK it's following C specs, not C++), so C++ exceptions should not even be a consideration at that point. I do not think that throwing a C++ exception up a stack that contains extern(C) functions is even properly defined behavior on the C++ side. In other words, all ImportC declarations should be implicitly @nothrow.
>
> Any usage of the D GC from a C interface could only come in two flavors: D code exported through a C interface or a C interface implemented in another language that uses the D GC through a library interface. I believe that both cases should be treated as if the use of the D GC is an implementation detail and an implicit @nogc is warranted.
>
Exactly... these points are my precise assumption going in here.
Also, considering the possibility that D code is called from C code via a
function pointer; you have to wonder how the C code received a function
pointer in the first place? If the C code is nothrow @nogc, then it would
be impossible to supply a function pointer that was not also nothrow @nogc
to the C code in the first place.
|