summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorArnavion <arnavion@gmail.com>2014-12-14 13:31:19 -0800
committerArnavion <arnavion@gmail.com>2014-12-14 13:31:19 -0800
commitac01ba9cb0aec33653274b14ee53b374da8db577 (patch)
tree01dc4a5378a59ecba0f313445b0de7892b9915a2
parenta537fa3ca7cc7510f74d2a72964f5c9b99ec8beb (diff)
perl: Fixed warning about implicitly casting the time_t returned from hexchat_list_time() to an NV.
-rw-r--r--plugins/perl/perl.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/plugins/perl/perl.c b/plugins/perl/perl.c
index 240e74d1..eb539902 100644
--- a/plugins/perl/perl.c
+++ b/plugins/perl/perl.c
@@ -288,7 +288,19 @@ list_item_to_sv ( hexchat_list *list, const char *const *fields )
 			field_value = newSVuv (hexchat_list_int (ph, list, field_name));
 			break;
 		case 't':
-			field_value = newSVnv (hexchat_list_time (ph, list, field_name));
+			/* From perldoc for Perl's own timelocal() and timegm():
+			 * <quote>
+			 * On perl versions older than 5.12.0, the range of dates that can be actually be handled depends on the size of time_t (usually a signed integer) on the given platform.
+			 * As of version 5.12.0, perl has stopped using the underlying time library of the operating system it's running on and has its own implementation of those routines with a
+			 * safe range of at least +/ 2**52 (about 142 million years).
+			 * </quote>
+			 *
+			 * This is further confirmed from looking at the source for Time::Local - it's a Perl module and the implementations of timelocal() and timegm() use simple addition and
+			 * subtraction of numbers. Perl automatically promotes numbers from int32_t (IV) to uint32_t (UV) to 64-bit IEEE754 double (NV) as required.
+			 *
+			 * This means that using a double (NV) for our own time_t suffers from the same assumptions that Perl's own functions do.
+			 */
+			field_value = newSVnv ((const NV) hexchat_list_time (ph, list, field_name));
 			break;
 		default:
 			field_value = &PL_sv_undef;