From d6ac73fbd91d9178a83a91bcbbd7e46c42a20809 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Mon, 20 Apr 1998 20:54:01 +0200
Subject: [PATCH] Changed a lot of ->refs++ to use add_ref() or ref_push_*()
 instead.

Rev: src/cpp.c:1.23
Rev: src/encode.c:1.19
Rev: src/gc.c:1.35
Rev: src/mapping.c:1.29
Rev: src/modules/Gmp/mpz_glue.c:1.32
Rev: src/modules/Image/blit.c:1.28
Rev: src/modules/Image/colortable.c:1.44
Rev: src/modules/Image/encodings/png.c:1.14
Rev: src/modules/Image/encodings/pnm.c:1.16
Rev: src/modules/Image/encodings/x.c:1.16
Rev: src/modules/Image/encodings/xwd.c:1.5
Rev: src/modules/Image/font.c:1.34
Rev: src/modules/Image/image.c:1.104
Rev: src/modules/Image/pnm.c:1.10
Rev: src/modules/Image/polyfill.c:1.25
Rev: src/modules/Image/togif.c:1.31
Rev: src/modules/Mysql/mysql.c:1.19
Rev: src/modules/Mysql/result.c:1.11
Rev: src/modules/Odbc/odbc.c:1.7
Rev: src/modules/Odbc/odbc_result.c:1.8
Rev: src/modules/Oracle/oracle.c:1.10
Rev: src/modules/Pipe/pipe.c:1.21
Rev: src/modules/Postgres/pgresult.c:1.6
Rev: src/modules/Postgres/postgres.c:1.6
Rev: src/modules/Regexp/glue.c:1.11
Rev: src/modules/Ssleay/ssleay.c:1.8
Rev: src/modules/_Crypto/cbc.c:1.11
Rev: src/modules/_Crypto/crypto.c:1.25
Rev: src/modules/_Crypto/md2.c:1.4
Rev: src/modules/_Crypto/pipe.c:1.12
Rev: src/modules/call_out/call_out.c:1.20
Rev: src/modules/spider/spider.c:1.67
Rev: src/modules/spider/streamed_parser.c:1.10
Rev: src/multiset.c:1.11
Rev: src/object.h:1.18
Rev: src/opcodes.c:1.20
Rev: src/signal_handler.c:1.48
Rev: src/stralloc.c:1.34
Rev: src/threads.c:1.69
---
 src/cpp.c                            |  4 +-
 src/encode.c                         | 11 ++---
 src/gc.c                             |  4 +-
 src/mapping.c                        |  9 ++--
 src/modules/Gmp/mpz_glue.c           |  4 +-
 src/modules/Image/blit.c             | 25 ++++-------
 src/modules/Image/colortable.c       | 34 +++++++--------
 src/modules/Image/encodings/png.c    | 10 ++---
 src/modules/Image/encodings/pnm.c    | 10 ++---
 src/modules/Image/encodings/x.c      | 16 +++----
 src/modules/Image/encodings/xwd.c    | 11 +++--
 src/modules/Image/font.c             |  7 ++--
 src/modules/Image/image.c            | 37 +++++++---------
 src/modules/Image/pnm.c              | 10 ++---
 src/modules/Image/polyfill.c         |  7 ++--
 src/modules/Image/togif.c            | 24 +++++------
 src/modules/Mysql/mysql.c            | 33 ++++++---------
 src/modules/Mysql/result.c           |  7 ++--
 src/modules/Odbc/odbc.c              | 10 ++---
 src/modules/Odbc/odbc_result.c       | 13 +++---
 src/modules/Oracle/oracle.c          |  7 ++--
 src/modules/Pipe/pipe.c              | 28 ++++++-------
 src/modules/Postgres/pgresult.c      |  6 +--
 src/modules/Postgres/postgres.c      |  4 +-
 src/modules/Regexp/glue.c            |  6 +--
 src/modules/Ssleay/ssleay.c          |  5 +--
 src/modules/_Crypto/cbc.c            |  5 +--
 src/modules/_Crypto/crypto.c         |  7 ++--
 src/modules/_Crypto/md2.c            |  7 ++--
 src/modules/_Crypto/pipe.c           | 11 ++---
 src/modules/call_out/call_out.c      |  8 ++--
 src/modules/spider/spider.c          | 63 ++++++++++++----------------
 src/modules/spider/streamed_parser.c |  8 ++--
 src/multiset.c                       |  6 +--
 src/object.h                         |  4 +-
 src/opcodes.c                        |  6 +--
 src/signal_handler.c                 |  6 +--
 src/stralloc.c                       | 10 ++---
 src/threads.c                        | 14 +++----
 39 files changed, 211 insertions(+), 286 deletions(-)

diff --git a/src/cpp.c b/src/cpp.c
index 32e01c8c85..11a4d2cc36 100644
--- a/src/cpp.c
+++ b/src/cpp.c
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: cpp.c,v 1.22 1998/04/01 00:47:46 hubbe Exp $
+ * $Id: cpp.c,v 1.23 1998/04/20 18:53:14 grubba Exp $
  */
 #include "global.h"
 #include "dynamic_buffer.h"
@@ -595,7 +595,7 @@ static INT32 low_cpp(struct cpp *this,
 	  dynamic_buffer tmp;
 	  struct define_argument arguments [MAX_ARGS];
 	  
-	  if(s) s->refs++;
+	  if(s) add_ref(s);
 	  
 	  if(d->args>=0)
 	  {
diff --git a/src/encode.c b/src/encode.c
index a0f217cad0..b6e40c8388 100644
--- a/src/encode.c
+++ b/src/encode.c
@@ -18,7 +18,7 @@
 #include "operators.h"
 #include "builtin_functions.h"
 
-RCSID("$Id: encode.c,v 1.18 1998/03/28 15:34:22 grubba Exp $");
+RCSID("$Id: encode.c,v 1.19 1998/04/20 18:53:15 grubba Exp $");
 
 #ifdef _AIX
 #include <net/nh.h>
@@ -432,8 +432,7 @@ static void decode_value2(struct decode_data *data)
 	ITEM(a)[e]=sp[-1];
 	sp--;
       }
-      a->refs++;
-      push_array(a);
+      ref_push_array(a);
       return;
     }
     
@@ -457,8 +456,7 @@ static void decode_value2(struct decode_data *data)
 	mapping_insert(m, sp-2, sp-1);
 	pop_n_elems(2);
       }
-      m->refs++;
-      push_mapping(m);
+      ref_push_mapping(m);
       return;
     }
     
@@ -477,8 +475,7 @@ static void decode_value2(struct decode_data *data)
 	multiset_insert(m, sp-1);
 	pop_stack();
       }
-      m->refs++;
-      push_multiset(m);
+      ref_push_multiset(m);
       return;
     }
     
diff --git a/src/gc.c b/src/gc.c
index ff180ced0c..b9e327feaa 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -25,7 +25,7 @@ struct callback *gc_evaluator_callback=0;
 #include "main.h"
 #include <math.h>
 
-RCSID("$Id: gc.c,v 1.34 1998/04/10 04:48:41 hubbe Exp $");
+RCSID("$Id: gc.c,v 1.35 1998/04/20 18:53:16 grubba Exp $");
 
 /* Run garbage collect approximate every time we have
  * 20 percent of all arrays, objects and programs is
@@ -403,7 +403,7 @@ INT32 gc_check(void *a)
     return 0;
   }
 #endif
-  return getmark(a)->refs++;
+  return add_ref(getmark(a));
 }
 
 static void init_gc(void)
diff --git a/src/mapping.c b/src/mapping.c
index 6f55a2f66d..9116bc609e 100644
--- a/src/mapping.c
+++ b/src/mapping.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: mapping.c,v 1.28 1998/02/11 00:05:01 hubbe Exp $");
+RCSID("$Id: mapping.c,v 1.29 1998/04/20 18:53:17 grubba Exp $");
 #include "main.h"
 #include "object.h"
 #include "mapping.h"
@@ -862,8 +862,7 @@ struct mapping *copy_mapping_recursively(struct mapping *m,
   {
     if(p->pointer_a == (void *)m)
     {
-      ret=(struct mapping *)p->pointer_b;
-      ret->refs++;
+      add_ref(ret=(struct mapping *)p->pointer_b);
       return ret;
     }
   }
@@ -1058,7 +1057,7 @@ void gc_free_all_unreferenced_mappings(void)
     check_mapping_for_destruct(m);
     if(gc_do_free(m))
     {
-      m->refs++;
+      add_ref(m);
 
       for(e=0;e<m->hashsize;e++)
       {
@@ -1129,7 +1128,7 @@ void zap_all_mappings(void)
 
   for(m=first_mapping;m;m=next)
   {
-    m->refs++;
+    add_ref(m);
 
 #if defined(DEBUG) && defined(DEBUG_MALLOC)
     if(verbose_debug_exit)
diff --git a/src/modules/Gmp/mpz_glue.c b/src/modules/Gmp/mpz_glue.c
index 4ecc6e4aa0..7f73ad990b 100644
--- a/src/modules/Gmp/mpz_glue.c
+++ b/src/modules/Gmp/mpz_glue.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: mpz_glue.c,v 1.31 1998/04/10 22:26:04 hubbe Exp $");
+RCSID("$Id: mpz_glue.c,v 1.32 1998/04/20 18:53:25 grubba Exp $");
 #include "gmp_machine.h"
 
 #if !defined(HAVE_LIBGMP)
@@ -284,7 +284,7 @@ static void mpzmod_cast(INT32 args)
     error("Bad argument 1 to mpz->cast().\n");
 
   s = sp[-args].u.string;
-  s->refs++;
+  add_ref(s);
 
   pop_n_elems(args);
 
diff --git a/src/modules/Image/blit.c b/src/modules/Image/blit.c
index 2d3cdb7c79..5fe16b7918 100644
--- a/src/modules/Image/blit.c
+++ b/src/modules/Image/blit.c
@@ -1,10 +1,10 @@
-/* $Id: blit.c,v 1.27 1998/01/16 22:09:07 grubba Exp $ */
+/* $Id: blit.c,v 1.28 1998/04/20 18:53:27 grubba Exp $ */
 #include "global.h"
 
 /*
 **! module Image
 **! note
-**!	$Id: blit.c,v 1.27 1998/01/16 22:09:07 grubba Exp $
+**!	$Id: blit.c,v 1.28 1998/04/20 18:53:27 grubba Exp $
 **! class image
 */
 
