pu$�le

Jonathan M Davis jmdavisprog at gmail.com
Sun Jul 18 00:46:36 PDT 2010


On Sunday 18 July 2010 00:38:38 Jonathan M Davis wrote:
> On Saturday 17 July 2010 22:52:21 strtr wrote:
> > I think I'll start subject tagging my posts: [D1/D2]
> > std.stdio in D1 doesn't mention a write function and feeding the writef
> > function an illegal UTF string will result in a UTF exception.
> > With this information, what do you think the output should be?
> 
> Well, I certainly think that throwing an exception for bad UTF-8 values
> makes sense, though D2's docs for writef say nothing about exceptions, and
> on my machine, running Linux, they just fail to print anything. Throwing
> an exception would likely have been better.
> 
> In any case, I would have expected it to increment stash by 2 on the first
> loop because $ would be valid and would hit both scope(exit) and
> scope(success). After that... That continue makes me awfulling nervous.
> You'd expect the scope statements to be run in reverse order with continue
> and then stash--. However, to run that continue statement would have to
> skip the other scope statements...
> 
> I think that we'll have to lower the body of that foreach loop to have any
> clue what's going on here. It should come out to something like this, I
> would think:
> 
> const char[] coins = `$�`;
> 
> void main()
> {
>         writef(`I made `);
>         int stash = 0;
>         scope(exit) writefln(stash,`.`);
>         scope(failure) stash--;
> 
>         foreach(coin;coins)
>         {
>             try
>             {
>                 try
>                 {
>                     try
>                     {
>                         try
>                         {
>                             writef(coin);
>                         }
>                         catch
>                         {
>                             continue;
>                             throw;
>                         }
>                     }
>                     catch
>                     {
>                         stash--;
>                         throw;
>                     }
> 
>                     stash++;
>                 }
>                 catch
>                 {
>                     throw;
>                 }
>             }
>             finally
>             {
>                 stash++;
>             }
>         }
> }
> 
> 
> That being the case, the exception from writef() will always get eaten by
> the continue because the throw that rethrows the exception would never
> occur. Normally, code like that should result in a compilation error, but
> it might not given that it's the compiler creating the try-catch block. My
> guess is that this is a bug in dmd. It makes no sense to me to allow any
> kind of goto, break, or continue statements in a scope statement's body.
> 
> Regardless, that continue would mean that the first stash++ would be
> skipped, but the second would still happen because it's in a finally
> block. That means that each of the 3 bad UTF-8 values which make up the
> euro symbol would each increment stash once. So, the overall result would
> then be 5.
> 
> It's possible that I lowered those scope statements incorrectly, but it
> looks to me like that's what the code should be doing. Regardless,
> continue in a scope statement should be an error.
> 
> - Jonathan M Davis

Hmm. Well, it seems that throw by itself is not legal D. You have to do 
something like

catch(Exception e)
{
    throw e;
}


But in any case,

catch(Exception e)
{
    continue;
    throw e;
}

compiles just fine. That seems to me like it shouldn't though, since then throw 
e; is an unreachable statement. In any case, I'll file a bug report on this.


- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list