On Saturday, 16 December 2017 at 11:19:36 UTC, Mike Parker wrote:
that's a binding, not a wrapper.

Right!

Not sure what you mean by "safe"
you only want to prevent changes on the D side and don't care
if they happen on the C side, then that's fine.

This, yes. I'd like const-annotated D code because of the static checks, without risking bugs from aggressive compiler assumptions. It's fine it the C side mutates privately.

I am ready to take responsibility in case I misjudge whether one of the C functions mutates detectable state or not.

Question 2. If yes, can the wrapper sanely declare foo(const A*) instead of foo(A*)?
if you pass immutable variables to the function -- if the
parameter is const even when the function modifies the
variable, D will allow immutable to be passed and you're
looking at unexpected behavior.

This is the heart of the problem, I've overlooked this.

None of my A are immutable, but declaring the bindings as foo(const A*) would take immutables.

I would expect SiegeLord to reject such a PR.
Only add const to parameters in C function declarations if
the C API actually declares those parameters as const.

That was my hunch, too. I've asked upstream on the Allegro forums. It would be a drastic change, I'd wager there won't be any const in the API anytime soon. But I'll give them the due time to decide.

If no const C API, I'd stick to private wrappers around DAllegro5, with a codebase-wide rule to not pass immutable.

In principle, I disagree with him
how much weight should be assigned to "probably".

Hmm, SiegeLord is a core Allegro 5 developer, he could judge overriding the C API's promises. But I share your sentiment that the public C API should have the final word.

Many thanks for the high-quality answer!

-- Simon

Reply via email to