@@ -296,8 +296,7 @@ void image_paste(INT32 args)
    if(x1 >= THIS->xsize || y1 >= THIS->ysize) /* Per */
    {
      pop_n_elems(args);
-     THISOBJ->refs++;
-     push_object(THISOBJ);
+     ref_push_object(THISOBJ);
      return;
    }   
    x2=x1+img->xsize-1;
@@ -306,8 +305,7 @@ void image_paste(INT32 args)
    if(x2 < 0 || y2 < 0) /* Per */
    {
      pop_n_elems(args);
-     THISOBJ->refs++;
-     push_object(THISOBJ);
+     ref_push_object(THISOBJ);
      return;
    }   
    blitwidth=MINIMUM(x2,THIS->xsize-1)-MAXIMUM(x1,0)+1;
@@ -321,8 +319,7 @@ void image_paste(INT32 args)
 	    img->xsize);
 
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -376,8 +373,7 @@ void image_paste_alpha(INT32 args)
    if(x1 >= THIS->xsize || y1 >= THIS->ysize) /* Per */
    {
      pop_n_elems(args);
-     THISOBJ->refs++;
-     push_object(THISOBJ);
+     ref_push_object(THISOBJ);
      return;
    }   
 
@@ -405,8 +401,7 @@ void image_paste_alpha(INT32 args)
      THREADS_DISALLOW();
    }
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -502,8 +497,7 @@ CHRONO("image_paste_mask begin");
 CHRONO("image_paste_mask end");
 
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -609,8 +603,7 @@ CHRONO("image_paste_alpha_color begin");
 CHRONO("image_paste_alpha_color end");
 
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 void img_box(INT32 x1,INT32 y1,INT32 x2,INT32 y2)
diff --git a/src/modules/Image/colortable.c b/src/modules/Image/colortable.c
index 68cc6677c5..e498ce56b8 100644
--- a/src/modules/Image/colortable.c
+++ b/src/modules/Image/colortable.c
@@ -1,12 +1,12 @@
 #include "global.h"
 #include <config.h>
 
-/* $Id: colortable.c,v 1.43 1998/04/20 00:10:05 mirar Exp $ */
+/* $Id: colortable.c,v 1.44 1998/04/20 18:53:28 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: colortable.c,v 1.43 1998/04/20 00:10:05 mirar Exp $
+**!	$Id: colortable.c,v 1.44 1998/04/20 18:53:28 grubba Exp $
 **! class colortable
 **!
 **!	This object keeps colortable information,
@@ -21,7 +21,7 @@
 #undef COLORTABLE_DEBUG
 #undef COLORTABLE_REDUCE_DEBUG
 
-RCSID("$Id: colortable.c,v 1.43 1998/04/20 00:10:05 mirar Exp $");
+RCSID("$Id: colortable.c,v 1.44 1998/04/20 18:53:28 grubba Exp $");
 
 #include <math.h> /* fabs() */
 
@@ -1987,7 +1987,7 @@ static void image_colortable_add(INT32 args)
    if (!args) 
    {
       pop_n_elems(args);
-      push_object(THISOBJ); THISOBJ->refs++;
+      ref_push_object(THISOBJ);
       return;
    }
    
@@ -2008,7 +2008,7 @@ static void image_colortable_add(INT32 args)
 #endif
 	    _img_add_colortable(THIS,ct2);
 	    pop_n_elems(args);
-	    push_object(THISOBJ); THISOBJ->refs++;
+	    ref_push_object(THISOBJ);
 	    return;
 	 }
       }
@@ -2133,7 +2133,7 @@ static void image_colortable_add(INT32 args)
    }
    else error("Illegal argument(s) to Image.colortable->add|create\n");
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 
 #ifdef COLORTABLE_DEBUG
    fprintf(stderr,"COLORTABLE done (%lx created, %d args was left, sp-1=%lx)\n",THIS,args,sp-1);
@@ -2219,8 +2219,7 @@ void image_colortable_operator_plus(INT32 args)
 
    int i;
 
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
    o=clone_object(THISOBJ->prog,1);
    dest=(struct neo_colortable*)get_storage(o,image_colortable_program);
 
@@ -2272,8 +2271,7 @@ void image_colortable_operator_minus(INT32 args)
 
    int i;
 
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
    o=clone_object(THISOBJ->prog,1);
    dest=(struct neo_colortable*)get_storage(o,image_colortable_program);
 
