diff --git a/src/array.h b/src/array.h
index fa5e614b4ccb99c99f813fe6d5fadbd9fab7a113..a0c160f49c7d6a5d771cfcbd80cbee9289d31807 100644
--- a/src/array.h
+++ b/src/array.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: array.h,v 1.23 2000/08/03 17:55:50 grubba Exp $
+ * $Id: array.h,v 1.24 2000/08/09 12:49:27 grubba Exp $
  */
 #ifndef ARRAY_H
 #define ARRAY_H
@@ -14,7 +14,7 @@
 
 struct array
 {
-  ptrdiff_t refs;		/* Reference count */
+  INT32 refs;		/* Reference count */
 #ifdef PIKE_SECURITY
   struct object *prot;
 #endif
diff --git a/src/constants.h b/src/constants.h
index 17c606d653dcdf92cd0424375e0d0ec2bb9e2271..5ce7af2ac586736cc575e90f95c3f4cb686e289c 100644
--- a/src/constants.h
+++ b/src/constants.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: constants.h,v 1.12 2000/08/03 17:55:50 grubba Exp $
+ * $Id: constants.h,v 1.13 2000/08/09 12:49:27 grubba Exp $
  */
 #ifndef ADD_EFUN_H
 #define ADD_EFUN_H
@@ -20,7 +20,7 @@ typedef node *(*optimize_fun)(node *n);
 
 struct callable
 {
-  ptrdiff_t refs;
+  INT32 refs;
 #ifdef PIKE_SECURITY
   struct object *prot;
 #endif
diff --git a/src/gc.h b/src/gc.h
index 8fc7e4f53bf36a019b51a56958b7edbc5852d898..c56bab45591ceb5e31d41f5b58ae9e2e0c66d02b 100644
--- a/src/gc.h
+++ b/src/gc.h
@@ -1,5 +1,5 @@
 /*
- * $Id: gc.h,v 1.58 2000/08/03 17:55:50 grubba Exp $
+ * $Id: gc.h,v 1.59 2000/08/09 12:49:27 grubba Exp $
  */
 #ifndef GC_H
 #define GC_H
@@ -68,11 +68,11 @@ struct marker
   struct marker *next;
   struct gc_frame *frame;	/* Pointer into the cycle check stack. */
   void *data;
-  ptrdiff_t refs;		/* Internal references. */
-  ptrdiff_t weak_refs;		/* Weak (implying internal) references. */
+  INT32 refs;			/* Internal references. */
+  INT32 weak_refs;		/* Weak (implying internal) references. */
 #ifdef PIKE_DEBUG
-  ptrdiff_t xrefs;		/* Known external references. */
-  ptrdiff_t saved_refs;		/* Object refcount during check pass. */
+  INT32 xrefs;			/* Known external references. */
+  INT32 saved_refs;		/* Object refcount during check pass. */
 #endif
   unsigned INT16 flags;
 };
diff --git a/src/interpret.h b/src/interpret.h
index adf3bc4c3bfa6a870651d17b5fa1b75f91bf3a87..48c50a58d692d58620f40ea857bc6003119aac75 100644
--- a/src/interpret.h
+++ b/src/interpret.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: interpret.h,v 1.62 2000/08/09 10:27:41 grubba Exp $
+ * $Id: interpret.h,v 1.63 2000/08/09 12:49:27 grubba Exp $
  */
 #ifndef INTERPRET_H
 #define INTERPRET_H
@@ -47,7 +47,7 @@ struct Pike_interpreter {
 #endif
 struct pike_frame
 {
-  ptrdiff_t refs; /* must be first */
+  INT32 refs; /* must be first */
   INT32 args;
   unsigned INT16 fun;
   INT16 num_locals;
diff --git a/src/mapping.h b/src/mapping.h
index 023b7df019df39a1ab39d354bd5cbb6a427b6509..a148d51e709866129335d8f39a0264d1301f5b89 100644
--- a/src/mapping.h
+++ b/src/mapping.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: mapping.h,v 1.29 2000/08/03 17:55:50 grubba Exp $
+ * $Id: mapping.h,v 1.30 2000/08/09 12:49:28 grubba Exp $
  */
 #ifndef MAPPING_H
 #define MAPPING_H
@@ -24,7 +24,7 @@ struct keypair
 
 struct mapping_data
 {
-  ptrdiff_t refs;
+  INT32 refs;
   INT32 valrefs; /* lock values too */
   INT32 hardlinks;
   INT32 size, hashsize;
@@ -37,7 +37,7 @@ struct mapping_data
 
 struct mapping
 {
-  ptrdiff_t refs;
+  INT32 refs;
 #ifdef PIKE_SECURITY
   struct object *prot;
 #endif
diff --git a/src/multiset.h b/src/multiset.h
index 62f2aa63e17808796f654ba43a6ceabd1851f8f1..0ce129a53cdd9bc2d720621e7776582b6f06c783 100644
--- a/src/multiset.h
+++ b/src/multiset.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: multiset.h,v 1.14 2000/08/03 17:55:50 grubba Exp $
+ * $Id: multiset.h,v 1.15 2000/08/09 12:49:28 grubba Exp $
  */
 #ifndef MULTISET_H
 #define MULTISET_H
@@ -14,7 +14,7 @@
 
 struct multiset
 {
-  ptrdiff_t refs;
+  INT32 refs;
 #ifdef PIKE_SECURITY
   struct object *prot;
 #endif
diff --git a/src/object.h b/src/object.h
index d403054c35675c6c142cddc91b95b568a94c9265..f17354f9508bf1b74b0baba6f70685d98c32588e 100644
--- a/src/object.h
+++ b/src/object.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: object.h,v 1.51 2000/08/03 17:55:50 grubba Exp $
+ * $Id: object.h,v 1.52 2000/08/09 12:49:28 grubba Exp $
  */
 #ifndef OBJECT_H
 #define OBJECT_H
@@ -20,7 +20,7 @@
 #endif
 struct object
 {
-  ptrdiff_t refs;                    /* Reference count, must be first. */
+  INT32 refs;                    /* Reference count, must be first. */
 #ifdef PIKE_SECURITY
   struct object *prot;
 #endif
diff --git a/src/pike_types.h b/src/pike_types.h
index fb839b0f639330845cecaba05e132202af3b93bd..fb7a27a7c9f702a0a93018278bddda501f9c0dbf 100644
--- a/src/pike_types.h
+++ b/src/pike_types.h
@@ -5,16 +5,39 @@
 \*/
 
 /*
- * $Id: pike_types.h,v 1.40 2000/07/29 06:31:06 hubbe Exp $
+ * $Id: pike_types.h,v 1.41 2000/08/09 12:49:28 grubba Exp $
  */
 #ifndef PIKE_TYPES_H
 #define PIKE_TYPES_H
 
 #include "svalue.h"
 
+/* Also used in struct node_identifier */
+union node_data
+{
+  struct
+  {
+    int number;
+    struct program *prog;
+  } id;
+  struct svalue sval;
+  struct
+  {
+    struct node_s *a, *b;
+  } node;
+  struct
+  {
+    struct node_identifier *a, *b;
+  } node_id;
+  struct
+  {
+    int a, b;
+  } integer;
+};
+
 struct node_s
 {
-#ifdef SHARED_NODES
+#if defined(SHARED_NODES)
   unsigned INT32 refs;
   unsigned INT32 hash;
   struct node_s *next;
@@ -30,25 +53,22 @@ struct node_s
   unsigned INT16 tree_info;
   /* The stuff from this point on is hashed. */
   unsigned INT16 token;
-  union 
-  {
-    struct
-    {
-      int number;
-      struct program *prog;
-    } id;
-    struct svalue sval;
-    struct
-    {
-      struct node_s *a,*b;
-    } node;
-    struct
-    {
-      int a,b;
-    } integer;
-  } u;
+  union node_data u;
 };
 
+#ifdef SHARED_NODES_MK2
+
+struct node_identifier
+{
+  ptrdiff_t refs;
+  struct node_identifier *next;
+  unsigned INT32 hash;
+  INT16 token;
+  union node_data u;
+};
+
+#endif /* SHARED_NODES_MK2 */
+
 #ifndef STRUCT_NODE_S_DECLARED
 #define STRUCT_NODE_S_DECLARED
 #endif
@@ -108,7 +128,7 @@ extern struct pike_string *weak_type_string;
 
 #define type_stack_mark() do {				\
   if(Pike_compiler->pike_type_mark_stackp >= pike_type_mark_stack + NELEM(pike_type_mark_stack))	\
-    yyerror("Type mark stack overflow.");		\
+    fatal("Type mark stack overflow.");		\
   else {						\
     *Pike_compiler->pike_type_mark_stackp=Pike_compiler->type_stackp;				\
     Pike_compiler->pike_type_mark_stackp++;					\
diff --git a/src/program.h b/src/program.h
index 436b5599c900e27f164bb94509cc1b751aa0391b..98626a51bed2b5834909147aba54acbfb5479ab3 100644
--- a/src/program.h
+++ b/src/program.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: program.h,v 1.98 2000/08/03 17:55:50 grubba Exp $
+ * $Id: program.h,v 1.99 2000/08/09 12:49:28 grubba Exp $
  */
 #ifndef PROGRAM_H
 #define PROGRAM_H
@@ -255,7 +255,7 @@ struct pike_trampoline
 
 struct program
 {
-  ptrdiff_t refs;
+  INT32 refs;
 #ifdef PIKE_SECURITY
   struct object *prot;
 #endif
diff --git a/src/stralloc.h b/src/stralloc.h
index b908572a630421ea60c5ec514aafa7f27a82cc55..7ff8ad4192639d4b2a149b75849b5f892ca9535d 100644
--- a/src/stralloc.h
+++ b/src/stralloc.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: stralloc.h,v 1.47 2000/08/08 19:21:55 grubba Exp $
+ * $Id: stralloc.h,v 1.48 2000/08/09 12:49:28 grubba Exp $
  */
 #ifndef STRALLOC_H
 #define STRALLOC_H
@@ -19,7 +19,7 @@
 #endif
 struct pike_string
 {
-  ptrdiff_t refs;
+  INT32 refs;
   INT32 size_shift; /* 30 bit waste, but good for alignment... */
   ptrdiff_t len;
   size_t hval;