[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: io_date
- From: "D Burgess" <db@...>
- Date: Thu, 1 May 2003 7:31:50 +1000
What is your platform? and what exception, SIGFPE?
I had a problem with OS400 throwing an exception on
floating point to int assignment.
e.g. int n = (double)d;
I think your change is wrong because there is no
guarantee that you will have an integer value on
the LHS of (n == -1).
+++++++++++++++++++++++++++++++++
>The other day I discovered that the C code for
>io_date in liolib.c (Lua 5.0 and previous)
>was causing floating point exceptions on my platform.
>For some mysterious reason coercion of (double) -1
>to a time_t makes my compiler produce code that raises
>an error. The code for io_date starts:
>
>static int io_date (lua_State *L) {
> const char *s = luaL_optstring(L, 1, "c");
> time_t t = (time_t)(luaL_optnumber(L, 2, -1));
> struct tm *stm;
> if (t == (time_t)(-1)) /* no time given? */
> t = time(NULL); /* use current time */
> .........
>
>You will note that argument 2 is pulled from the
>Lua stack, immediately coerced to a time_t, then
>compared with a (time_t) -1. This seems to me a bit
>like travelling from Manhattan to Newark via
>Montreal. So I altered the code to
>
>static int io_date (lua_State *L) {
> const char *s = luaL_optstring(L, 1, "c");
> time_t t;
> struct tm *stm;
> const lua_Number n = luaL_optnumber(L, 2, -1);
> if (n == -1)
> t = time(NULL);
> else
> t = (time_t) n;
> ........
>
>which seems to have cured the problem. Anybody see
>any snags I may have overlooked?
>
>--
>Gavin Wraith (gavin@wraith.u-net.com)
>Home page: http://www.wraith.u-net.com/