<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'>If my opaque type exposes no public data, only functions, then I think I'll win significantly by just using "fully transparent prefix object types".<BR> <BR><br>I have to check if method calls incur a similar extra overhead.<BR> <BR><br>You know, if you have:<BR> <BR><br>TYPE T <: OBJECT METHODS<br>  F1();<br>END;<BR>NEW(T);<BR> <BR><br>vs.<BR> <BR>interface<BR>TYPE T = OBJECT METHODS<br>  F1();<br>END;<BR> <BR>module<BR> <BR>TYPE TImpl = T OBJECT more stuff END;<BR>PROCEDURE CreateT():T = BEGIN RETURN NEW(TImpl); END CreateT;<BR> <BR><br>the level of opacity is the same, but the second form likely has much lower overhead.<BR> <BR><br>The difference being that you can't directly NEW the type, you<br>have to use a special creator function.<BR> <BR><br>Debugging might might might be better in the first case, esp. with stock debuggers, if the backend has or finds enough information (imagine -- backend doesn't really have to be unit-at-a-time..it can sit around building everything in memory..waiting for all the type revelations..and generate everything into one C or .asm or whatever file...)<BR> <BR>That is, the second case is common in C++ a la COM, and debuggers<br>often only show a vtable and function pointers -- the base type.<br>They ought to figure out from the vtable the leaf type and show<br>everything..maybe Visual Studio does..I use windbg more...<BR> <BR> <BR><br> - Jay<br><br><br><br> <BR><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">Subject: Re: [M3devel] cost of opaque types<br>From: dragisha@m3w.org<br>Date: Wed, 3 Apr 2013 15:03:31 +0200<br>CC: m3devel@elegosoft.com<br>To: jay.krell@cornell.edu<br><br>There are languages, C# and Java coming to mind. where people accept a lot more from language/compiler for various reasons. <div><br></div><div>:)<br><div>
<span class="ecxApple-style-span" style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2;"><span class="ecxApple-style-span" style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2;"><div style="-ms-word-wrap: break-word;"><span class="ecxApple-style-span" style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2;"><div style="-ms-word-wrap: break-word;"><div>--</div></div></span></div></span><span class="ecxApple-style-span" style="font-family: Helvetica;">Dragiša Durić</span><span class="ecxApple-style-span" style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2;"><div style="-ms-word-wrap: break-word;"><span class="ecxApple-style-span" style="color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2;"><div style="-ms-word-wrap: break-word;"><div><a href="mailto:dragisha@m3w.org">dragisha@m3w.org</a></div><div><br></div></div></span></div></span></span><br class="ecxApple-interchange-newline">
</div>
<br><div><div>On Apr 3, 2013, at 10:46 AM, Jay K wrote:</div><br class="ecxApple-interchange-newline"><blockquote><span class="ecxApple-style-span" style="text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; border-collapse: separate; orphans: 2; widows: 2;"><div class="ecxhmmessage" style="font-family: Calibri; font-size: 12pt;"><div dir="ltr">cost of opaque types<br><br><br>fyi:<br><br>    PutI(cstr("Public.F1.a.c"), a.c);<br><br><br>PutI == put_adr<br>L_22_L_23 the string<br>L_26_L_27 == a<br>8 is the "public offset" of c<br>M_Public_L_19 globals for Public.m3<br><br><br>everything else is the computation of the "public base" of a from the base of a<br><br><br>actual C backend output cm3/m3-sys/m3tests/src/p2/p253/AMD64_DARWIN/Public.m3.c<br><br><br>put_adr(((ADDRESS)(L_22_L_23)),((ADDRESS)(((8)+(ADDRESS)(((ADDRESS)((((ADDRESS)(L_26_L_27))+(1* /* cast_removed2: INT64 */ *((INT64*)(M3_INT64(112)+((ADDRESS)(*((ADDRESS * )(M3_INT64(176)+((ADDRESS)((ADDRESS)&M_Public_L_19)))))))))))))))));<br><br><br>simplify slightly (how I wish it got printed...):<br><br>put_adr(L_22_L_23,8 + L_26_L_27 + *(INT64*)(112 + *(ADDRESS*)(176 + (ADDRESS)&M_Public_L_19)));<br><br><br><br>I still have to track down the whole "recompile again now that offsets are known" path.<br><br><br><br> - Jay<br></div></div></span></blockquote></div><br></div></div>                                         </div></body>
</html>