@@ -2445,7 +2443,7 @@ void image_colortable_full(INT32 args)
       THIS->lookup_mode=NCT_FULL;
    }
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -2556,7 +2554,7 @@ void image_colortable_cubicles(INT32 args)
    }
 
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 static  int _cub_find_2cub_add(int *i,int *p,
@@ -3284,7 +3282,7 @@ void image_colortable_spacefactors(INT32 args)
    THIS->spacefactor.b=sp[2-args].u.integer;
 
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -3383,7 +3381,7 @@ void image_colortable_floyd_steinberg(INT32 args)
    THIS->dither_type=NCTD_FLOYD_STEINBERG;
 
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 /* called by GIF encoder */
@@ -3408,7 +3406,7 @@ void image_colortable_nodither(INT32 args)
 {
    THIS->dither_type=NCTD_NONE;
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -3505,7 +3503,7 @@ void image_colortable_randomcube(INT32 args)
    THIS->dither_type=NCTD_RANDOMCUBE;
 
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 void image_colortable_randomgrey(INT32 args)
@@ -3525,7 +3523,7 @@ void image_colortable_randomgrey(INT32 args)
    THIS->dither_type=NCTD_RANDOMGREY;
 
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 static int* ordered_calculate_errors(int dxs,int dys)
@@ -3852,7 +3850,7 @@ void image_colortable_ordered(INT32 args)
    THIS->dither_type=NCTD_ORDERED;
 
    pop_n_elems(args);
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
 }
 
 /*
diff --git a/src/modules/Image/encodings/png.c b/src/modules/Image/encodings/png.c
index 791e4cc51b..351e4d48fa 100644
--- a/src/modules/Image/encodings/png.c
+++ b/src/modules/Image/encodings/png.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: png.c,v 1.13 1998/04/08 03:46:11 mirar Exp $");
+RCSID("$Id: png.c,v 1.14 1998/04/20 18:53:35 grubba Exp $");
 
 #include "config.h"
 
@@ -224,7 +224,7 @@ static void image_png___decode(INT32 args)
 	sp[1-args].u.integer!=0))
       nocrc=1;
    
-   (str=sp[-args].u.string)->refs++;
+   add_ref(str=sp[-args].u.string);
    data=(unsigned char*)str->str;
    len=str->len;
 
@@ -972,7 +972,7 @@ static void image_png__decode(INT32 args)
    else if (sp[-1].type!=T_ARRAY)
       error("Image.PNG._decode: Illegal argument\n");
 
-   (a=sp[-1].u.array)->refs++;
+   add_ref(a=sp[-1].u.array);
 
    pop_n_elems(1);
 
@@ -1626,14 +1626,14 @@ struct object *init_image_png(void)
      push_text("inflate");
      f_index(2);
      gz_inflate=program_from_svalue(sp-1);
-     gz_inflate->refs++;
+     add_ref(gz_inflate);
      pop_stack();
 
      stack_dup();
      push_text("deflate");
      f_index(2);
      gz_deflate=program_from_svalue(sp-1);
-     gz_deflate->refs++;
+     add_ref(gz_deflate);
      pop_stack();
 
      stack_dup();
diff --git a/src/modules/Image/encodings/pnm.c b/src/modules/Image/encodings/pnm.c
index cc4f7998af..1ed200541d 100644
--- a/src/modules/Image/encodings/pnm.c
+++ b/src/modules/Image/encodings/pnm.c
@@ -1,9 +1,9 @@
-/* $Id: pnm.c,v 1.15 1998/04/16 00:39:02 mirar Exp $ */
+/* $Id: pnm.c,v 1.16 1998/04/20 18:53:36 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: pnm.c,v 1.15 1998/04/16 00:39:02 mirar Exp $
+**!	$Id: pnm.c,v 1.16 1998/04/20 18:53:36 grubba Exp $
 **! submodule PNM
 **!
 **!	This submodule keeps the PNM encode/decode capabilities
@@ -49,7 +49,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: pnm.c,v 1.15 1998/04/16 00:39:02 mirar Exp $");
+RCSID("$Id: pnm.c,v 1.16 1998/04/20 18:53:36 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -323,7 +323,7 @@ void img_pnm_encode_P2(INT32 args) /* ascii PGM */
    if (!img->img)
       error("Image.PNM.encode_P2(): Given image is empty\n");
 
-   o->refs++;
+   add_ref(o);
    pop_n_elems(args);
 
    sprintf(buf,"P2\n%d %d\n255\n",img->xsize,img->ysize);
@@ -364,7 +364,7 @@ void img_pnm_encode_P3(INT32 args) /* ascii PPM */
    if (!img->img)
       error("Image.PNM.encode_P3(): Given image is empty\n");
 
-   o->refs++;
+   add_ref(o);
    pop_n_elems(args);
 
    sprintf(buf,"P3\n%d %d\n255\n",img->xsize,img->ysize);
diff --git a/src/modules/Image/encodings/x.c b/src/modules/Image/encodings/x.c
index 4d3a761a42..f270a51f5e 100644
--- a/src/modules/Image/encodings/x.c
+++ b/src/modules/Image/encodings/x.c
@@ -1,9 +1,9 @@
-/* $Id: x.c,v 1.15 1998/04/18 00:08:41 mirar Exp $ */
+/* $Id: x.c,v 1.16 1998/04/20 18:53:37 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: x.c,v 1.15 1998/04/18 00:08:41 mirar Exp $
+**!	$Id: x.c,v 1.16 1998/04/20 18:53:37 grubba Exp $
 **! submodule X
 **!
 **!	This submodule handles encoding and decoding of
@@ -29,7 +29,7 @@
 #include <winsock.h>
 #endif
 
-RCSID("$Id: x.c,v 1.15 1998/04/18 00:08:41 mirar Exp $");
+RCSID("$Id: x.c,v 1.16 1998/04/20 18:53:37 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -426,7 +426,7 @@ static void image_x_encode_truecolor_masks(INT32 args)
   image_x_examine_mask(sp+5-args,"argument 4 (blue mask)",&gbits,&gshift);
   image_x_examine_mask(sp+6-args,"argument 5 (green mask)",&bbits,&bshift);
 
-   if (ct) ct->refs++;
+   if (ct) add_ref(ct);
    pop_n_elems(args-4);
    push_int(rbits);
    push_int(rshift);
@@ -779,7 +779,7 @@ static void image_x_decode_truecolor(INT32 args)
       if (sp[i-args].type!=T_INT) 
 	 error("Image.X.decode_truecolor: illegal argument %d\n",i+1);
 
-   (ps=sp[-args].u.string)->refs++;
+   add_ref(ps=sp[-args].u.string);
    s=(unsigned char*)ps->str;
    len=ps->len;
    width=sp[1-args].u.integer;
@@ -873,7 +873,7 @@ void image_x_decode_truecolor_masks(INT32 args)
    image_x_examine_mask(sp+7-args,"argument 8 (blue mask)",&gbits,&gshift);
    image_x_examine_mask(sp+8-args,"argument 9 (green mask)",&bbits,&bshift);
 
-   if (ct) ct->refs++;
+   if (ct) add_ref(ct);
    pop_n_elems(args-6);
    push_int(rbits);
    push_int(rshift);
@@ -925,7 +925,7 @@ void image_x_decode_pseudocolor(INT32 args)
       /* fix me some other day */ 
       error("Image.X.decode_pseudocolor: argument 7, colortable, needs to be a flat colortable\n");
 
-   (ps=sp[-args].u.string)->refs++;
+   add_ref(ps=sp[-args].u.string);
    s=(unsigned char*)ps->str;
    len=ps->len;
    width=sp[1-args].u.integer;
@@ -934,7 +934,7 @@ void image_x_decode_pseudocolor(INT32 args)
    alignbits=sp[4-args].u.integer;
    swapbytes=sp[5-args].u.integer;
 
-   ncto->refs++;
+   add_ref(ncto);
 
    pop_n_elems(args);
 
diff --git a/src/modules/Image/encodings/xwd.c b/src/modules/Image/encodings/xwd.c
index a63ca6071d..a87f000fa7 100644
--- a/src/modules/Image/encodings/xwd.c
+++ b/src/modules/Image/encodings/xwd.c
@@ -1,9 +1,9 @@
-/* $Id: xwd.c,v 1.4 1998/03/31 21:58:36 hubbe Exp $ */
+/* $Id: xwd.c,v 1.5 1998/04/20 18:53:38 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: xwd.c,v 1.4 1998/03/31 21:58:36 hubbe Exp $
+**!	$Id: xwd.c,v 1.5 1998/04/20 18:53:38 grubba Exp $
 **! submodule XWD
 **!
 **!	This submodule keeps the XWD (X Windows Dump) 
@@ -25,7 +25,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: xwd.c,v 1.4 1998/03/31 21:58:36 hubbe Exp $");
+RCSID("$Id: xwd.c,v 1.5 1998/04/20 18:53:38 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -125,7 +125,7 @@ static void image_xwd__decode(INT32 args)
        sp[1-args].u.integer!=0) 
       skipcmap=1;
    
-   (s=sp[-args].u.string)->refs++;
+   add_ref(s=sp[-args].u.string);
    pop_n_elems(args);
 
    /* header_size = SIZEOF(XWDheader) + length of null-terminated
@@ -310,8 +310,7 @@ static void image_xwd__decode(INT32 args)
 	 push_int(header.bits_per_pixel);
 	 push_int(header.bitmap_pad);
 	 push_int(header.byte_order==1);
-	 push_object(co);
-	 co->refs++;
+	 ref_push_object(co);
 	 image_x_decode_pseudocolor(7);
 	 break;
       default:
diff --git a/src/modules/Image/font.c b/src/modules/Image/font.c
index 6e60d934d3..e12e0a5079 100644
--- a/src/modules/Image/font.c
+++ b/src/modules/Image/font.c
@@ -1,4 +1,4 @@
-/* $Id: font.c,v 1.33 1998/03/26 03:11:19 hubbe Exp $ */
+/* $Id: font.c,v 1.34 1998/04/20 18:53:29 grubba Exp $ */
 #include "global.h"
 #include <config.h>
 
@@ -7,7 +7,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: font.c,v 1.33 1998/03/26 03:11:19 hubbe Exp $
+**!	$Id: font.c,v 1.34 1998/04/20 18:53:29 grubba Exp $
 **! class font
 **!
 **! note
@@ -463,8 +463,7 @@ void font_load(INT32 args)
 
 		  fd_close(fd);
 		  pop_n_elems(args);
-		  THISOBJ->refs++;
-		  push_object(THISOBJ);   /* success */
+		  ref_push_object(THISOBJ);   /* success */
 #ifdef FONT_DEBUG
 		  fprintf(stderr,"FONT successfully loaded\n");
 #endif
diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index 9c047685f9..77f2a47e7a 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,9 +1,9 @@
-/* $Id: image.c,v 1.103 1998/04/20 01:42:21 mirar Exp $ */
+/* $Id: image.c,v 1.104 1998/04/20 18:53:30 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: image.c,v 1.103 1998/04/20 01:42:21 mirar Exp $
+**!	$Id: image.c,v 1.104 1998/04/20 18:53:30 grubba Exp $
 **! class image
 **!
 **!	The main object of the <ref>Image</ref> module, this object
@@ -97,7 +97,7 @@
 
 #include "stralloc.h"
 #include "global.h"
-RCSID("$Id: image.c,v 1.103 1998/04/20 01:42:21 mirar Exp $");
+RCSID("$Id: image.c,v 1.104 1998/04/20 18:53:30 grubba Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -957,8 +957,7 @@ void image_setcolor(INT32 args)
       error("illegal arguments to Image.image->setcolor()\n");
    getrgb(THIS,0,args,"Image.image->setcolor()");
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -1000,8 +999,7 @@ void image_setpixel(INT32 args)
    if (!THIS->img) return;
    setpixel_test(x,y);
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -1084,8 +1082,7 @@ void image_line(INT32 args)
 	    sp[2-args].u.integer,
 	    sp[3-args].u.integer);
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -1132,8 +1129,7 @@ void image_box(INT32 args)
 	   sp[2-args].u.integer,
 	   sp[3-args].u.integer);
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 /*
@@ -1191,8 +1187,7 @@ void image_circle(INT32 args)
 	       y+circle_cos_mul(i+1,ry));
    
    pop_n_elems(args);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 static INLINE void get_rgba_group_from_array_index(rgba_group *rgba,struct array *v,INT32 index)
@@ -1401,8 +1396,7 @@ void image_tuned_box(INT32 args)
 	       sum=topright,topright=bottomright,bottomright=sum;
 
   pop_n_elems(args);
-  THISOBJ->refs++;
-  push_object(THISOBJ);
+  ref_push_object(THISOBJ);
 
   if (x2<0||y2<0||x1>=THIS->xsize||y1>=THIS->ysize) return;
   xw=x2-x1;
@@ -3289,7 +3283,7 @@ void image_select_colors(INT32 args)
    colors=sp[-args].u.integer;
    pop_n_elems(args);
 
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
    push_int(colors);
 
    o=clone_object(image_colortable_program,2);
@@ -3348,8 +3342,7 @@ void image_write_lsb_rgb(INT32 args)
 
    pop_n_elems(args);
    
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 void image_read_lsb_rgb(INT32 args)
@@ -3426,8 +3419,7 @@ void image_write_lsb_grey(INT32 args)
 
    pop_n_elems(args);
    
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
 void image_read_lsb_grey(INT32 args)
@@ -3521,11 +3513,10 @@ static void image_index_magic(INT32 args)
       pop_stack();
       if (!png_object)
 	 png_object=init_image_png();
-      png_object->refs++;
-      push_object(png_object);
+      ref_push_object(png_object);
       return;
    }
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
    tmp=sp[-1], sp[-1]=sp[-2], sp[-2]=tmp;
    f_arrow(2);
 }
diff --git a/src/modules/Image/pnm.c b/src/modules/Image/pnm.c
index febed8a0a1..bc0c5cc5a3 100644
--- a/src/modules/Image/pnm.c
+++ b/src/modules/Image/pnm.c
@@ -1,9 +1,9 @@
-/* $Id: pnm.c,v 1.9 1998/01/13 22:59:24 hubbe Exp $ */
+/* $Id: pnm.c,v 1.10 1998/04/20 18:53:32 grubba Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: pnm.c,v 1.9 1998/01/13 22:59:24 hubbe Exp $
+**!	$Id: pnm.c,v 1.10 1998/04/20 18:53:32 grubba Exp $
 **! class image
 */
 
@@ -58,8 +58,7 @@ void image_toppm(INT32 args)
 {
    pop_n_elems(args);
    
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 
    img_pnm_encode_binary(1);
 }
@@ -76,7 +75,6 @@ void image_frompnm(INT32 args)
    if (!THIS->img) error("out of memory\n");
    MEMCPY(THIS->img,img->img,img->xsize*img->ysize*sizeof(rgb_group));
    pop_n_elems(1);
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
diff --git a/src/modules/Image/polyfill.c b/src/modules/Image/polyfill.c
index fce9f355f0..deabe78fc5 100644
--- a/src/modules/Image/polyfill.c
+++ b/src/modules/Image/polyfill.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: polyfill.c,v 1.24 1998/04/19 19:14:23 mirar Exp $");
+RCSID("$Id: polyfill.c,v 1.25 1998/04/20 18:53:33 grubba Exp $");
 
 /* Prototypes are needed for these */
 extern double floor(double);
@@ -32,7 +32,7 @@ extern double floor(double);
 /*
 **! module Image
 **! note
-**!	$Id: polyfill.c,v 1.24 1998/04/19 19:14:23 mirar Exp $
+**!	$Id: polyfill.c,v 1.25 1998/04/20 18:53:33 grubba Exp $
 **! class image
 */
 
@@ -773,7 +773,6 @@ void image_polyfill(INT32 args)
    
    free(buf);
 
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
 }
 
