diff --git a/src/array.c b/src/array.c
index ea17ff8cbaec1d1c673c43d20e568cf537451d85..3eb0512864a12b48760c29d3ecd36f73e7cef8a0 100644
--- a/src/array.c
+++ b/src/array.c
@@ -19,7 +19,7 @@
 #include "gc.h"
 #include "main.h"
 
-RCSID("$Id: array.c,v 1.33 1998/04/17 17:12:58 hubbe Exp $");
+RCSID("$Id: array.c,v 1.34 1998/04/23 23:58:52 hubbe Exp $");
 
 struct array empty_array=
 {
@@ -1312,6 +1312,10 @@ struct array *explode(struct pike_string *str,
   struct array *ret;
   char *s, *end, *tmp;
 
+  if(!str->len)
+  {
+    return allocate_array_no_init(0,0);
+  }
   if(!del->len)
   {
     ret=allocate_array_no_init(str->len,0);
@@ -1661,8 +1665,10 @@ struct array *explode_array(struct array *a, struct array *b)
   struct array *tmp;
 
   q=start=0;
-  push_array(a); /* Save us from destructive slice_arrays */
-  add_ref(a);
+  if(!a->size)
+  {
+    return allocate_array_no_init(0,0);
+  }
   if(b->size)
   {
     for(e=0;e<=a->size - b->size;e++)
@@ -1675,23 +1681,22 @@ struct array *explode_array(struct array *a, struct array *b)
       if(d==b->size)
       {
 	check_stack(1);
-	push_array(slice_array(a, start, e));
+	push_array(friendly_slice_array(a, start, e));
 	q++;
 	e+=b->size-1;
 	start=e+1;
       }
     }
     check_stack(1);
-    push_array(slice_array(a, start, a->size));
+    push_array(friendly_slice_array(a, start, a->size));
     q++;
   }else{
     check_stack(a->size);
-    for(e=0;e<a->size;e++) push_array(slice_array(a, e, e+1));
+    for(e=0;e<a->size;e++) push_array(friendly_slice_array(a, e, e+1));
     q=a->size;
   }
   tmp=aggregate_array(q);
   if(tmp->size) tmp->type_field=BIT_ARRAY;
-  pop_stack();
   return tmp;
 }