On 4/8/14, 5:03 AM, David Nadlinger wrote:
On Tuesday, 8 April 2014 at 10:08:24 UTC, Jacob Carlborg wrote:
Is there a reason to not use the same model, or what's required to be 
compatible?

In short, the reason not to use the same "model" (you could argue that the 
model is the same, as
only the personality functions differ) is that the exception unwinder is 
intimately tied to both the
target language ABI and semantics.

For example, all unwinders need to handle the run-time type information for the 
exception object to
correctly dispatch it. And while e.g. the GNU C++ unwinding implementation 
needs to pull shenanigans
to implement the crazy C++ exception lifetime model (cf. catching by reference 
vs. by value) and
enforce throws(...) specifications, the D unwinder needs to understand the 
difference between
Exception and Error and correctly implement exception chaining.

Now, of course, it is possible to find a middle ground that works as a basis 
for virtually all
languages. In fact, I'd argue that SEH for Windows actually provides such a 
layer, and libunwind
does too. For example, a proper implementation of a libunwind personality 
function allows you to
check whether a given exception originated in your own language, and just pass 
it on otherwise (such
that e.g. C++ exception just bubble through a layer of D code). In theory, it 
would e.g. also be
possible to wrap foreign exceptions in e.g. D Throwable objects to make them 
catchable in D code.
But the lifetime of the foreign object is virtually impossible to get right in 
the general case, and
the benefits of wrapping exceptions like this have turned out not to be worth 
it, because it is hard
to handle them in a sensible way in the receiving language (DMD actually does – 
did? – something
like this on Win32).

David

I think, for a mixed language application, that the important part is proper object lifetime management more than being able to catch exceptions from different languages. When unwinding a c++ exception that has stack frames intermixed with D, destructors need to be executed appropriately, and vice versa.

This is also an important part of having abi compatibility between D compilers, something which we don't have today but really must have eventually.. hopefully not years away.

Reply via email to