diff --git a/src/modules/Image/togif.c b/src/modules/Image/togif.c
index 71e5cd608e..1f77363bc3 100644
--- a/src/modules/Image/togif.c
+++ b/src/modules/Image/togif.c
@@ -2,7 +2,7 @@
 
 togif 
 
-$Id: togif.c,v 1.30 1998/01/16 22:09:14 grubba Exp $ 
+$Id: togif.c,v 1.31 1998/04/20 18:53:34 grubba Exp $ 
 
 old GIF API compat stuff
 
@@ -11,7 +11,7 @@ old GIF API compat stuff
 /*
 **! module Image
 **! note
-**!	$Id: togif.c,v 1.30 1998/01/16 22:09:14 grubba Exp $
+**!	$Id: togif.c,v 1.31 1998/04/20 18:53:34 grubba Exp $
 **! class image
 */
 
@@ -107,8 +107,7 @@ void image_gif_begin(INT32 args)
 	 pop_n_elems(args);
 	 push_int(THIS->xsize);
 	 push_int(THIS->ysize);
-	 THISOBJ->refs++;
-	 push_object(THISOBJ);
+	 ref_push_object(THISOBJ);
 	 push_int(i);
 	 o=clone_object(image_colortable_program,2);
       }
@@ -169,8 +168,7 @@ static void img_gif_add(INT32 args,int fs,int lm,
    else if (args>3 && sp[2-args].type==T_INT)
    {
       INT32 i=sp[2-args].u.integer;
-      THISOBJ->refs++;
-      push_object(THISOBJ);
+      ref_push_object(THISOBJ);
       push_int(i);
       ncto=clone_object(image_colortable_program,2);
    }
@@ -187,8 +185,7 @@ static void img_gif_add(INT32 args,int fs,int lm,
    
    if (!ncto)
    {
-      THISOBJ->refs++;
-      push_object(THISOBJ);
+      ref_push_object(THISOBJ);
       push_int(255);
       ncto=clone_object(image_colortable_program,2);
    }
@@ -198,8 +195,7 @@ static void img_gif_add(INT32 args,int fs,int lm,
 
    pop_n_elems(args);
 
-   THISOBJ->refs++;
-   push_object(THISOBJ);
+   ref_push_object(THISOBJ);
    push_object(ncto);
    push_int(x);
    push_int(y);
@@ -277,7 +273,7 @@ static void img_encode_gif(rgb_group *transparent,int fs,INT32 args)
    {
       if (sp[-args].type==T_OBJECT)
       {
-	 (co=sp[-args].u.object)->refs++;
+	 add_ref(co=sp[-args].u.object);
 	 pop_n_elems(args);
       }
       else if (sp[-args].type==T_ARRAY)
@@ -286,7 +282,7 @@ static void img_encode_gif(rgb_group *transparent,int fs,INT32 args)
       {
 	 unsigned long numcolors=sp[-args].u.integer;
 	 pop_n_elems(args);
-	 push_object(THISOBJ); THISOBJ->refs++;
+	 ref_push_object(THISOBJ);
 	 push_int(numcolors);
 	 co=clone_object(image_colortable_program,2);
       }
@@ -295,11 +291,11 @@ static void img_encode_gif(rgb_group *transparent,int fs,INT32 args)
    }
    else
    {
-      push_object(THISOBJ); THISOBJ->refs++;
+      ref_push_object(THISOBJ);
       push_int(256);
       co=clone_object(image_colortable_program,2);
    }
-   push_object(THISOBJ); THISOBJ->refs++;
+   ref_push_object(THISOBJ);
    push_object(co);
    if (transparent)
    {
diff --git a/src/modules/Mysql/mysql.c b/src/modules/Mysql/mysql.c
index a6b6e54478..a71cd70347 100644
--- a/src/modules/Mysql/mysql.c
+++ b/src/modules/Mysql/mysql.c
@@ -1,5 +1,5 @@
 /*
- * $Id: mysql.c,v 1.18 1998/04/13 14:11:38 grubba Exp $
+ * $Id: mysql.c,v 1.19 1998/04/20 18:53:39 grubba Exp $
  *
  * SQL database functionality for Pike
  *
@@ -73,12 +73,12 @@ typedef struct dynamic_buffer_s dynamic_buffer;
  * Globals
  */
 
-RCSID("$Id: mysql.c,v 1.18 1998/04/13 14:11:38 grubba Exp $");
+RCSID("$Id: mysql.c,v 1.19 1998/04/20 18:53:39 grubba Exp $");
 
 /*
 **! module Mysql
 **! note
-**!	$Id: mysql.c,v 1.18 1998/04/13 14:11:38 grubba Exp $
+**!	$Id: mysql.c,v 1.19 1998/04/20 18:53:39 grubba Exp $
 **! class mysql
 **!
 **!	Mysql.mysql is a pre-compiled Pike program. It enables
@@ -303,8 +303,7 @@ static void f_create(INT32 args)
       error("Bad argument 1 to mysql()\n");
     }
     if (sp[-args].u.string->len) {
-      PIKE_MYSQL->host = sp[-args].u.string;
-      PIKE_MYSQL->host->refs++;
+      add_ref(PIKE_MYSQL->host = sp[-args].u.string);
     }
 
     if (args >= 2) {
@@ -312,8 +311,7 @@ static void f_create(INT32 args)
 	error("Bad argument 2 to mysql()\n");
       }
       if (sp[1-args].u.string->len) {
-	PIKE_MYSQL->database = sp[1-args].u.string;
-	PIKE_MYSQL->database->refs++;
+	add_ref(PIKE_MYSQL->database = sp[1-args].u.string);
       }
 
       if (args >= 3) {
@@ -321,8 +319,7 @@ static void f_create(INT32 args)
 	  error("Bad argument 3 to mysql()\n");
 	}
 	if (sp[2-args].u.string->len) {
-	  PIKE_MYSQL->user = sp[2-args].u.string;
-	  PIKE_MYSQL->user->refs++;
+	  add_ref(PIKE_MYSQL->user = sp[2-args].u.string);
 	}
 
 	if (args >= 4) {
@@ -330,8 +327,7 @@ static void f_create(INT32 args)
 	    error("Bad argument 4 to mysql()\n");
 	  }
 	  if (sp[3-args].u.string->len) {
-	    PIKE_MYSQL->password = sp[3-args].u.string;
-	    PIKE_MYSQL->password->refs++;
+	    add_ref(PIKE_MYSQL->password = sp[3-args].u.string);
 	  }
 	}
       }
@@ -486,8 +482,7 @@ static void f_select_db(INT32 args)
   if (PIKE_MYSQL->database) {
     free_string(PIKE_MYSQL->database);
   }
-  PIKE_MYSQL->database = sp[-args].u.string;
-  PIKE_MYSQL->database->refs++;
+  add_ref(PIKE_MYSQL->database = sp[-args].u.string);
 
   pop_n_elems(args);
 }
@@ -593,8 +588,7 @@ static void f_big_query(INT32 args)
   } else {
     /* Return the result-object */
 
-    push_object(fp->current_object);
-    fp->current_object->refs++;
+    ref_push_object(fp->current_object);
 
     push_object(clone_object(mysql_result_program, 1));
   }
@@ -1002,8 +996,7 @@ static void f_list_dbs(INT32 args)
 
   pop_n_elems(args);
 
-  push_object(fp->current_object);
-  fp->current_object->refs++;
+  ref_push_object(fp->current_object);
 
   push_object(clone_object(mysql_result_program, 1));
 }
@@ -1074,8 +1067,7 @@ static void f_list_tables(INT32 args)
 
   pop_n_elems(args);
 
-  push_object(fp->current_object);
-  fp->current_object->refs++;
+  ref_push_object(fp->current_object);
 
   push_object(clone_object(mysql_result_program, 1));
 }
@@ -1248,8 +1240,7 @@ static void f_list_processes(INT32 args)
     error("mysql->list_processes(): Cannot list databases: %s\n", err);
   }
 
