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

Eliot Miranda eliot.miranda at gmail.com
Tue Dec 17 00:14:28 UTC 2019


Hi Pierre,

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

> Hi,
>
> 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?

> 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:

https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/Cog/image/Slang%20Test%20Workspace.text

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|
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", 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 :)
>
> Pierre.
>
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20191216/72bf7d52/attachment.html>


More information about the Vm-dev mailing list