[Vm-dev] Slang's type inference and typing

pierre misse pierre_misse25 at msn.com
Tue Dec 17 06:18:57 UTC 2019

Hi Eliot,

Thanks for the detailed answer and all the pointers !

I must have misunderstood  #inferTypesForImplicitlyTypedVariablesAndMethods when I first came across it.

Have a nice day :)


On 17/12/2019 01:14, Eliot Miranda wrote:

Hi Pierre,

On Mon, Dec 16, 2019 at 4:07 AM pierre misse <pierre_misse25 at msn.com<mailto:pierre_misse25 at msn.com>> wrote:


I'm currently trying to understand Slang's type inference, and to do so trying to write tests.

Is it your intention to contribute those tests back to VMMaker.oscog on source.squeak.org<http://source.squeak.org>?
If I am able to, it is my intention.

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).

Here's some doit that run Slang including type inference:


If you use https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/image/buildspurtrunkvmmaker64image.sh 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.

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).

"now iterate until we reach a fixed point"
[| changedReturnType |
changedReturnType := false.
allMethods do:
m inferTypesForImplicitlyTypedVariablesIn: self.
(m inferReturnTypeIn: self) ifTrue:
[changedReturnType := true]].
changedReturnType] whileTrue.

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.

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.

#sqInt is first of all a pun for "squint"
nice , I was wondering if that was the case too :D
, 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.

Are there offsets to find objects in the object memory?

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.

Are there cast as pointers?

Yes.  See the functions and macros in platforms/Cross/vm/sqMemoryAccess.h.

Thank you in advance :)


best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20191217/1825fd89/attachment-0001.html>

More information about the Vm-dev mailing list