Visual D 0.50.0-beta1 released
Bert
Bert at gmail.com
Sun Jul 28 04:59:13 UTC 2019
On Wednesday, 24 July 2019 at 15:32:01 UTC, Rainer Schuetze wrote:
>
>
> On 24/07/2019 08:33, Bert wrote:
>> On Tuesday, 23 July 2019 at 20:57:17 UTC, Rainer Schuetze wrote
>>> As it turned out, the problem was (again?) a false entry in
>>> the class
>>> name cache that was added when an invalid pointer (including
>>> null) was
>>> evaluated (and its dynamic was tried to be determined).
>>> Stupid bug, but
>>> that happens.
>>>
>>> You can try the fixed version of MagoNatCC.dll from
>>> https://ci.appveyor.com/project/rainers/mago/build/artifacts
>>
>> That worked! I still find it very odd that it would exhibit it
>> with irrelevant lines of code removed. Was that changing the
>> cached version or something? Remember I basically have several
>> Q's in my program all virtually identical and some would work
>> and others wouldn't.
>>
>> Could you post some of the code that you fixed(or I guess push
>> it to master) when you get a chance... I'm just curious to
>> what it looks like. While such bugs are very annoying and
>> better coding methods should be used, I imagine that this type
>> of scenario for interface resolution is probably well
>> localized and this would probably be the last bug fix for it?
>> If not maybe some logging could be implemented. Interfaces
>> should always be resolvable so if the code fails it is a bug
>> in Visual D and having it logged in some way might help future
>> cases.
>
> The bugfix commit is
> https://github.com/rainers/mago/commit/9801da089a4b4e9ffa8f1442f4b0aff5852d5fa9?w=1.
>
> The problem was that evaluating the dynamic type of any
> uninitialized or null class/interface pointer could overwrite a
> previously evaluated entry in the vtbl->class name cache
> depending on what happens to be in an uninitialized local
> variable.
>
> Hopefully the last bug in that area, but you never know. Adding
> logging would help diagnosing bugs but would have to be more
> global.
Thanks.
I can't imagine though why adding a simple field would screw the
code up.
e.g.,
class X {} // works.
class Y { int y; } // fails.
I would think that such things would have no effect on the
pointer value?
Can you explain to me, for my own edification, why removing those
non-essential lines would produce the effect?
More information about the Digitalmars-d-ide
mailing list