ObjFW  Check-in [bc2f7c2124]

Overview
Comment:OFNumber: Correctly handle NAN.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: bc2f7c2124cda3ee20efcade26c93d8fcff6def24a954feee081ab788a1365ce
User & Date: js on 2013-07-08 21:34:44
Other Links: manifest | tags
Context
2013-07-08
22:20
OFFile: Check arguments for nil. check-in: b4ebcc74b1 user: js tags: trunk
21:34
OFNumber: Correctly handle NAN. check-in: bc2f7c2124 user: js tags: trunk
16:00
Add a define to indicate forwarding stret is safe. check-in: b63feee32d user: js tags: trunk
Changes

Modified src/OFNumber.m from [779309786a] to [ae2aab0b1f].

984
985
986
987
988
989
990
991
992











993
994
995
996
997
998
999
984
985
986
987
988
989
990


991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008







-
-
+
+
+
+
+
+
+
+
+
+
+







	OFNumber *number;

	if (![object isKindOfClass: [OFNumber class]])
		return false;

	number = object;

	if (_type & OF_NUMBER_FLOAT || number->_type & OF_NUMBER_FLOAT)
		return ([number doubleValue] == [self doubleValue]);
	if (_type & OF_NUMBER_FLOAT || number->_type & OF_NUMBER_FLOAT) {
		double value1 = [number doubleValue];
		double value2 = [self doubleValue];

		if (isnan(value1) && isnan(value2))
			return true;
		if (isnan(value1) || isnan(value2))
			return false;

		return (value1 == value2);
	}

	if (_type & OF_NUMBER_SIGNED || number->_type & OF_NUMBER_SIGNED)
		return ([number intMaxValue] == [self intMaxValue]);

	return ([number uIntMaxValue] == [self uIntMaxValue]);
}

1068
1069
1070
1071
1072
1073
1074



1075
1076
1077
1078
1079
1080
1081
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093







+
+
+








	if (type & OF_NUMBER_FLOAT) {
		union {
			double d;
			uint8_t b[sizeof(double)];
		} d;
		uint_fast8_t i;

		if (isnan([self doubleValue]))
			return 0;

		d.d = OF_BSWAP_DOUBLE_IF_BE([self doubleValue]);

		for (i = 0; i < sizeof(double); i++)
			OF_HASH_ADD(hash, d.b[i]);
	} else if (type & OF_NUMBER_SIGNED) {
		intmax_t v = [self intMaxValue] * -1;