[D-runtime] win32 regression in exception handling

Walter Bright walter at digitalmars.com
Wed Jan 26 22:23:52 PST 2011

Jonathan M Davis wrote:
> On Wednesday 26 January 2011 21:32:13 Brad Roberts wrote:
>> On 1/26/2011 11:19 AM, Brad Roberts wrote:
>>> On 1/26/2011 8:51 AM, Jonathan M Davis wrote:
>>>> On Wednesday 26 January 2011 04:35:13 Don Clugston wrote:
>>>>> On 26 January 2011 12:21, Jonathan M Davis <jmdavisProg at gmx.com> wrote:
>>>>>> On Wednesday 26 January 2011 03:02:55 Don Clugston wrote:
>>>>>>> On 26 January 2011 11:17, Jonathan M Davis <jmdavisProg at gmx.com> wrote:
>>>>>>>> On Wednesday 26 January 2011 01:58:50 Don Clugston wrote:
>>>>>>>>> On 26 January 2011 10:32, Jonathan M Davis <jmdavisProg at gmx.com> 
> wrote:
>>>>>>>>>> How else would an error be thrown?
>>>>>>>>> In many cases, it's thrown by hardware. The exception object is
>>>>>>>>> created long after the throw occurred.
>>>>>>>>> There are also 'foreign' exceptions, which are thrown by (say) C++.
>>>>>>>>> (I suspect that Linux DMD can't handle any of those -- but Windows
>>>>>>>>> DMD can).
>>>>>>>> So, what exactly about that makes it a problem that the file and
>>>>>>>> line number have default arguments? If it gives the arguments (like
>>>>>>>> it pretty much has to be doing),
>>>>>>> No, it doesn't give the arguments. It has no way of knowing what they
>>>>>>> are (in fact, they may not even exist at all).
>>>>>>> then it doesn't use the defaults, so they don't cause any problems
>>>>>>>> there. And is it only file and line number which cause problems if
>>>>>>>> they have defaults, or is it everything (e.g. Throwable next)?
>>>>>>> It's only file and line number that are a problem. next will just be
>>>>>>> null. The thing which you're maybe not understanding is that in these
>>>>>>> cases, the exception object is created when it is caught, not when it
>>>>>>> is thrown.
>>>>>> Well, I certainly I have no clue about what is really going on then,
>>>>>> and it would probably take a fair bit of discussion and/or research
>>>>>> for me to understand. Obviously, there's stuff going on here that's
>>>>>> at a far lower level than I'm used to dealing with.
>>>>> Yeah, it's a bit hairy. It took me a few weeks to work out what's going
>>>>> on. There's all kinds of weird stuff, where you make function calls
>>>>> that never return, because the stack disappears...
>>>>> In the end, the whole thing is an elaborate illusion that gives you a
>>>>> really nice model to program against.
>>>>> Fortunately, all of the weirdness is confined to a very small number
>>>>> of functions.
>>>>>> Regardless, is it all Throwables that have the problem, or is it just
>>>>>> Throwable, Exception, and or Error? Throwable and Error really
>>>>>> shouldn't be a problem, since programmers wouldn't normally be
>>>>>> creating those (at most, they'd be creating objects derived from
>>>>>> them), but you definitely lose something if Exception has the problem
>>>>>> as well. And you
>>>>>> _definitely_ lose something if _all_ Throwables have the problem. In
>>>>>> any case, I need to know which ones are a problem if I'm going to fix
>>>>>> them.
>>>>> It is only Throwable, and Error. Not anything derived from them.
>>>>> (Really, I think both of those should eventually become abstract
>>>>> classes anyway. Not right now, because compiler changes are required).
>>>> Well, that shouldn't be much of a problem then. I really would have
>>>> expected them to be abstract anyway. I'll check in a fix shortly.
>>>> - Jonathan M Davis
>>> Hrm.. the revert didn't make the problem go away:
>>> http://d.puremagic.com/test-results/test.ghtml?runid=6631
>>> You can see from the checkout log that the object files were updated, but
>>> from the dmd test run, the same test failed in the same way.
>> Fixed enough to not crash any more.  The problem is that while there are
>> default args on the function, the caller is always responsible for setting
>> up the stack correctly.  The calls to the HiddenFuncError code are all
>> compiler generated and only generates the one original parameter right
>> now.  So I reverted back to the version before the changes.
>> I don't know that we're done with this discussion.. but at least the tests
>> are passing once again.
> Well, I'm not sure that I entirely understand what the problem is, but it sounds 
> like the problem relates to the extern(C) functions in particular. So, perhaps 
> all of those should be reverted. Proper D code can use the Error types directly 
> if it likes, and then I would expect that the default arguments would work just 
> fine. It sounds like the default arguments are causing problems in cases where 
> what we're dealing with is on a low enough level that the normal D rules don't 
> necessarily apply. I did verify that default arguments worked with extern(C) 
> before checking in those changes, but apparently what I tested wasn't good 
> enough. Perhaps it's because I then called the extern(C) functions from D rather 
> than C or C++. That might explain why I missed it.
> So, does it sound like it would just be a good idea to revert the changes on the 
> extern(C) functions? I'd rather be safe than sorry, and while I do think that in 
> general, it's best to have the file and line arguments for exception types have 
> default arguments, if we're talking about low level and/or C/C++ code which is 
> dealing with it, it might be best to just play it safe and not have the default 
> arguments on the extern(C) functions.

I think it's better to figure out exactly what went wrong rather than 
all the guessing going on. Is it a mismatch between calling conventions 
between the caller and the callee? Just what instruction was the seg 
fault on?

More information about the D-runtime mailing list