diff --git a/src/gc.c b/src/gc.c
index 99a5dab83cde27517c16c0e000f5a5aecd7b8206..ebc9a15e321d64411c1fb16e7d9b7412061b7465 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -29,7 +29,7 @@ struct callback *gc_evaluator_callback=0;
 
 #include "block_alloc.h"
 
-RCSID("$Id: gc.c,v 1.116 2000/08/11 13:08:02 grubba Exp $");
+RCSID("$Id: gc.c,v 1.117 2000/08/11 13:17:13 grubba Exp $");
 
 /* Run garbage collect approximately every time
  * 20 percent of all arrays, objects and programs is
@@ -93,9 +93,19 @@ RCSID("$Id: gc.c,v 1.116 2000/08/11 13:08:02 grubba Exp $");
 #define GC_VERBOSE_DO(X)
 #endif
 
+/* Kludge to avoid some loss of precision warnings. */
+#ifdef __ECL
+static inline long CAST_TO_LONG(ptrdiff_t val)
+{
+  return DO_NOT_WARN((long)val);
+}
+#else /* !__ECL */
+#define CAST_TO_LONG(val)	((long)(val))
+#endif /* __ECL */
+
 INT32 num_objects = 1;		/* Account for empty_array. */
 INT32 num_allocs =0;
-INT32 alloc_threshold = MIN_ALLOC_THRESHOLD;
+ptrdiff_t alloc_threshold = MIN_ALLOC_THRESHOLD;
 PMOD_EXPORT int Pike_in_gc = 0;
 struct pike_queue gc_mark_queue;
 time_t last_gc;
