* fixed several range check errors inside variant helpers in case the

rtl is compiled with range checking on (Delphi doesn't give range
    errors there either)

git-svn-id: trunk@7513 -
This commit is contained in:
Jonas Maebe 2007-05-29 14:09:24 +00:00
parent 4ce4742bc8
commit 480af93606

View File

@ -87,18 +87,18 @@ begin
varEmpty : Result := 0;
varSmallInt : Result := vSmallInt;
varShortInt : Result := vShortInt;
varInteger : Result := vInteger;
varSingle : Result := Round(vSingle);
varDouble : Result := Round(vDouble);
varCurrency : Result := Round(vCurrency);
varDate : Result := Round(vDate);
varBoolean : Result := SmallInt(vBoolean);
varInteger : Result := smallint(vInteger);
varSingle : Result := smallint(Round(vSingle));
varDouble : Result := smallint(Round(vDouble));
varCurrency : Result := smallint(Round(vCurrency));
varDate : Result := smallint(Round(vDate));
varBoolean : Result := smallint(SmallInt(vBoolean));
varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
varByte : Result := vByte;
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varQword : Result := vQWord;
varWord : Result := smallint(vWord);
varLongWord : Result := smallint(vLongWord);
varInt64 : Result := smallint(vInt64);
varQword : Result := smallint(vQWord);
varOleStr : Result := WStrToSmallInt(vOleStr);
varString : Result := LStrToSmallInt(vString);
else
@ -107,18 +107,18 @@ begin
varByRef: if Assigned(vPointer) then case vType of
varSmallInt : Result := PSmallInt(vPointer)^;
varShortInt : Result := PShortInt(vPointer)^;
varInteger : Result := PInteger(vPointer)^;
varSingle : Result := Round(PSingle(vPointer)^);
varDouble : Result := Round(PDouble(vPointer)^);
varCurrency : Result := Round(PCurrency(vPointer)^);
varDate : Result := Round(PDate(vPointer)^);
varInteger : Result := smallint(PInteger(vPointer)^);
varSingle : Result := smallint(Round(PSingle(vPointer)^));
varDouble : Result := smallint(Round(PDouble(vPointer)^));
varCurrency : Result := smallint(Round(PCurrency(vPointer)^));
varDate : Result := smallint(Round(PDate(vPointer)^));
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
varVariant : Result := VariantToSmallInt(PVarData(vPointer)^);
varByte : Result := PByte(vPointer)^;
varWord : Result := PWord(vPointer)^;
varLongWord : Result := PLongWord(vPointer)^;
varInt64 : Result := PInt64(vPointer)^;
varQword : Result := PQWord(vPointer)^;
varWord : Result := smallint(PWord(vPointer)^);
varLongWord : Result := smallint(PLongWord(vPointer)^);
varInt64 : Result := smallint(PInt64(vPointer)^);
varQword : Result := smallint(PQWord(vPointer)^);
varOleStr : Result := WStrToSmallInt(PPointer(vPointer)^);
varString : Result := LStrToSmallInt(PPointer(vPointer)^);
else { other vtype }
@ -164,40 +164,40 @@ begin
case vType and not varTypeMask of
0: case vType of
varEmpty : Result := 0;
varSmallInt : Result := vSmallInt;
varSmallInt : Result := shortint(vSmallInt);
varShortInt : Result := vShortInt;
varInteger : Result := vInteger;
varSingle : Result := Round(vSingle);
varDouble : Result := Round(vDouble);
varCurrency : Result := Round(vCurrency);
varDate : Result := Round(vDate);
varInteger : Result := shortint(vInteger);
varSingle : Result := shortint(Round(vSingle));
varDouble : Result := shortint(Round(vDouble));
varCurrency : Result := shortint(Round(vCurrency));
varDate : Result := shortint(Round(vDate));
varBoolean : Result := SmallInt(vBoolean);
varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
varByte : Result := vByte;
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varQword : Result := vQWord;
varByte : Result := shortint(vByte);
varWord : Result := shortint(vWord);
varLongWord : Result := shortint(vLongWord);
varInt64 : Result := shortint(vInt64);
varQword : Result := shortint(vQWord);
varOleStr : Result := WStrToShortInt(vOleStr);
varString : Result := LStrToShortInt(vString);
else
VariantTypeMismatch(vType, varShortInt);
end;
varByRef: if Assigned(vPointer) then case vType of
varSmallInt : Result := PSmallInt(vPointer)^;
varSmallInt : Result := shortint(PSmallInt(vPointer)^);
varShortInt : Result := PShortInt(vPointer)^;
varInteger : Result := PInteger(vPointer)^;
varSingle : Result := Round(PSingle(vPointer)^);
varDouble : Result := Round(PDouble(vPointer)^);
varCurrency : Result := Round(PCurrency(vPointer)^);
varDate : Result := Round(PDate(vPointer)^);
varInteger : Result := shortint(PInteger(vPointer)^);
varSingle : Result := shortint(Round(PSingle(vPointer)^));
varDouble : Result := shortint(Round(PDouble(vPointer)^));
varCurrency : Result := shortint(Round(PCurrency(vPointer)^));
varDate : Result := shortint(Round(PDate(vPointer)^));
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
varVariant : Result := VariantToShortInt(PVarData(vPointer)^);
varByte : Result := PByte(vPointer)^;
varWord : Result := PWord(vPointer)^;
varLongWord : Result := PLongWord(vPointer)^;
varInt64 : Result := PInt64(vPointer)^;
varQword : Result := PQWord(vPointer)^;
varByte : Result := shortint(PByte(vPointer)^);
varWord : Result := shortint(PWord(vPointer)^);
varLongWord : Result := shortint(PLongWord(vPointer)^);
varInt64 : Result := shortint(PInt64(vPointer)^);
varQword : Result := shortint(PQWord(vPointer)^);
varOleStr : Result := WStrToShortInt(PPointer(vPointer)^);
varString : Result := LStrToShortInt(PPointer(vPointer)^);
else { other vtype }
@ -246,17 +246,17 @@ begin
varSmallInt : Result := vSmallInt;
varShortInt : Result := vShortInt;
varInteger : Result := vInteger;
varSingle : Result := Round(vSingle);
varDouble : Result := Round(vDouble);
varCurrency : Result := Round(vCurrency);
varDate : Result := Round(vDate);
varSingle : Result := longint(Round(vSingle));
varDouble : Result := longint(Round(vDouble));
varCurrency : Result := longint(Round(vCurrency));
varDate : Result := longint(Round(vDate));
varBoolean : Result := SmallInt(vBoolean);
varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
varByte : Result := vByte;
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varQword : Result := vQWord;
varLongWord : Result := longint(vLongWord);
varInt64 : Result := longint(vInt64);
varQword : Result := longint(vQWord);
varOleStr : Result := WStrToLongInt(vOleStr);
varString : Result := LStrToLongInt(vString);
else
@ -266,17 +266,17 @@ begin
varSmallInt : Result := PSmallInt(vPointer)^;
varShortInt : Result := PShortInt(vPointer)^;
varInteger : Result := PInteger(vPointer)^;
varSingle : Result := Round(PSingle(vPointer)^);
varDouble : Result := Round(PDouble(vPointer)^);
varCurrency : Result := Round(PCurrency(vPointer)^);
varDate : Result := Round(PDate(vPointer)^);
varSingle : Result := longint(Round(PSingle(vPointer)^));
varDouble : Result := longint(Round(PDouble(vPointer)^));
varCurrency : Result := longint(Round(PCurrency(vPointer)^));
varDate : Result := longint(Round(PDate(vPointer)^));
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
varVariant : Result := VariantToLongInt(PVarData(vPointer)^);
varByte : Result := PByte(vPointer)^;
varWord : Result := PWord(vPointer)^;
varLongWord : Result := PLongWord(vPointer)^;
varInt64 : Result := PInt64(vPointer)^;
varQword : Result := PQWord(vPointer)^;
varLongWord : Result := longint(PLongWord(vPointer)^);
varInt64 : Result := longint(PInt64(vPointer)^);
varQword : Result := longint(PQWord(vPointer)^);
varOleStr : Result := WStrToLongInt(PPointer(vPointer)^);
varString : Result := LStrToLongInt(PPointer(vPointer)^);
else { other vtype }
@ -324,38 +324,38 @@ begin
varEmpty : Result := 0;
varSmallInt : Result := vSmallInt;
varShortInt : Result := vShortInt;
varInteger : Result := vInteger;
varSingle : Result := Round(vSingle);
varDouble : Result := Round(vDouble);
varCurrency : Result := Round(vCurrency);
varDate : Result := Round(vDate);
varInteger : Result := cardinal(vInteger);
varSingle : Result := cardinal(Round(vSingle));
varDouble : Result := cardinal(Round(vDouble));
varCurrency : Result := cardinal(Round(vCurrency));
varDate : Result := cardinal(Round(vDate));
varBoolean : Result := SmallInt(vBoolean);
varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
varByte : Result := vByte;
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varQword : Result := vQWord;
varInt64 : Result := cardinal(vInt64);
varQword : Result := cardinal(vQWord);
varOleStr : Result := WStrToCardinal(vOleStr);
varString : Result := LStrToCardinal(vString);
else
VariantTypeMismatch(vType, varLongWord);
end;
varByRef: if Assigned(vPointer) then case vType of
varSmallInt : Result := PSmallInt(vPointer)^;
varShortInt : Result := PShortInt(vPointer)^;
varInteger : Result := PInteger(vPointer)^;
varSingle : Result := Round(PSingle(vPointer)^);
varDouble : Result := Round(PDouble(vPointer)^);
varCurrency : Result := Round(PCurrency(vPointer)^);
varDate : Result := Round(PDate(vPointer)^);
varSmallInt : Result := cardinal(PSmallInt(vPointer)^);
varShortInt : Result := cardinal(PShortInt(vPointer)^);
varInteger : Result := cardinal(PInteger(vPointer)^);
varSingle : Result := cardinal(Round(PSingle(vPointer)^));
varDouble : Result := cardinal(Round(PDouble(vPointer)^));
varCurrency : Result := cardinal(Round(PCurrency(vPointer)^));
varDate : Result := cardinal(Round(PDate(vPointer)^));
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
varVariant : Result := VariantToCardinal(PVarData(vPointer)^);
varByte : Result := PByte(vPointer)^;
varWord : Result := PWord(vPointer)^;
varLongWord : Result := PLongWord(vPointer)^;
varInt64 : Result := PInt64(vPointer)^;
varQword : Result := PQWord(vPointer)^;
varInt64 : Result := cardinal(PInt64(vPointer)^);
varQword : Result := cardinal(PQWord(vPointer)^);
varOleStr : Result := WStrToCardinal(PPointer(vPointer)^);
varString : Result := LStrToCardinal(PPointer(vPointer)^);
else { other vtype }
@ -660,7 +660,7 @@ begin
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varQword : Result := vQWord;
varQword : Result := currency(vQWord);
varOleStr : Result := WStrToCurrency(vOleStr);
varString : Result := LStrToCurrency(vString);
else
@ -692,7 +692,7 @@ begin
varWord : Result := PWord(vPointer)^;
varLongWord : Result := PLongWord(vPointer)^;
varInt64 : Result := PInt64(vPointer)^;
varQword : Result := PQWord(vPointer)^;
varQword : Result := currency(PQWord(vPointer)^);
varOleStr : Result := WStrToCurrency(PPointer(vPointer)^);
varString : Result := LStrToCurrency(PPointer(vPointer)^);
else { other vtype }
@ -894,40 +894,40 @@ begin
case vType and not varTypeMask of
0: case vType of
varEmpty : Result := 0;
varSmallInt : Result := vSmallInt;
varShortInt : Result := vShortInt;
varInteger : Result := vInteger;
varSingle : Result := Round(vSingle);
varDouble : Result := Round(vDouble);
varCurrency : Result := Round(vCurrency);
varDate : Result := Round(vDate);
varSmallInt : Result := byte(vSmallInt);
varShortInt : Result := byte(vShortInt);
varInteger : Result := byte(vInteger);
varSingle : Result := byte(Round(vSingle));
varDouble : Result := byte(Round(vDouble));
varCurrency : Result := byte(Round(vCurrency));
varDate : Result := byte(Round(vDate));
varBoolean : Result := SmallInt(vBoolean);
varVariant : Result := VariantToByte(PVarData(vPointer)^);
varByte : Result := vByte;
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varQword : Result := vQWord;
varWord : Result := byte(vWord);
varLongWord : Result := byte(vLongWord);
varInt64 : Result := byte(vInt64);
varQword : Result := byte(vQWord);
varOleStr : Result := WStrToByte(vOleStr);
varString : Result := LStrToByte(vString);
else
VariantTypeMismatch(vType, varByte);
end;
varByRef: if Assigned(vPointer) then case vType of
varSmallInt : Result := PSmallInt(vPointer)^;
varShortInt : Result := PShortInt(vPointer)^;
varInteger : Result := PInteger(vPointer)^;
varSingle : Result := Round(PSingle(vPointer)^);
varDouble : Result := Round(PDouble(vPointer)^);
varCurrency : Result := Round(PCurrency(vPointer)^);
varDate : Result := Round(PDate(vPointer)^);
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
varVariant : Result := VariantToByte(PVarData(vPointer)^);
varSmallInt : Result := byte(PSmallInt(vPointer)^);
varShortInt : Result := byte(PShortInt(vPointer)^);
varInteger : Result := byte(PInteger(vPointer)^);
varSingle : Result := byte(Round(PSingle(vPointer)^));
varDouble : Result := byte(Round(PDouble(vPointer)^));
varCurrency : Result := byte(Round(PCurrency(vPointer)^));
varDate : Result := byte(Round(PDate(vPointer)^));
varBoolean : Result := byte(SmallInt(PWordBool(vPointer)^));
varVariant : Result := byte(VariantToByte(PVarData(vPointer)^));
varByte : Result := PByte(vPointer)^;
varWord : Result := PWord(vPointer)^;
varLongWord : Result := PLongWord(vPointer)^;
varInt64 : Result := PInt64(vPointer)^;
varQword : Result := PQWord(vPointer)^;
varWord : Result := byte(PWord(vPointer)^);
varLongWord : Result := byte(PLongWord(vPointer)^);
varInt64 : Result := byte(PInt64(vPointer)^);
varQword : Result := byte(PQWord(vPointer)^);
varOleStr : Result := WStrToByte(PPointer(vPointer)^);
varString : Result := LStrToByte(PPointer(vPointer)^);
else { other vtype }
@ -986,7 +986,7 @@ begin
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varQword : Result := vQWord;
varQword : Result := int64(vQWord);
varOleStr : Result := WStrToInt64(vOleStr);
varString : Result := LStrToInt64(vString);
else
@ -1052,19 +1052,19 @@ begin
case vType and not varTypeMask of
0: case vType of
varEmpty : Result := 0;
varSmallInt : Result := vSmallInt;
varShortInt : Result := vShortInt;
varInteger : Result := vInteger;
varSingle : Result := Round(vSingle);
varDouble : Result := Round(vDouble);
varCurrency : Result := Round(vCurrency);
varDate : Result := Round(vDate);
varSmallInt : Result := qword(vSmallInt);
varShortInt : Result := qword(vShortInt);
varInteger : Result := qword(vInteger);
varSingle : Result := qword(Round(vSingle));
varDouble : Result := qword(Round(vDouble));
varCurrency : Result := qword(Round(vCurrency));
varDate : Result := qword(Round(vDate));
varBoolean : Result := SmallInt(vBoolean);
varVariant : Result := VariantToQWord(PVarData(vPointer)^);
varByte : Result := vByte;
varWord : Result := vWord;
varLongWord : Result := vLongWord;
varInt64 : Result := vInt64;
varInt64 : Result := qword(vInt64);
varQword : Result := vQWord;
varOleStr : Result := WStrToQWord(vOleStr);
varString : Result := LStrToQWord(vString);
@ -1072,19 +1072,19 @@ begin
VariantTypeMismatch(vType, varQWord);
end;
varByRef: if Assigned(vPointer) then case vType of
varSmallInt : Result := PSmallInt(vPointer)^;
varShortInt : Result := PShortInt(vPointer)^;
varInteger : Result := PInteger(vPointer)^;
varSingle : Result := Round(PSingle(vPointer)^);
varDouble : Result := Round(PDouble(vPointer)^);
varCurrency : Result := Round(PCurrency(vPointer)^);
varDate : Result := Round(PDate(vPointer)^);
varSmallInt : Result := qword(PSmallInt(vPointer)^);
varShortInt : Result := qword(PShortInt(vPointer)^);
varInteger : Result := qword(PInteger(vPointer)^);
varSingle : Result := qword(Round(PSingle(vPointer)^));
varDouble : Result := qword(Round(PDouble(vPointer)^));
varCurrency : Result := qword(Round(PCurrency(vPointer)^));
varDate : Result := qword(Round(PDate(vPointer)^));
varBoolean : Result := SmallInt(PWordBool(vPointer)^);
varVariant : Result := VariantToQWord(PVarData(vPointer)^);
varByte : Result := PByte(vPointer)^;
varWord : Result := PWord(vPointer)^;
varLongWord : Result := PLongWord(vPointer)^;
varInt64 : Result := PInt64(vPointer)^;
varInt64 : Result := qword(PInt64(vPointer)^);
varQword : Result := PQWord(vPointer)^;
varOleStr : Result := WStrToQWord(PPointer(vPointer)^);
varString : Result := LStrToQWord(PPointer(vPointer)^);