-  push_object(fp->current_object);
-  fp->current_object->refs++;
+  ref_push_object(fp->current_object);
 
   push_object(clone_object(mysql_result_program, 1));
 }
diff --git a/src/modules/Mysql/result.c b/src/modules/Mysql/result.c
index fa4cc4fa20..357a7bc1a8 100644
--- a/src/modules/Mysql/result.c
+++ b/src/modules/Mysql/result.c
@@ -1,5 +1,5 @@
 /*
- * $Id: result.c,v 1.10 1997/12/12 17:07:13 grubba Exp $
+ * $Id: result.c,v 1.11 1998/04/20 18:53:41 grubba Exp $
  *
  * mysql query result
  *
@@ -78,7 +78,7 @@ typedef struct dynamic_buffer_s dynamic_buffer;
  * Globals
  */
 
-RCSID("$Id: result.c,v 1.10 1997/12/12 17:07:13 grubba Exp $");
+RCSID("$Id: result.c,v 1.11 1998/04/20 18:53:41 grubba Exp $");
 
 struct program *mysql_result_program = NULL;
 
@@ -230,8 +230,7 @@ static void f_create(INT32 args)
     error("Bad argument 1 to mysql_result()\n");
   }
 
-  PIKE_MYSQL_RES->connection = sp[-args].u.object;
-  PIKE_MYSQL_RES->connection->refs++;
+  add_ref(PIKE_MYSQL_RES->connection = sp[-args].u.object);
   PIKE_MYSQL_RES->result = mysql->last_result;
   mysql->last_result = NULL;
   
diff --git a/src/modules/Odbc/odbc.c b/src/modules/Odbc/odbc.c
index f69892aaa7..11d10e86db 100644
--- a/src/modules/Odbc/odbc.c
+++ b/src/modules/Odbc/odbc.c
@@ -1,5 +1,5 @@
 /*
- * $Id: odbc.c,v 1.6 1997/11/02 22:19:49 grubba Exp $
+ * $Id: odbc.c,v 1.7 1998/04/20 18:53:42 grubba Exp $
  *
  * Pike interface to ODBC compliant databases.
  *
@@ -15,7 +15,7 @@
 #endif /* HAVE_CONFIG_H */
 
 #include "global.h"
-RCSID("$Id: odbc.c,v 1.6 1997/11/02 22:19:49 grubba Exp $");
+RCSID("$Id: odbc.c,v 1.7 1998/04/20 18:53:42 grubba Exp $");
 
 #include "interpret.h"
 #include "object.h"
@@ -179,8 +179,7 @@ static void f_error(INT32 args)
   pop_n_elems(args);
 
   if (PIKE_ODBC->last_error) {
-    PIKE_ODBC->last_error->refs++;
-    push_string(PIKE_ODBC->last_error);
+    ref_push_string(PIKE_ODBC->last_error);
   } else {
     push_int(0);
   }
