<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'><div><font face="Calibri, sans-serif">m3front/stmts/TryFinStmt.m3</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">        forigin  : INTEGER;</font></div><div><font face="Calibri, sans-serif">        ...</font></div><div><font face="Calibri, sans-serif">  last_name : INTEGER := 0;</font></div><div><font face="Calibri, sans-serif">  next_uid  : INTEGER := 0;</font></div><div><font face="Calibri, sans-serif">...</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">PROCEDURE HandlerName (uid: INTEGER): TEXT =</font></div><div><font face="Calibri, sans-serif">  CONST Insert = ARRAY BOOLEAN OF TEXT { "_M3_LINE_", "_I3_LINE_" };</font></div><div><font face="Calibri, sans-serif">  BEGIN</font></div><div><font face="Calibri, sans-serif">    RETURN M3ID.ToText (Module.Name (NIL))</font></div><div><font face="Calibri, sans-serif">           & Insert [Module.IsInterface ()]</font></div><div><font face="Calibri, sans-serif">           & Fmt.Int (uid);</font></div><div><font face="Calibri, sans-serif">  END HandlerName;</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">PROCEDURE Check (p: P;  VAR cs: Stmt.CheckState) =</font></div><div><font face="Calibri, sans-serif">  VAR zz: Scope.T;  oc: Stmt.Outcomes;  name: INTEGER;</font></div><div><font face="Calibri, sans-serif">  BEGIN</font></div><div><font face="Calibri, sans-serif">...</font></div><div><font face="Calibri, sans-serif">        p.viaProc := TRUE;</font></div><div><font face="Calibri, sans-serif">        name := p.forigin MOD 10000;</font></div><div><font face="Calibri, sans-serif">        p.handler.name := HandlerName (name);</font></div><div><font face="Calibri, sans-serif">        IF (name = last_name) THEN</font></div><div><font face="Calibri, sans-serif">          INC (next_uid);</font></div><div><font face="Calibri, sans-serif">          p.handler.name := p.handler.name & "_" & Fmt.Int (next_uid);</font></div><div><font face="Calibri, sans-serif">        ELSE</font></div><div><font face="Calibri, sans-serif">          last_name := name;</font></div><div><font face="Calibri, sans-serif">          next_uid := 0;</font></div><div><font face="Calibri, sans-serif">        END;</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">So the names of exception handlers are usually</font></div><div><font face="Calibri, sans-serif">the module name, followed by _M3_LINE_ or _I3_LINE_ followed</font></div><div><font face="Calibri, sans-serif">by a line number. BUT the line number is taken MOD 10000</font></div><div><font face="Calibri, sans-serif">and, something like, if the line number occasionally clashes,</font></div><div><font face="Calibri, sans-serif">we append another number...</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Why?</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Now, I can see that multiple lines can have the same name:</font></div><div><font face="Calibri, sans-serif">  TRY TRY EXCEPT EXCEPT</font></div><div><font face="Calibri, sans-serif">on one line.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">and the code should have a comment like that. But why the MOD 10000?</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">Is that in case INTEGER is 16 bits??</font></div><div><font face="Calibri, sans-serif">To keep the lengths of the names bounded??</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">I suggest the code look more like:</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">        p.viaProc := TRUE;</font></div><div><font face="Calibri, sans-serif">        name := p.forigin;</font></div><div><font face="Calibri, sans-serif">        p.handler.name := HandlerName (name);</font></div><div><font face="Calibri, sans-serif">        (* Handle the case of multiple exception handlers on the same line.</font></div><div><font face="Calibri, sans-serif">         * "TRY TRY EXCEPT EXCEPT" by appending _1, _2 to the second, third,</font></div><div><font face="Calibri, sans-serif">         * etc. handlers.</font></div><div><font face="Calibri, sans-serif">         *)</font></div><div><font face="Calibri, sans-serif">        IF (name = last_name) THEN</font></div><div><font face="Calibri, sans-serif">          INC (next_uid);</font></div><div><font face="Calibri, sans-serif">          p.handler.name := p.handler.name & "_" & Fmt.Int (next_uid);</font></div><div><font face="Calibri, sans-serif">        ELSE</font></div><div><font face="Calibri, sans-serif">          last_name := name;</font></div><div><font face="Calibri, sans-serif">          next_uid := 0;</font></div><div><font face="Calibri, sans-serif">        END;</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">At first I didn't think of multiple exception handlers on the same line.</font></div><div><font face="Calibri, sans-serif">But now that I thought of that, my real agenda is wrong -- to eliminate</font></div><div><font face="Calibri, sans-serif">the second number entirely.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">For now I'm stuck recognizing these patterns in my backend, because</font></div><div><font face="Calibri, sans-serif">other oddities on the frontend (that I'm still convinced are a bug).</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">I'd also be willing to append _0 or _1 for the first exception handler on a line,</font></div><div><font face="Calibri, sans-serif">for more consistency, at the cost of more noise for the overwhelmingly common case.</font></div><div><font face="Calibri, sans-serif">You know..if there were always two numbers, it would have saved me time...</font></div><div><font face="Calibri, sans-serif">since I coded at first to recognize just one number, then later hit a problem when two occured.</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> - Jay</font></div><br>                                          </div></body>
</html>