<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'>correction:<div><br></div><div><div><font face="Calibri, sans-serif"> temp = RTHooks__AllocateTracedRef(...); </font></div><div><font face="Calibri, sans-serif"> sources = temp </font></div><div><font face="Calibri, sans-serif"> if sources == NULL </font></div><div><font face="Calibri, sans-serif"> raise exception </font></div><div><font face="Calibri, sans-serif"><br></font></div><div><br></div> - Jay<br><br><br><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">From: jay.krell@cornell.edu<br>To: m3devel@elegosoft.com<br>Date: Thu, 25 Oct 2012 05:42:16 +0000<br>Subject: [M3devel] suspicious order of evaluation?<br><br>
<style><!--
.ExternalClass .ecxhmmessage P
{padding:0px;}
.ExternalClass body.ecxhmmessage
{font-size:12pt;font-family:Calibri;}
--></style>
<div dir="ltr"><div><font face="Calibri, sans-serif"> m3tohtml/src/Main.m3: </font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> sources is global </font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> PROCEDURE Add() = </font></div><div><font face="Calibri, sans-serif"> BEGIN </font></div><div><font face="Calibri, sans-serif"> sources := NEW (Source, next := sources, </font></div><div><font face="Calibri, sans-serif"> from := Pathname.Join(pkgpath, file, NIL), </font></div><div><font face="Calibri, sans-serif"> to := Pathname.Join(pkg, FixDerived (file), NIL), </font></div><div><font face="Calibri, sans-serif"> kind := kind); </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"> It APPEARS this compiles to like: </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"> temp = RTHooks__AllocateTracedRef(...); </font></div><div><font face="Calibri, sans-serif"> sources = temp </font></div><div><font face="Calibri, sans-serif"> if temp == NULL </font></div><div><font face="Calibri, sans-serif"> raise exception </font></div><div><font face="Calibri, sans-serif"> sources->from = ... </font></div><div><font face="Calibri, sans-serif"> sources->to = ... </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"> To me this seems a bit suspicious. </font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> First, the null check should be against the temp. </font></div><div><font face="Calibri, sans-serif"> Sources should not be assigned and then checked. </font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> Second, probably, the fields of sources should be filled in before </font></div><div><font face="Calibri, sans-serif"> the global. </font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> So, it should be more like: </font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> </font></div><div><font face="Calibri, sans-serif"> temp = RTHooks__AllocateTracedRef(); </font></div><div><font face="Calibri, sans-serif"> if temp == NULL </font></div><div><font face="Calibri, sans-serif"> raise exception </font></div><div><font face="Calibri, sans-serif"> temp->from = ... </font></div><div><font face="Calibri, sans-serif"> temp->to = ... </font></div><div><font face="Calibri, sans-serif"> sources = temp </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">Just as efficient, but "safer".</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 realize, without a lock or barrier, the compiler is free to reorder like this.</font></div><div><font face="Calibri, sans-serif">Maybe ideally temp would be gone but the original order used?</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">C++ would implement it more like how I showed.</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">Thoughts?</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><br> </div></div></div> </div></body>
</html>