@@ -257,8 +256,7 @@ static void f_big_query(INT32 args)
 
   if (PIKE_ODBC->num_fields) {
     /* PIKE_ODBC->hstmt=hstmt; */
-    push_object(fp->current_object);
-    fp->current_object->refs++;
+    ref_push_object(fp->current_object);
 
     push_object(clone_object(odbc_result_program, 1));
   } else {
diff --git a/src/modules/Odbc/odbc_result.c b/src/modules/Odbc/odbc_result.c
index 9cb2770c6e..4bc8ef496a 100644
--- a/src/modules/Odbc/odbc_result.c
+++ b/src/modules/Odbc/odbc_result.c
@@ -1,5 +1,5 @@
 /*
- * $Id: odbc_result.c,v 1.7 1997/11/02 22:20:51 grubba Exp $
+ * $Id: odbc_result.c,v 1.8 1998/04/20 18:53:43 grubba Exp $
  *
  * Pike  interface to ODBC compliant databases
  *
@@ -17,7 +17,7 @@
 #ifdef HAVE_ODBC
 
 #include "global.h"
-RCSID("$Id: odbc_result.c,v 1.7 1997/11/02 22:20:51 grubba Exp $");
+RCSID("$Id: odbc_result.c,v 1.8 1998/04/20 18:53:43 grubba Exp $");
 
 #include "interpret.h"
 #include "object.h"
@@ -224,8 +224,7 @@ static void odbc_fix_fields(void)
   }
   f_aggregate(PIKE_ODBC_RES->num_fields);
 
-  sp[-1].u.array->refs++;
-  PIKE_ODBC_RES->fields = sp[-1].u.array;
+  add_ref(PIKE_ODBC_RES->fields = sp[-1].u.array);
   pop_stack();
 
   PIKE_ODBC_RES->field_info = (struct field_info *)
@@ -287,8 +286,7 @@ static void f_create(INT32 args)
     error("Bad argument 1 to odbc_result()\n");
   }
  
-  PIKE_ODBC_RES->obj = sp[-args].u.object;
-  PIKE_ODBC_RES->obj->refs++;
+  add_ref(PIKE_ODBC_RES->obj = sp[-args].u.object);
   PIKE_ODBC_RES->hstmt = PIKE_ODBC_RES->odbc->hstmt;
   PIKE_ODBC_RES->odbc->hstmt = SQL_NULL_HSTMT;
   
@@ -325,8 +323,7 @@ static void f_fetch_fields(INT32 args)
 {
   pop_n_elems(args);
 
-  PIKE_ODBC_RES->fields->refs++;
-  push_array(PIKE_ODBC_RES->fields);
+  ref_push_array(PIKE_ODBC_RES->fields);
 }
  
 /* int|array(string|float|int) fetch_row() */
diff --git a/src/modules/Oracle/oracle.c b/src/modules/Oracle/oracle.c
index 18bceca040..7cb6013993 100644
--- a/src/modules/Oracle/oracle.c
+++ b/src/modules/Oracle/oracle.c
@@ -1,5 +1,5 @@
 /*
- * $Id: oracle.c,v 1.9 1998/02/02 21:39:28 marcus Exp $
+ * $Id: oracle.c,v 1.10 1998/04/20 18:53:45 grubba Exp $
  *
  * Pike interface to Oracle databases.
  *
@@ -34,7 +34,7 @@
 
 #endif
 
-RCSID("$Id: oracle.c,v 1.9 1998/02/02 21:39:28 marcus Exp $");
+RCSID("$Id: oracle.c,v 1.10 1998/04/20 18:53:45 grubba Exp $");
 
 #ifdef HAVE_ORACLE
 
@@ -113,10 +113,9 @@ static void f_result_create(INT32 args)
   r->curs = curs;
   dbcon->share_cda = NULL;
 
-  r->parent = p;
+  add_ref(r->parent = p);
   r->dbcon = dbcon;
   r->cda = &curs->cda;
-  p->refs++;
 
   r->cols = 0;
 }
diff --git a/src/modules/Pipe/pipe.c b/src/modules/Pipe/pipe.c
index f0d6122062..16ab3cd1fe 100644
--- a/src/modules/Pipe/pipe.c
+++ b/src/modules/Pipe/pipe.c
@@ -22,7 +22,7 @@
 #include <fcntl.h>
 
 #include "global.h"
-RCSID("$Id: pipe.c,v 1.20 1998/04/06 20:40:04 hubbe Exp $");
+RCSID("$Id: pipe.c,v 1.21 1998/04/20 18:53:46 grubba Exp $");
 
 #include "threads.h"
 #include "stralloc.h"
@@ -158,8 +158,7 @@ static INLINE void output_try_write_some(struct object *obj);
  */
 static void push_callback(int no)
 {
-  sp->u.object=THISOBJ;
-  THISOBJ->refs++;
+  add_ref(sp->u.object=THISOBJ);
   sp->subtype=no+fp->context.identifier_level;
   sp->type=T_FUNCTION;
   sp++;
@@ -278,7 +277,7 @@ static INLINE int append_buffer(struct pike_string *s)
      b->next=NULL;
      b->s=s;
      sbuffers += s->len;
-     s->refs++;
+     add_ref(s);
 
      if (THIS->lastbuffer)
        THIS->lastbuffer->next=b;
@@ -299,10 +298,10 @@ static void low_start(void)
   struct output *o;
 
 
-  THISOBJ->refs++;		/* dont kill yourself now */
+  add_ref(THISOBJ);		/* dont kill yourself now */
   for(obj=THIS->firstoutput;obj;obj=next)
   {
-    obj->refs++; /* Hang on PLEASE!! /hubbe */
+    add_ref(obj);		/* Hang on PLEASE!! /hubbe */
     o=(struct output *)(obj->storage);
     if (o->obj && o->mode==O_SLEEP)
     {
@@ -518,7 +517,7 @@ static INLINE struct pike_string* gimme_some_data(unsigned long pos)
 
    if (pos==this->pos)
    {
-      this->firstbuffer->s->refs++;
+      add_ref(this->firstbuffer->s);
       return this->firstbuffer->s;
    }
    return make_shared_binary_string(this->firstbuffer->s->str+
@@ -717,7 +716,7 @@ static void pipe_input(INT32 args)
    i->u.obj=obj;
    nobjects++;
    i->type=I_OBJ;
-   i->u.obj->refs++;
+   add_ref(i->u.obj);
    i->set_nonblocking_offset=find_identifier("set_nonblocking",i->u.obj->prog);
    i->set_blocking_offset=find_identifier("set_blocking",i->u.obj->prog);
 
@@ -784,8 +783,7 @@ static void pipe_write(INT32 args)
   i=new_input();
   i->type=I_STRING;
   nstrings++;
-  i->u.str=sp[-args].u.string;
-  i->u.str->refs++;
+  add_ref(i->u.str=sp[-args].u.string);
   pop_n_elems(args-1);
 }
 
@@ -853,7 +851,7 @@ static void pipe_output(INT32 args)
   } 
 
   THIS->living_outputs++;
-  THISOBJ->refs++;		/* Weird */
+  add_ref(THISOBJ);		/* Weird */
 
   /* Allocate a new struct output */
   obj=clone_object(output_program,0);
@@ -863,8 +861,7 @@ static void pipe_output(INT32 args)
   noutputs++;
   o->obj=NULL;
 
-  o->obj=sp[-args].u.object;
-  o->obj->refs++;
+  add_ref(o->obj=sp[-args].u.object);
 
   o->write_offset=find_identifier("write",o->obj->prog);
   o->set_nonblocking_offset=find_identifier("set_nonblocking",o->obj->prog);
@@ -885,8 +882,7 @@ static void pipe_output(INT32 args)
      o->pos=0; */
   o->pos=THIS->pos;
 
-  push_object(obj);
-  obj->refs++;
+  ref_push_object(obj);
   apply(o->obj,"set_id",1);
   pop_stack();
 
@@ -1079,7 +1075,7 @@ void close_and_free_everything(struct object *thisobj,struct pipe *p)
    p->done=1;
 
    if (thisobj) 
-      thisobj->refs++; /* don't kill object during this */
+      add_ref(thisobj); /* don't kill object during this */
 
    while (p->firstbuffer)
    {
diff --git a/src/modules/Postgres/pgresult.c b/src/modules/Postgres/pgresult.c
index 108c1b9959..698a2817b2 100644
--- a/src/modules/Postgres/pgresult.c
+++ b/src/modules/Postgres/pgresult.c
@@ -1,5 +1,5 @@
 /*
- * $Id: pgresult.c,v 1.5 1998/03/28 14:41:01 grubba Exp $
+ * $Id: pgresult.c,v 1.6 1998/04/20 18:53:48 grubba Exp $
  *
  * Postgres95 support for pike/0.5 and up
  *
@@ -63,7 +63,7 @@
 #include "builtin_functions.h"
 #include "module_support.h"
 
-RCSID("$Id: pgresult.c,v 1.5 1998/03/28 14:41:01 grubba Exp $");
+RCSID("$Id: pgresult.c,v 1.6 1998/04/20 18:53:48 grubba Exp $");
 
 #ifdef _REENTRANT
 MUTEX_T pike_postgres_result_mutex;
@@ -233,7 +233,7 @@ void pgresult_init (void)
 			OPT_EXTERNAL_DEPEND|OPT_RETURN);
 	pgresult_program=end_program();
 	add_program_constant("postgres_result",pgresult_program,0);
-	pgresult_program->refs++;
+	add_ref(pgresult_program);
 }
 
 #else
diff --git a/src/modules/Postgres/postgres.c b/src/modules/Postgres/postgres.c
index 77ce206445..c2e4ee098c 100644
--- a/src/modules/Postgres/postgres.c
+++ b/src/modules/Postgres/postgres.c
@@ -62,7 +62,7 @@ static void pgdebug (char * a, ...) {}
 
 struct program * postgres_program;
 
-RCSID("$Id: postgres.c,v 1.5 1998/03/02 18:57:25 grubba Exp $");
+RCSID("$Id: postgres.c,v 1.6 1998/04/20 18:53:49 grubba Exp $");
 
 #define THIS ((struct pgres_object_data *) fp->current_storage)
 
@@ -422,7 +422,7 @@ void pike_module_init (void)
 
 	postgres_program = end_program();
 	add_program_constant("postgres",postgres_program,0);
-	postgres_program->refs++;
+	add_ref(postgres_program);
 
 	add_string_constant("version",PGSQL_VERSION,0);
 
diff --git a/src/modules/Regexp/glue.c b/src/modules/Regexp/glue.c
index 187ddba521..82f1fbc35f 100644
--- a/src/modules/Regexp/glue.c
+++ b/src/modules/Regexp/glue.c
@@ -18,7 +18,7 @@
 #include "threads.h"
 #include "module_support.h"
 
-RCSID("$Id: glue.c,v 1.10 1998/03/28 14:37:54 grubba Exp $");
+RCSID("$Id: glue.c,v 1.11 1998/04/20 18:53:50 grubba Exp $");
 
 #ifdef USE_SYSTEM_REGEXP
 #include <regexp.h>
@@ -139,7 +139,7 @@ static void regexp_split(INT32 args)
   if (match) {
     int i,j;
     
-    s->refs++;
+    add_ref(s);
     pop_n_elems(args);
 
     for (i=1; i < nmatch; i++) {
@@ -160,7 +160,7 @@ static void regexp_split(INT32 args)
   if(pike_regexec(r=THIS->regexp, s->str))
   {
     int i,j;
-    s->refs++;
+    add_ref(s);
     pop_n_elems(args);
     for(j=i=1;i<NSUBEXP;i++)
     {
diff --git a/src/modules/Ssleay/ssleay.c b/src/modules/Ssleay/ssleay.c
index 5720005e98..65f19ff203 100644
--- a/src/modules/Ssleay/ssleay.c
+++ b/src/modules/Ssleay/ssleay.c
@@ -7,7 +7,7 @@
 #include "config.h"
 
 #include "global.h"
-RCSID("$Id: ssleay.c,v 1.7 1997/08/30 18:36:14 grubba Exp $");
+RCSID("$Id: ssleay.c,v 1.8 1998/04/20 18:53:51 grubba Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "stralloc.h"
@@ -202,8 +202,7 @@ static void ssleay_new(INT32 args)
     }
 #endif
   pop_n_elems(args);
-  THISOBJ->refs++;
-  push_object(THISOBJ);
+  ref_push_object(THISOBJ);
   push_object(clone_object(ssleay_connection_program, 1));
 }
 
diff --git a/src/modules/_Crypto/cbc.c b/src/modules/_Crypto/cbc.c
index fdbf61bbe3..f165be438e 100644
--- a/src/modules/_Crypto/cbc.c
+++ b/src/modules/_Crypto/cbc.c
@@ -1,5 +1,5 @@
 /*
- * $Id: cbc.c,v 1.10 1998/01/13 23:01:10 hubbe Exp $
+ * $Id: cbc.c,v 1.11 1998/04/20 18:53:54 grubba Exp $
  *
  * CBC (Cipher Block Chaining Mode) crypto module for Pike.
  *
@@ -134,8 +134,7 @@ static void f_create(INT32 args)
     if (args != 1) {
       error("Too many arguments to cbc->create()\n");
     }
-    THIS->object = sp[-args].u.object;
-    THIS->object->refs++;
+    add_ref(THIS->object = sp[-args].u.object);
   }
   pop_stack(); /* Just one element left on the stack in both cases */
 
diff --git a/src/modules/_Crypto/crypto.c b/src/modules/_Crypto/crypto.c
index 05cded80b1..1b1ea777b9 100644
--- a/src/modules/_Crypto/crypto.c
+++ b/src/modules/_Crypto/crypto.c
@@ -1,5 +1,5 @@
 /*
- * $Id: crypto.c,v 1.24 1998/01/13 23:01:11 hubbe Exp $
+ * $Id: crypto.c,v 1.25 1998/04/20 18:53:55 grubba Exp $
  *
  * A pike module for getting access to some common cryptos.
  *
@@ -237,8 +237,7 @@ static void f_create(INT32 args)
     if (args != 1) {
       error("Too many arguments to crypto->create()\n");
     }
-    THIS->object = sp[-args].u.object;
-    THIS->object->refs++;
+    add_ref(THIS->object = sp[-args].u.object);
   }
   pop_stack(); /* Just one element left on the stack in both cases */
 
@@ -435,7 +434,7 @@ static void f_unpad(INT32 args)
   if (len < 0) 
     error("crypto->unpad(): String to short to unpad\n");
   
-  str->refs++;
+  add_ref(str);
   pop_stack();
   push_string(make_shared_binary_string(str->str, len));
   free_string(str);
diff --git a/src/modules/_Crypto/md2.c b/src/modules/_Crypto/md2.c
index b570eaa987..2eb6f0b86e 100644
--- a/src/modules/_Crypto/md2.c
+++ b/src/modules/_Crypto/md2.c
@@ -1,5 +1,5 @@
 /*
- * $Id: md2.c,v 1.3 1997/03/17 03:11:16 hubbe Exp $
+ * $Id: md2.c,v 1.4 1998/04/20 18:53:56 grubba Exp $
  *
  * A pike module for getting access to some common cryptos.
  *
@@ -102,7 +102,7 @@ static void f_cast_to_string(INT32 args)
 
     PIKE_MD2->string = make_shared_binary_string((char *)PIKE_MD2->checksum,
 						 MD2_DIGEST_LENGTH);
-    PIKE_MD2->string->refs++;
+    add_ref(PIKE_MD2->string);
   }
 
   push_string(PIKE_MD2->string);
@@ -164,8 +164,7 @@ void init_md2_programs(void)
   set_init_callback(init_pike_md2);
   set_exit_callback(exit_pike_md2);
 
-  pike_md2_program = end_c_program("/precompiled/crypto/md2");
-  pike_md2_program->refs++;
+  add_ref(pike_md2_program = end_c_program("/precompiled/crypto/md2"));
 }
 
 void exit_md2(void)
diff --git a/src/modules/_Crypto/pipe.c b/src/modules/_Crypto/pipe.c
index 883fc79eed..895e5bfb22 100644
--- a/src/modules/_Crypto/pipe.c
+++ b/src/modules/_Crypto/pipe.c
@@ -1,5 +1,5 @@
 /*
- * $Id: pipe.c,v 1.11 1998/01/13 23:01:11 hubbe Exp $
+ * $Id: pipe.c,v 1.12 1998/04/20 18:53:57 grubba Exp $
  *
  * PIPE crypto module for Pike.
  *
@@ -86,8 +86,7 @@ static void f_create(INT32 args)
   MEMSET(THIS->objects, 0, args * sizeof(struct object *));
   for (i=-args; i; i++) {
     if (sp[i].type == T_OBJECT) {
-      THIS->objects[args + i] = sp[i].u.object;
-      THIS->objects[args + i]->refs++;
+      add_ref(THIS->objects[args + i] = sp[i].u.object);
     } else if (sp[i].type == T_PROGRAM) {
       THIS->objects[args + i] = clone_object(sp[i].u.program, 0);
     } else if (sp[i].type == T_ARRAY) {
@@ -206,8 +205,7 @@ static void f_set_encrypt_key(INT32 args)
     int n_args;
 
     if (sp[i].type == T_STRING) {
-      sp[i].u.string->refs++;
-      push_string(sp[i].u.string);
+      ref_push_string(sp[i].u.string);
       n_args = 1;
     } else if (sp[i].type == T_ARRAY) {
       n_args = sp[i].u.array->size;
@@ -236,8 +234,7 @@ static void f_set_decrypt_key(INT32 args)
     int n_args;
 
     if (sp[i].type == T_STRING) {
-      sp[i].u.string->refs++;
-      push_string(sp[i].u.string);
+      ref_push_string(sp[i].u.string);
       n_args = 1;
     } else if (sp[i].type == T_ARRAY) {
       n_args = sp[i].u.array->size;
diff --git a/src/modules/call_out/call_out.c b/src/modules/call_out/call_out.c
index bd95f386da..978fb7f0c0 100644
--- a/src/modules/call_out/call_out.c
+++ b/src/modules/call_out/call_out.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: call_out.c,v 1.19 1998/02/09 08:56:08 hubbe Exp $");
+RCSID("$Id: call_out.c,v 1.20 1998/04/20 18:53:58 grubba Exp $");
 #include "array.h"
 #include "dynamic_buffer.h"
 #include "object.h"
@@ -240,8 +240,7 @@ static struct array * new_call_out(int num_arg,struct svalue *argp)
 
   if(fp && fp->current_object)
   {
-    new->caller=fp->current_object;
-    new->caller->refs++;
+    add_ref(new->caller=fp->current_object);
   }else{
     new->caller=0;
   }
@@ -488,8 +487,7 @@ struct array *get_all_call_outs(void)
     if(CALL(e).caller)
     {
       ITEM(v)[1].type=T_OBJECT;
-      ITEM(v)[1].u.object=CALL(e).caller;
-      CALL(e).caller->refs++;
+      add_ref(ITEM(v)[1].u.object=CALL(e).caller);
     }else{
       ITEM(v)[1].type=T_INT;
       ITEM(v)[1].subtype=NUMBER_NUMBER;
diff --git a/src/modules/spider/spider.c b/src/modules/spider/spider.c
index 88b746a680..b8d0d6ef16 100644
--- a/src/modules/spider/spider.c
+++ b/src/modules/spider/spider.c
@@ -43,7 +43,7 @@
 #include "threads.h"
 #include "operators.h"
 
-RCSID("$Id: spider.c,v 1.66 1998/04/12 07:07:00 per Exp $");
+RCSID("$Id: spider.c,v 1.67 1998/04/20 18:54:00 grubba Exp $");
 
 #ifdef HAVE_PWD_H
 #include <pwd.h>
@@ -159,8 +159,7 @@ void f_parse_accessed_database(INT32 args)
 
   push_string(make_shared_string("\n"));
   f_divide(2);
-  arg = sp[-1].u.array;
-  arg->refs++;
+  add_ref(arg = sp[-1].u.array);
   /* The initial string is gone, but the array is there now. */
   pop_stack();
 
@@ -335,18 +334,15 @@ void f_parse_html(INT32 args)
     return;
   }
 
-  ss->refs++;
+  add_ref(ss);
 
-  single=sp[1-args].u.mapping; 
-  cont=sp[2-args].u.mapping; 
-  cont->refs++;
-  single->refs++;
+  add_ref(single=sp[1-args].u.mapping);
+  add_ref(cont=sp[2-args].u.mapping);
 
   if (args>3)
   {
     f_aggregate(args-3);
-    extra_args=sp[-1].u.array;
-    extra_args->refs++;
+    add_ref(extra_args=sp[-1].u.array);
     pop_stack();
   }
   else extra_args=NULL;
@@ -390,16 +386,13 @@ void f_parse_html_lines(INT32 args)
 
   sp[-args].type=T_INT;
 
-  single=sp[1-args].u.mapping; 
-  cont=sp[2-args].u.mapping; 
-  cont->refs++;
-  single->refs++;
-
+  add_ref(single=sp[1-args].u.mapping);
+  add_ref(cont=sp[2-args].u.mapping);
+ 
   if (args>3)
   {
     f_aggregate(args-3);
-    extra_args=sp[-1].u.array;
-    extra_args->refs++;
+    add_ref(extra_args=sp[-1].u.array);
     pop_stack();
   }
   else extra_args=NULL;
@@ -645,8 +638,7 @@ void do_html_parse(struct pike_string *ss,
 
       push_string(make_shared_binary_string((char *)s+n, j-n));
       f_lower_case(1);
-      sval2.u.string = sp[-1].u.string;
-      sval2.u.string->refs++;
+      add_ref(sval2.u.string = sp[-1].u.string);
       sval2.type=T_STRING;
       pop_stack();
 
@@ -672,7 +664,7 @@ void do_html_parse(struct pike_string *ss,
 	k=push_parsed_tag(s+j,len-j); 
 	if (extra_args)
 	{
-	  extra_args->refs++;
+	  add_ref(extra_args);
 	  push_array_items(extra_args);
 	}
 
@@ -738,7 +730,7 @@ void do_html_parse(struct pike_string *ss,
 
 	if (extra_args)
 	{
-	  extra_args->refs++;
+	  add_ref(extra_args);
 	  push_array_items(extra_args);
 	}
 
@@ -899,8 +891,7 @@ void do_html_parse_lines(struct pike_string *ss,
 
       push_string(make_shared_binary_string((char *)s+i, j-i));
       f_lower_case(1);
-      sval2.u.string = sp[-1].u.string;
-      sval2.u.string->refs++;
+      add_ref(sval2.u.string = sp[-1].u.string);
       sval2.type=T_STRING;
       pop_stack();
 
@@ -933,7 +924,7 @@ void do_html_parse_lines(struct pike_string *ss,
 	push_int(line);
 	if (extra_args)
 	{
-	  extra_args->refs++;
+	  add_ref(extra_args);
 	  push_array_items(extra_args);
 	}
 	apply_svalue(&sval1,3+(extra_args?extra_args->size:0));
@@ -975,7 +966,7 @@ void do_html_parse_lines(struct pike_string *ss,
 	push_int(line);
 	if (extra_args)
 	{
-	  extra_args->refs++;
+	  add_ref(extra_args);
 	  push_array_items(extra_args);
 	}
 	apply_svalue(&sval1,4+(extra_args?extra_args->size:0));
@@ -1125,8 +1116,7 @@ void f_mark_fd(INT32 args)
     {
       if(fd_marks[fd])
       {
-	fd_marks[fd]->refs++;
-	push_string(fd_marks[fd]);
+	ref_push_string(fd_marks[fd]);
       } else {
 	push_text("");
       }
@@ -1142,8 +1132,7 @@ void f_mark_fd(INT32 args)
     }
   }
   
-  s=sp[-args+1].u.string;
-  s->refs++;
+  add_ref(s=sp[-args+1].u.string);
   if(fd_marks[fd])
     free_string(fd_marks[fd]);
   fd_marks[fd]=s;
@@ -1182,8 +1171,7 @@ void f_fcgi_create_listen_socket(INT32 args)
 static void program_name(struct program *p)
 {
   char *f;
-  p->refs++;
-  push_program(p);
+  ref_push_program(p);
   APPLY_MASTER("program_name", 1);
   if(sp[-1].type == T_STRING)
     return;
@@ -1285,20 +1273,22 @@ void do_shuffle(void *_a)
   {
     int nread, written=0;
     nread = fd_read(a->from_fd, a->buffer, MY_MIN(BUFFER,a->len));
-    if(nread <= 0)
+    if(nread <= 0) {
       if(errno == EINTR)
 	continue;
       else
 	break;
+    }
 
     while(nread)
     {
       int nsent = fd_write(a->to_fd, a->buffer+written, nread);
-      if(nsent < 0)
+      if(nsent < 0) {
 	if(errno != EINTR)
 	  goto end;
 	else 
 	  continue;
+      }
       written += nsent;
       a->sent += nsent;
       nread -= nsent;
@@ -1362,8 +1352,8 @@ void f_shuffle(INT32 args)
   apply(a->from, "query_fd", 0);
   get_all_args("shuffle", 2, "%d%d", &a->to_fd, &a->from_fd);
 
-  a->from->refs++; 
-  a->to->refs++; 
+  add_ref(a->from);
+  add_ref(a->to); 
   
   assign_svalue_no_free(&a->cb, q);
   assign_svalue_no_free(&a->args, w);
@@ -1380,9 +1370,8 @@ void f_shuffle(INT32 args)
 
 void pike_module_init(void) 
 {
-  push_string(make_shared_string(""));
+  ref_push_string(make_shared_string(""));
   empty_string = sp[-1];
-  empty_string.u.string->refs++;
   pop_stack();
 
 
diff --git a/src/modules/spider/streamed_parser.c b/src/modules/spider/streamed_parser.c
index 7f8dc49781..28f277d9ea 100644
--- a/src/modules/spider/streamed_parser.c
+++ b/src/modules/spider/streamed_parser.c
@@ -19,7 +19,7 @@
 
 #include "streamed_parser.h"
 
-RCSID("$Id: streamed_parser.c,v 1.9 1998/03/28 13:50:37 grubba Exp $");
+RCSID("$Id: streamed_parser.c,v 1.10 1998/04/20 18:54:01 grubba Exp $");
 
 #ifdef ENABLE_STREAMED_PARSER
 
@@ -172,9 +172,9 @@ void streamed_parser_set_data( INT32 args )
 {
   get_all_args("spider.streamed_parser->set_data", args, "%m%m%m",
 	       &(DATA->start_tags), &(DATA->content_tags), &(DATA->end_tags));
-  DATA->start_tags->refs++;
-  DATA->content_tags->refs++;
-  DATA->end_tags->refs++;
+  add_ref(DATA->start_tags);
+  add_ref(DATA->content_tags);
+  add_ref(DATA->end_tags);
   pop_n_elems(args);
 }
 
diff --git a/src/multiset.c b/src/multiset.c
index a6651d08bf..5fa48f70b2 100644
--- a/src/multiset.c
+++ b/src/multiset.c
@@ -15,7 +15,7 @@
 #include "builtin_functions.h"
 #include "gc.h"
 
-RCSID("$Id: multiset.c,v 1.10 1998/03/28 15:09:34 grubba Exp $");
+RCSID("$Id: multiset.c,v 1.11 1998/04/20 18:53:19 grubba Exp $");
 
 struct multiset *first_multiset;
 
@@ -250,7 +250,7 @@ struct multiset *copy_multiset_recursively(struct multiset *l,
     if(p->pointer_a == (void *)l)
     {
       ret=(struct multiset *)p->pointer_b;
-      ret->refs++;
+      add_ref(ret);
       return ret;
     }
   }
@@ -295,7 +295,7 @@ void gc_free_all_unreferenced_multisets(void)
   {
     if(gc_do_free(l))
     {
-      l->refs++;
+      add_ref(l);
       free_svalues(ITEM(l->ind), l->ind->size, l->ind->type_field);
       l->ind->size=0;
       next=l->next;
diff --git a/src/object.h b/src/object.h
index f8dbee04e6..e9ab0ccce1 100644
--- a/src/object.h
+++ b/src/object.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: object.h,v 1.17 1998/03/28 15:12:32 grubba Exp $
+ * $Id: object.h,v 1.18 1998/04/20 18:53:20 grubba Exp $
  */
 #ifndef OBJECT_H
 #define OBJECT_H
@@ -39,7 +39,7 @@ extern struct program *master_program;
 #define GET_GLOBAL(O,I) LOW_GET_GLOBAL(O,I,ID_FROM_INT((O)->prog,I))
 #define GLOBAL_FROM_INT(I) GET_GLOBAL(fp->current_object, I)
 
-#define this_object() (fp->current_object->refs++,fp->current_object)
+#define this_object() (add_ref(fp->current_object), fp->current_object)
 
 /* Prototypes begin here */
 void setup_fake_object(void);
diff --git a/src/opcodes.c b/src/opcodes.c
index a1de7350a0..2253ce1e41 100644
--- a/src/opcodes.c
+++ b/src/opcodes.c
@@ -22,7 +22,7 @@
 #include "builtin_functions.h"
 #include "module_support.h"
 
-RCSID("$Id: opcodes.c,v 1.19 1998/04/16 01:14:16 hubbe Exp $");
+RCSID("$Id: opcodes.c,v 1.20 1998/04/20 18:53:21 grubba Exp $");
 
 void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind)
 {
@@ -243,7 +243,7 @@ void o_cast(struct pike_string *type, INT32 run_time_type)
 	  struct program *p=program_from_function(sp-1);
 	  if(p)
 	  {
-	    p->refs++;
+	    add_ref(p);
 	    pop_stack();
 	    push_program(p);
 	  }else{
@@ -271,7 +271,7 @@ void o_cast(struct pike_string *type, INT32 run_time_type)
 	  sp[-1].type=T_FUNCTION;
 	  sp[-1].subtype=i;
 	  sp[-1].u.object=fp->current_object;
-	  fp->current_object->refs++;
+	  add_ref(fp->current_object);
 	}else{
 	  sp[-1].type=T_INT;
 	  sp[-1].subtype=NUMBER_UNDEFINED;
diff --git a/src/signal_handler.c b/src/signal_handler.c
index 247205c700..8cf7d5828e 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -22,7 +22,7 @@
 #include "builtin_functions.h"
 #include <signal.h>
 
-RCSID("$Id: signal_handler.c,v 1.47 1998/04/18 06:30:21 hubbe Exp $");
+RCSID("$Id: signal_handler.c,v 1.48 1998/04/20 18:53:22 grubba Exp $");
 
 #ifdef HAVE_PASSWD_H
 # include <passwd.h>
@@ -824,7 +824,7 @@ void f_create_process(INT32 args)
       error("Failed to start process (%d).\n",GetLastError());
     }
   }
-#else /* __NT__ */
+#else /* !__NT__ */
   {
     struct svalue *stack_save=sp;
     ONERROR err;
@@ -954,7 +954,7 @@ void f_create_process(INT32 args)
 	  for(e=0;e<storage.wanted_gids_array->size;e++)
 	    if(storage.wanted_gids_array->item[e].type != T_INT)
 	      error("Invalid type for setgroups.\n");
-	  storage.wanted_gids_array->refs++;
+	  add_ref(storage.wanted_gids_array);
 	  do_initgroups=0;
 	}else{
 	  error("Invalid type for setgroups.\n");
diff --git a/src/stralloc.c b/src/stralloc.c
index 7cbf44088d..517c85f299 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -15,7 +15,7 @@
 
 #include <ctype.h>
 
-RCSID("$Id: stralloc.c,v 1.33 1998/04/17 17:50:35 hubbe Exp $");
+RCSID("$Id: stralloc.c,v 1.34 1998/04/20 18:53:23 grubba Exp $");
 
 #define BEGIN_HASH_SIZE 997
 #define MAX_AVG_LINK_LENGTH 3
@@ -235,7 +235,7 @@ struct pike_string *end_shared_string(struct pike_string *s)
   }else{
     link_pike_string(s, h);
   }
-  s->refs++;
+  add_ref(s);
 
   return s;
 }
@@ -253,7 +253,7 @@ struct pike_string * debug_make_shared_binary_string(const char *str,int len)
     link_pike_string(s, h);
   }
 
-  s->refs++;
+  add_ref(s);
 
   return s;
 }
@@ -710,7 +710,7 @@ struct pike_string *string_replace(struct pike_string *str,
 
   if(!str->len)
   {
-    str->refs++;
+    add_ref(str);
     return str;
   }
 
@@ -747,7 +747,7 @@ struct pike_string *string_replace(struct pike_string *str,
     
     if(!delimeters)
     {
-      str->refs++;
+      add_ref(str);
       return str;
     }
 
diff --git a/src/threads.c b/src/threads.c
index 1eca63737f..205b72d363 100644
--- a/src/threads.c
+++ b/src/threads.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: threads.c,v 1.68 1998/04/13 14:31:59 grubba Exp $");
+RCSID("$Id: threads.c,v 1.69 1998/04/20 18:53:24 grubba Exp $");
 
 int num_threads = 1;
 int threads_disabled = 0;
@@ -281,8 +281,7 @@ void f_all_threads(INT32 args)
       struct object *o =
 	(struct object *)(((char *)s)-((((struct object *)NULL)->storage)-
 				       ((char*)NULL)));
-      o->refs++;
-      push_object(o);
+      ref_push_object(o);
     }
   mt_unlock( & thread_table_lock );
   f_aggregate(sp-oldsp);
@@ -403,8 +402,7 @@ void f_thread_create(INT32 args)
       threads_evaluator_callback=add_to_callback(&evaluator_callbacks,
 						 check_threads, 0,0);
     }
-    push_object(arg->id);
-    arg->id->refs++;
+    ref_push_object(arg->id);
     THREADS_FPRINTF((stderr,"THREAD_CREATE -> t:%08x\n",(unsigned int)arg->id));
   } else {
     free_object(arg->id);
@@ -429,8 +427,7 @@ void f_thread_set_concurrency(INT32 args)
 void f_this_thread(INT32 args)
 {
   pop_n_elems(args);
-  push_object(thread_id);
-  thread_id->refs++;
+  ref_push_object(thread_id);
 }
 
 #define THIS_MUTEX ((struct mutex_storage *)(fp->current_storage))
@@ -563,8 +560,7 @@ void init_mutex_key_obj(struct object *o)
   THREADS_FPRINTF((stderr, "KEY k:%08x, o:%08x\n",
 		   (unsigned int)THIS_KEY, (unsigned int)thread_id));
   THIS_KEY->mut=0;
-  THIS_KEY->owner=thread_id;
-  thread_id->refs++;
+  add_ref(THIS_KEY->owner=thread_id);
   THIS_KEY->initialized=1;
 }
 
-- 
GitLab