<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi Pierre,</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Dec 16, 2019 at 4:07 AM pierre misse <<a href="mailto:pierre_misse25@msn.com">pierre_misse25@msn.com</a>> wrote:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF">
<p>Hi,</p>
<p>I'm currently trying to understand Slang's type inference, and to do so trying to write tests.</p></div></blockquote><div>Is it your intention to contribute those tests back to VMMaker.oscog on <a href="http://source.squeak.org">source.squeak.org</a>? </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF">
<p>I'm using CCodeGenerator >> #compileToTMethodSelector:in: to get the TMethod, but i cannot seem to find how to use the type inference on this TMethod (or in the instance of CCodeGenerator).</p></div></blockquote><div><br></div><div>Here's some doit that run Slang including type inference:</div><div><br></div><div><a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/image/Slang%20Test%20Workspace.text">https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/image/Slang%20Test%20Workspace.text</a></div><div><br></div><div>If you use <a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/image/buildspurtrunkvmmaker64image.sh">https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/image/buildspurtrunkvmmaker64image.sh</a> to build a VMMaker image it'll create an image containing g this and other useful workspaces that contain doit to launch a VM under the simulator, etc.</div><div><br></div><div>Type inference is driven by this loop in CCodeGeneraror>>inferTypesForImplicitlyTypedVariablesAndMethods which iterates, inferring types until no more types can b e inferred (until the algorithm has reached a fixed point).</div><div><br></div><div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>"now iterate until we reach a fixed point"</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>[| changedReturnType |</div><div><span class="gmail-Apple-tab-span" style="white-space:pre"> </span> changedReturnType := false.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">   </span> allMethods do:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                </span>[:m|</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">           </span> m inferTypesForImplicitlyTypedVariablesIn: self.</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">              </span> (m inferReturnTypeIn: self) ifTrue:</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>[changedReturnType := true]].</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">  </span> changedReturnType] whileTrue.</div></div><div><br></div><div>Type information is derived from explicit return types in methods (the <returnTypeC: > pragma), types for "kernel" sends from CCodeGenerator>>#returnTypeForSend:in:ifNil:, and for types propagated to returns from variables that themselves are either explicitly typed using <var: ... type: ...> and <var: ... declareC: ...> pragmas, or get their types in assignments of the results of methods, where the type they acquire is the return types of those methods.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF">
<p>Also, I have been wondering what is the semantic of sqInt. I found out it was an alias for a long, but i couldn't find better than that. </p></div></blockquote><div>#sqInt is first of all a pun for "squint", a shortening of Squeak Integer.  It is an integer type of the same size as an "ordinary object pointer", or "oop". #usqInt, #sqLong & #usqLong are other important types.  #sqLong & #usqLong are 64-bit types.  #sqInt & #usqInt are 32-bit types in 32-bit VMs and 64-bit types in 64-bit VMs.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF"><p>Are there offsets to find objects in the object memory?</p></div></blockquote><div>A #sqInt is typically used to hold the oop for an object and indeed it points to the header word of the object.  The object is preceded by an overflow header word if it has more than 254 slots.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF"><p>Are there cast as pointers?<br></p></div></blockquote><div>Yes.  See the functions and macros in platforms/Cross/vm/sqMemoryAccess.h.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF"><p>
</p>
<p>Thank you in advance :)<br></p>
<p>Pierre.</p></div></blockquote></div><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div></div></div></div></div></div></div>