This procedure converts expression between compatible types.
For example, Integer values can be assigned to Real variables, only the expression and type need to be converted.
Procedure TExpression.AdjustExpressionToType (TypeDef: PTypeDefinition);
Var NewTypeDefinition: PTypeDefinition;
begin
Case TypeDef^.BaseType of
btString: begin
ConvertCharToString;
CopyCharArrayCompatibleWithStringToStackFrameAsString;
end;
btExtended: begin
ConvertIntegerToExtended;
ConvertRealToExtended;
end;
btReal: begin
ConvertIntegerToReal;
ConvertExtendedToReal;
end;
btBoolean: If not (it32Bytes in TypeDef^.DataType) then ConvertToBooleanByte;
btObject: begin
NewTypeDefinition := TypeDef;
If TypeDefPtr^.BaseType <> btObject then Exit;
If InObjectTypeDomain (PObjectTypeDefinition (TypeDefPtr), PObjectTypeDefinition (NewTypeDefinition)) then
TypeDefPtr := TypeDef;
end;
btPointer: begin
If ExtendedSyntax in ModuleCompilerSwitches then
begin
CheckForStringConversionToPChar (TypeDef);
CheckForConversionOfZeroBasedCharacterArrayToPChar (TypeDef);
end;
NewTypeDefinition := PointerFromOffsets (PPointerTypeDefinition (TypeDef)^.PointerBaseTypeOffset);
If NewTypeDefinition^.BaseType <> btObject then Exit;
If TypeDefPtr^.BaseType <> btPointer then Exit;
If InObjectTypeDomain (PObjectTypeDefinition (
PointerFromOffsets (PPointerTypeDefinition (TypeDefPtr)^.PointerBaseTypeOffset)),
PObjectTypeDefinition (NewTypeDefinition)) then
TypeDefPtr := TypeDef;
end;
end;
end;
This procedure checks if ExpressionType is compatible with (assignable to) ObjectTypeDefinition. InObjectTypeDomain := False;
If ExpressionType^.BaseType <> btObject then Exit;
Repeat
If ExpressionType = ObjectTypeDefinition then
begin
InObjectTypeDomain := True;
Exit;
end;
If ExpressionType^.AncestorTypeOffset.TypeOffset = 0 then Exit;
ExpressionType := PObjectTypeDefinition (PointerFromOffsets (ExpressionType^.AncestorTypeOffset));
until False;
end;
{
|