diff --git a/src/svalue.c b/src/svalue.c
index 3cc630e4f9bef08fbd1e014964d3f87a4fae4958..ed13503061825e514a0184e14baa3a6c8835059d 100644
--- a/src/svalue.c
+++ b/src/svalue.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: svalue.c,v 1.154 2003/01/09 15:21:27 grubba Exp $
+|| $Id: svalue.c,v 1.155 2003/01/10 19:27:43 grubba Exp $
 */
 
 #include "global.h"
@@ -66,7 +66,7 @@ static int pike_isnan(double x)
 #endif /* HAVE__ISNAN */
 #endif /* HAVE_ISNAN */
 
-RCSID("$Id: svalue.c,v 1.154 2003/01/09 15:21:27 grubba Exp $");
+RCSID("$Id: svalue.c,v 1.155 2003/01/10 19:27:43 grubba Exp $");
 
 struct svalue dest_ob_zero = {
   T_INT, 0,
@@ -531,9 +531,9 @@ PMOD_EXPORT unsigned INT32 hash_svalue(const struct svalue *s)
     }
   default:
 #if SIZEOF_CHAR_P > 4
-    q=DO_NOT_WARN((unsigned INT32)((ptrdiff_t)s->u.refs >> 2));
+    q=DO_NOT_WARN((unsigned INT32)((((char *)s->u.refs)-(char *)0) >> 2));
 #else
-    q=DO_NOT_WARN((unsigned INT32)((ptrdiff_t)s->u.refs));
+    q=DO_NOT_WARN((unsigned INT32)(((char *)s->u.refs)-(char *)0));
 #endif
     break;
   case T_INT:   q=s->u.integer; break;