<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"><base href="x-msg://3303/"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br>
<br><div><div>On Oct 4, 2012, at 12:16 PM, Jay K <<a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="hmmessage" style="font-size: 12pt; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div dir="ltr">Yes..the assertions all passes..but granted, maybe we don't have full coverage. I can look at the frontend, or just make it so in the backend.<div><br></div><div><br></div><div>On further thought..by quick read..this M3x86.m3 code is questionable.</div><div>While in_proc is usually false for declare_local, I think it really goes both ways.</div><div>So it looks like size is sometimes rounded up to 4, sometimes left as zero.</div><div><br></div><div><br></div><div>But what does it mean?</div><div>Does a zero sized array get any storage?</div></div></div></blockquote><div><br></div>No storage.</div><div><br></div><div><blockquote type="cite"><div class="hmmessage" style="font-size: 12pt; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div dir="ltr"><div>In C and C++, two objects can't be at the same address, so, for example:</div><div>struct foo { } bar; is not legal C. It is legal C++, however:</div></div></div></blockquote><div><br></div><div>But you can have zero-length arrays in C.</div><br><blockquote type="cite"><div class="hmmessage" style="font-size: 12pt; font-family: Calibri; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div dir="ltr"><div><br></div><div><br></div><div>struct foo { } a,b;</div><div>assert(&a != &b); will pass.</div><div><br></div><div><br></div><div>and</div><div>void* a = malloc(0);</div><div>void* b = malloc(0);</div><div>assert(a != b) will also pass in C and C++.</div><div><br></div><div><br></div><div>That is, size 0 struct is invalid in C. In C++ it is rounded up to at least 1.</div><div>malloc(0) is rounded up to at least 1.</div><div><span style="font-size: 12pt; ">No two "objects" can have the same address.</span></div><div><br></div><div><br></div><div>What is the meaning Modula-3?</div><div>Rounding up to 1 or alignment seems easy/decent.</div><div>Certainly these zero sized things are rare in our tree.</div><div><br></div><div><br></div><div> - Jay<br><div><br><br><br><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">CC: <a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>From: <a href="mailto:antony.hosking@gmail.com">antony.hosking@gmail.com</a><br>Subject: Re: [M3devel] zero sized structs?<br>Date: Thu, 4 Oct 2012 09:21:28 -0400<br>To: <a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br><br><div>Try to respect alignment. <br><br>Sent from my iPad</div><div><br>On Oct 4, 2012, at 2:25 AM, Jay K <<a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a>> wrote:<br><br></div><div></div><blockquote><div dir="ltr"><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><span class="ecxApple-tab-span" style="white-space: pre; "> </span>declare_local<span class="ecxApple-tab-span" style="white-space: pre; "> </span><span class="Apple-converted-space"> </span>noArgs 0 8 Struct -1522787086 T F 50 v.318</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 here is some relevant M3x86 code:</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> IF u.in_proc THEN</font></div><div><font face="Calibri, sans-serif"> v := get_temp_var (u, type, s, a, n);</font></div><div><font face="Calibri, sans-serif"> ELSE</font></div><div><font face="Calibri, sans-serif"> v := create_temp_var (u, type, s, a, n);</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">PROCEDURE get_temp_var (u: U; type: Type; s: ByteSize; a: Alignment;</font></div><div><font face="Calibri, sans-serif"> n: Name := M3ID.NoID): x86Var =</font></div><div><font face="Calibri, sans-serif"> BEGIN</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> (* round size and alignment up to 4 *)</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> IF s < 4 THEN</font></div><div><font face="Calibri, sans-serif"> s := 4;</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"> IF a < 4 THEN</font></div><div><font face="Calibri, sans-serif"> a := 4;</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">PROCEDURE create_temp_var (u: U; type: Type; s: ByteSize; a: Alignment;</font></div><div><font face="Calibri, sans-serif"> n: Name): x86Var =</font></div><div><font face="Calibri, sans-serif"> VAR v := NewVar(u, type, 0, s, a, n);</font></div><div><font face="Calibri, sans-serif"> BEGIN</font></div><div><font face="Calibri, sans-serif"> v.loc := VLoc.temp;</font></div><div><font face="Calibri, sans-serif"> v.parent := u.current_proc;</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> u.current_proc.framesize := Word.And(u.current_proc.framesize + a - 1,</font></div><div><font face="Calibri, sans-serif"> Alignmask[a]);</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> INC(u.current_proc.framesize, s);</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> v.offset := -u.current_proc.framesize;</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"> RETURN v;</font></div><div><font face="Calibri, sans-serif"> END create_temp_var;</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">which isn't clear by inspection...it actually looks like</font></div><div><font face="Calibri, sans-serif">zero size is allowed through commonly...in_proc is rare,</font></div><div><font face="Calibri, sans-serif">so create is common...assuming the frame is already aligned,</font></div><div><font face="Calibri, sans-serif">the size remains unchanged...</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">Relevant aside: I have been ignoring alignment.</font></div><div><font face="Calibri, sans-serif">I'm inclined to go with something like:</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif"><* ASSERT (size MOD alignment) = 0 *></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">If that ever fails, then I will change it to:</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">FUNCTION RoundUp(a, b: INTEGER): INTEGER =</font></div><div><font face="Calibri, sans-serif">BEGIN</font></div><div><font face="Calibri, sans-serif"> WITH c = a MOD b DO</font></div><div><font face="Calibri, sans-serif"> IF c # 0 THEN</font></div><div><font face="Calibri, sans-serif"> RETURN a + b - c;</font></div><div><font face="Calibri, sans-serif"> END;</font></div><div><font face="Calibri, sans-serif"> END;</font></div><div><font face="Calibri, sans-serif"> RETURN a;</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">size := RoundUp(size, alignment);</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 then, more to the point, I'll go with:</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">IF size = 0 THEN</font></div><div><font face="Calibri, sans-serif"> size = 1;</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">I haven't dug into what the gcc backend would do here, too much</font></div><div><font face="Calibri, sans-serif">to dig through. :)</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">I guess I should try both m3x86 and m3cc, and print the address</font></div><div><font face="Calibri, sans-serif">of these things????</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><br><div style="font-family: Calibri, sans-serif; font-size: 12pt; "><div id="ecxSkyDrivePlaceholder"></div><hr id="ecxstopSpelling">From:<span class="Apple-converted-space"> </span><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br>To:<span class="Apple-converted-space"> </span><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>Date: Thu, 4 Oct 2012 06:13:28 +0000<br>Subject: [M3devel] zero sized structs?<br><br><div dir="ltr"><div><font face="Calibri, sans-serif">Building obliqrt I get:</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">***</font></div><div><font face="Calibri, sans-serif">*** runtime error:</font></div><div><font face="Calibri, sans-serif">*** <*ASSERT*> failed.</font></div><div><font face="Calibri, sans-serif">*** file "../src/M3C.m3", line 1768</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"><br></font></div><div><font face="Calibri, sans-serif">PROCEDURE GetStructSizes_Declare(self: GetStructSizes_t; type: Type; byte_size: ByteSize): M3CG.Var =</font></div><div><font face="Calibri, sans-serif">BEGIN</font></div><div><font face="Calibri, sans-serif"> IF type = Type.Struct THEN</font></div><div><font face="Calibri, sans-serif"> <* ASSERT byte_size > 0 *></font></div><div><font face="Calibri, sans-serif"> self.sizes[self.count] := byte_size;</font></div><div><font face="Calibri, sans-serif"> INC(self.count);</font></div><div><font face="Calibri, sans-serif"> END;</font></div><div><font face="Calibri, sans-serif"> RETURN NIL;</font></div><div><font face="Calibri, sans-serif">END GetStructSizes_Declare;</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">due to presumably:</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 ApplyThreadClosure (self: ObliqThreadClosure): REFANY =</font></div><div><font face="Calibri, sans-serif"> VAR noArgs: ARRAY [0 .. -1] OF ObValue.Val;</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">...</font></div><div><font face="Calibri, sans-serif"><br></font></div><div><font face="Calibri, sans-serif">PROCEDURE HandleWork (self: ObliqWork) =</font></div><div><font face="Calibri, sans-serif"> VAR noArgs: ARRAY [0 .. -1] OF ObValue.Val;</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 EvalThread ( self : PackageThread;</font></div><div><font face="Calibri, sans-serif">...</font></div><div><font face="Calibri, sans-serif">noArgs : ARRAY [0 .. -1] OF ObValue.Val;</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">What is the meaning of this?</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></div></div></div></blockquote></div></div></div></div></div></blockquote></div><br></body></html>