@@ -398,7 +408,8 @@ void describe_location(void *real_memblock,
 #define FOO(NTYP,TYP,NAME) \
     if(location == (void *)&p->NAME) fprintf(stderr,"%*s  **In p->" #NAME "\n",indent,""); \
     if(ptr >= (char *)p->NAME  && ptr<(char*)(p->NAME+p->PIKE_CONCAT(num_,NAME))) \
-      fprintf(stderr,"%*s  **In p->" #NAME "[%ld]\n",indent,"",((long)ptr - (long)(p->NAME)) / sizeof(TYP));
+      fprintf(stderr,"%*s  **In p->" #NAME "[%ld]\n",indent,"", \
+              CAST_TO_LONG(((char *)ptr - (char *)(p->NAME)) / sizeof(TYP)));
 #include "program_areas.h"
       
       break;
@@ -460,7 +471,8 @@ void describe_location(void *real_memblock,
     {
       struct array *a=(struct array *)memblock;
       struct svalue *s=(struct svalue *)location;
-      fprintf(stderr,"%*s  **In index %ld\n",indent,"",(long)(s-ITEM(a)));
+      fprintf(stderr,"%*s  **In index %ld\n",indent,"",
+	      DO_NOT_WARN((long)(s-ITEM(a))));
       break;
     }
   }
@@ -720,7 +732,8 @@ void low_describe_something(void *a,
     case T_STRING:
     {
       struct pike_string *s=(struct pike_string *)a;
-      fprintf(stderr,"%*s**String length is %d:\n",indent,"",s->len);
+      fprintf(stderr, "%*s**String length is %ld:\n", indent, "",
+	      DO_NOT_WARN((long)s->len));
       if(s->len>77)
       {
 	fprintf(stderr,"%*s** \"%60s ...\"\n",indent,"",s->str);
@@ -754,7 +767,7 @@ void describe_something(void *a, int t, int indent, int depth, int flags)
 	    get_name_of_type(t));
   } else
 #endif /* DEBUG_MALLOC */
-  if (((int)a) & 3) {
+  if (((ptrdiff_t)a) & 3) {
     fprintf(stderr,"%*s**Location: %p  Type: %s  Misaligned address\n",indent,"",a,
 	    get_name_of_type(t));
   } else {
@@ -2134,7 +2147,7 @@ int do_gc(void)
   if(tmp > MAX_ALLOC_THRESHOLD)
     tmp = (double)MAX_ALLOC_THRESHOLD;
 
-  alloc_threshold = (int)tmp;
+  alloc_threshold = (ptrdiff_t)tmp;
   
   num_allocs=0;
 
@@ -2173,16 +2186,16 @@ void f__gc_status(INT32 args)
   push_int(num_allocs);
 
   push_constant_text("alloc_threshold");
-  push_int(alloc_threshold);
+  push_int32(alloc_threshold);
 
   push_constant_text("objects_alloced");
-  push_int(objects_alloced);
+  push_int32(objects_alloced);
 
   push_constant_text("objects_freed");
-  push_int(objects_freed);
+  push_int32(objects_freed);
 
   push_constant_text("last_gc");
-  push_int(last_gc);
+  push_int32(last_gc);
 
   push_constant_text("projected_garbage");
   push_float(objects_freed * (double) num_allocs / (double) alloc_threshold);
diff --git a/src/mapping.c b/src/mapping.c
index d196f8f3fea9a9cee228eb32a52d270adccc60fa..dba67d5d1769a5a61d79dcfabd35366af52251b2 100644
--- a/src/mapping.c
+++ b/src/mapping.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: mapping.c,v 1.97 2000/08/07 09:47:47 grubba Exp $");
+RCSID("$Id: mapping.c,v 1.98 2000/08/11 13:20:44 grubba Exp $");
 #include "main.h"
 #include "object.h"
 #include "mapping.h"
@@ -43,7 +43,7 @@ static struct mapping *gc_mark_mapping_pos = 0;
    ( (struct keypair *)DO_ALIGN( (ptrdiff_t) (((struct mapping_data *)(MD))->hash + HSIZE), ALIGNOF(struct keypair)) )
 
 #define MAPPING_DATA_SIZE(HSIZE, KEYPAIRS) \
-   (long)( MD_KEYPAIRS(0, HSIZE) + KEYPAIRS )
+   (ptrdiff_t)( MD_KEYPAIRS(0, HSIZE) + KEYPAIRS )
    
    
 
@@ -120,7 +120,7 @@ static void init_mapping(struct mapping *m, INT32 size)
 {
   struct mapping_data *md;
   char *tmp;
-  INT32 e;
+  ptrdiff_t e;
   INT32 hashsize;
 
   debug_malloc_touch(m);
@@ -350,7 +350,8 @@ static struct mapping *rehash(struct mapping *m, int new_size)
 
 struct mapping_data *copy_mapping_data(struct mapping_data *md)
 {
-  long off,size,e;
+  long e;
+  ptrdiff_t size, off;
   struct mapping_data *nmd;
   struct keypair *keypairs;
 
@@ -2101,7 +2102,7 @@ void debug_dump_mapping(struct mapping *m)
 {
   fprintf(stderr, "Refs=%d, flags=0x%x, next=%p, prev=%p",
 	  m->refs, m->flags, m->next, m->prev);
-  if (((int)m->data) & 3) {
+  if (((ptrdiff_t)m->data) & 3) {
     fprintf(stderr, ", data=%p (unaligned)\n", m->data);
   } else {
     fprintf(stderr, ", size=%d, hashsize=%d\n",
diff --git a/src/pike_memory.c b/src/pike_memory.c
index 855d4db4887259dcc4eb4a9279b5fa533a455d11..32b617a0058df62938355f50ab34275c0185057c 100644
--- a/src/pike_memory.c
+++ b/src/pike_memory.c
@@ -10,7 +10,7 @@
 #include "pike_macros.h"
 #include "gc.h"
 
-RCSID("$Id: pike_memory.c,v 1.77 2000/08/11 11:44:14 grubba Exp $");
+RCSID("$Id: pike_memory.c,v 1.78 2000/08/11 13:22:38 grubba Exp $");
 
 /* strdup() is used by several modules, so let's provide it */
 #ifndef HAVE_STRDUP
@@ -27,7 +27,7 @@ char *strdup(const char *str)
 }
 #endif /* !HAVE_STRDUP */
 
-int pcharp_memcmp(PCHARP a, PCHARP b, int sz)
+ptrdiff_t pcharp_memcmp(PCHARP a, PCHARP b, int sz)
 {
   return generic_quick_binary_strcmp((char *)a.ptr, sz, a.shift,
 				     (char *)b.ptr, sz, b.shift);
diff --git a/src/pike_memory.h b/src/pike_memory.h
index 35873bc8fbbe0b92d2fa6f874e370804157d4c36..7e3c7bc4eec1ed0ce489c3c7fb439658fb164ca8 100644
--- a/src/pike_memory.h
+++ b/src/pike_memory.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: pike_memory.h,v 1.17 2000/08/10 18:02:21 grubba Exp $
+ * $Id: pike_memory.h,v 1.18 2000/08/11 13:25:03 grubba Exp $
  */
 #ifndef MEMORY_H
 #define MEMORY_H
@@ -60,7 +60,7 @@ struct generic_mem_searcher
 #define MEMCHR0 MEMCHR
 
 /* Note to self: Prototypes must be updated manually /Hubbe */
-PMOD_EXPORT int pcharp_memcmp(PCHARP a, PCHARP b, int sz);
+PMOD_EXPORT ptrdiff_t pcharp_memcmp(PCHARP a, PCHARP b, int sz);
 PMOD_EXPORT long pcharp_strlen(PCHARP a);
 PMOD_EXPORT INLINE p_wchar1 *MEMCHR1(p_wchar1 *p, p_wchar1 c, ptrdiff_t e);
 PMOD_EXPORT INLINE p_wchar2 *MEMCHR2(p_wchar2 *p, p_wchar2 c, ptrdiff_t e);