References

The Intermediate Language provides mechanisms for linking different pieces of code together, and even to dynamically modify the linking at runtime. These mechanisms are based around the types core.asm.Reference, core.asm.RefSource, and core.asm.Content.

Content

The type core.asm.Content represents something in memory that it should be possible to refer to. For example, code generated by the Intermediate Language is stored in a core.asm.Binary object, which inherits from core.asm.Content. It is possible to create arbitrary subclasses of Content to refer to arbitrary things in the system.

RefSource

The type core.asm.RefSource represents something that has an identity, to which one may refer. The RefSource has at most one Content that provides the actual target for the reference. It is possible to replace the Content of the RefSource at any point. This action updates any references that refer to the RefSource.

Due to this design, it is useful to think of the RefSource itself as the name of something. What the name refers to may change over time, but the identity remains the same. This is used in Storm to implement lazy loading and dynamic recompilation of programs, for example. Each function corresponds to one RefSource that refers to the function's identity. The contents of the RefSource is initially just a stub function that compiles the function. When this happens, the Content of the RefSource is replaced with a new instance of the Content class that contains the code of the compiled function. However, since the RefSource is the same, all references to it are updated to refer to the new Content.

The RefSource type itself is abstract due to the title member. The title member provides a string representation of the identity of the RefSource. The Intermediate Language provides one default implementation of a RefSource called StrRefSource, which simply identifies the RefSource using a string. Storm as a whole provides additional overloads, in particular core.asm.NamedSource, which uses a Named object to provide the title.

Reference

Finally, there are two types of references that may refer to a RefSource. These are core.asm.Ref and core.asm.Reference. The Ref type represents a lightweight reference. This means that Ref simply contains a pointer to the RefSource, so that it is able to retrieve the address and the title on demand. The Reference type, on the other hand, represents a robust reference. It is robust in the sense that it registers itself with the associated RefSource so that it gets notified whenever the Content of the RefSource changes. This means that it is possible to create a sub-class to Reference and overrode the moved member to get notifications about changes to the RefSource. This is the mechanism used by Storm to dynamically re-link the program whenever RefSources are modified.

This means that one typically uses the lightweight Ref objects during code generation, since they are lightweight and quick to move around. Then, at the last stages of code generation, one converts the Ref object into a robust Reference subclass, so that the created data structures can be updated whenever the associated RefSource are updated.