gmscTypeInferenceClass
The TypeInference Service Class
Section titled “The TypeInference Service Class”The service class TypeInference contains methods related to the type inference operations made during migrations. There are two types of operations performed in this context — first, the actual changing of a components binary types or context flags and second, the insertion of a conversion operator into the code to compenstate for a type or status mismatch. Though currently incomplete the eventual goal of this class is not only to reform the indicated operations but also to record those operations for later analysis.
The field TypeInference_HostFile
Section titled “The field TypeInference_HostFile”Prototype
int TypeInference_HostFile = 0The TypeInference_HostFile field specifies the offset of current file information.
The method TypeInference_ArrayCast
Section titled “The method TypeInference_ArrayCast”Prototype
int TypeInference_ArrayCast(int iCall,int subRoot,int icode,int castType,int rank)The TypeInference_ArrayCast method inserts a simple object case within a cast to a one or two dimensional array of a certain type expanding the code by the number of bytes needed. In addition, if the select flag TraceChanges is on then information about the insertion is recorded for later review. This method actually inserts two different semantic operations into the code — a cast that changes the representation of a primitive value and a box that asserts that a certain reference has a specified type. Its parameters are as follows:
| Parameter | Description |
|---|---|
| iCall | specifies a unique number relative to this method defining which at which particular point in the migration process it was called. Though these are magic numbers, a particular call n can be located by searching for ”TypeInference_ArrayCast(n,” in the code. |
| subRoot | specifies the root offset of the component whose code is being modified. |
| icode | specifies the offset in the code block at which operation is to be inserted. In some cases the calling method has already allocated the space for the operation. In this case a negative icode value is passed. |
| castType | specifies type of the array cast. |
| rank | specifies the rank of the array cast. |
The method returns the number of bytes the the code block was expanded by.
The method TypeInference_InsertCast
Section titled “The method TypeInference_InsertCast”Prototype
int TypeInference_InsertCast(int iCall,int subRoot,int icode,int typeOper,int castType,int castOper);The TypeInference_InsertCast method inserts a type specification operation followed by a CNV operation into the current code block by expanding the code by the number of bytes needed. In addition, if the select flag TraceChanges is on then information about the insertion is recorded for later review. This method actually inserts two different semantic operations into the code — a cast that changes the representation of a primitive value and a box that asserts that a certain reference has a specified type. Its parameters are as follows:
| Parameter | Description |
|---|---|
| iCall | specifies a unique number relative to this method defining which at which particular point in the migration process it was called. Though these are magic numbers, a particular call n can be located by searching for “TypeInference_InsertCast(n,” in the code. |
| subRoot | specifies the root offset of the component whose code is being modified. |
| icode | specifies the offset in the code block at which operation is to be inserted. In some cases the calling method has already allocated the space for the operation. In this case a negative icode value is passed. |
| typeOper | specifies the opcode to be used to cast the type. |
| castType | specifies subcode value which is the output type of the operation. |
| castOper | specifies the CNV subcode to be used to form the final operation. |
The method returns the number of bytes the the code block was expanded by.
The method TypeInference_InsertConversion
Section titled “The method TypeInference_InsertConversion”Prototype
int TypeInference_InsertConversion(int iCall,int subRoot,int icode, int conversion)The TypeInference_InsertConversion method inserts an CNV operation into the current code block by expanding the code by the number of bytes needed. In addition, if the select flag TraceChanges is on then information about the insertion is recorded for later review. This method has the fopllowing parameters:
| Parameter | Description |
|---|---|
| iCall | specifies a unique number relative to this method defining which at which particular point in the migration process it was called. Though these are magic numbers, a particular call n can be located by searching for ”TypeInference_InsertConversion(n,“ |
| subRoot | specifies the root offset of the component whose code is being modified. |
| icode | specifies the offset in the code block at which operation is to be inserted. In some cases the calling method has already allocated the space for the operation. In this case a negative icode value is passed. |
| conversion | specifies the CNV subcode to be used to form the final operation. |
The method returns the number of bytes the the code block was expanded by.
The method TypeInference_ObjectOnly
Section titled “The method TypeInference_ObjectOnly”Prototype
void TypeInference_ObjectOnly(int iCall,int varBase,int type)The TypeInference_ObjectOnly method marks a component to be ‘ObjectOnly’ — i.e. specifies that the type of the component should not be strengthened. In addition, if the select flag TraceChanges is on then information about the change is recorded for later review. Its parameters are as follows:
| Parameter | Description |
|---|---|
| iCall | specifies a unique number relative to this method defining which at which particular point in the migration process it was called. Though these are magic numbers, a particular call n can be located by searching for ”TypeInference_ObjectOnly(n,“. |
| varVase | specifies the root offset of the component that is to be made ObjectOnly. |
| type | specifies the low level type to be assigned to the component. THis is normally TYP_VARIANT or TYP_OBJECT. |
The method TypeInference_QuantityContext
Section titled “The method TypeInference_QuantityContext”Prototype
void TypeInference_QuantityContext(int iCall,int varBase,int newFlags,int subRoot,int iNew)The TypeInference_QuantityContext method changes the context flags of a component. In addition, if the select flag TraceChanges is on then information about the change is recorded for later review. Its parameters are as follows:
| Parameter | Description |
|---|---|
| iCall | specifies a unique number relative to this method defining which at which particular point in the migration process it was called. Though these are magic numbers, a particular call n can be located by searching for ”TypeInference_QuantityContext(n,“. |
| varVase | specifies the root offset of the component whose context flags are being changed. |
| newFlags | specifies the new context flags. |
| subRoot | specifies the root offset of the component whose code is causing the context change. |
| iNew | specifies the offset of the last NEW operation found before the decision to do the change, if greater than zero. It is used to get the line number of the statement that caused the change. |
The method TypeInference_QuantityType
Section titled “The method TypeInference_QuantityType”Prototype
void TypeInference_QuantityType(int iCall,int varBase,int newType,int referType,int subRoot,int iNew)The TypeInference_QuantityType method changes the binary type of a component and marks it as having an inferred type. In addition, if the select flag TraceChanges is on then information about the type change is recorded for later review. Its parameters are as follows:
| Parameter | Description |
|---|---|
| iCall | specifies a unique number relative to this method defining which at which particular point in the migration process it was called. Though these are magic numbers, a particular call n can be located by searching for ”TypeInference_QuantityType(n,“. |
| varVase | specifies the root offset of the component whose binany type is being changed. |
| newType | specifies the new binary type. A negative type indicates that any FixedType attribute associated with the quantity should be ignored. |
| referType | specifies the reference of than new binary type or zerot if there is no associated reference. |
| subRoot | specifies the root offset of the component whose code is causing the type change. |
| iNew | specifies the offset of the last NEW operation found before the decision to do the type change, if greater than zero. |