diff --git a/src/array.c b/src/array.c
index 202c61c614824235435f02b554a12769af8924f9..82974c72d38fbffc17777378803645c5751ae7fb 100644
--- a/src/array.c
+++ b/src/array.c
@@ -1268,21 +1268,34 @@ struct array *explode(struct pike_string *str,
     
     s=str->str;
     end=s+str->len;
-    e=0;
+
+    ret=allocate_array(10);
+    ret->size=0;
     
     init_memsearch(&searcher, del->str, del->len, str->len);
     
     while((tmp=memory_search(&searcher, s, end-s)))
     {
-      check_stack(1);
-      push_string(make_shared_binary_string(s, tmp-s));
+      if(ret->size == ret->malloced_size)
+      {
+	e=ret->size;
+	ret=resize_array(ret, ret->size * 2);
+	ret->size=0;
+      }
+
+      ITEM(ret)[ret->size].u.string=make_shared_binary_string(s, tmp-s);
+      ITEM(ret)[ret->size].type=T_STRING;
+      ret->size++;
+
       s=tmp+del->len;
-      e++;
     }
-    check_stack(1);
-    push_string(make_shared_binary_string(s, end-s));
-    e++;
-    ret=aggregate_array(e);
+
+    if(ret->size == ret->malloced_size)
+      ret=resize_array(ret, ret->size * 2);
+
+    ITEM(ret)[ret->size].u.string=make_shared_binary_string(s, end-s);
+    ITEM(ret)[ret->size].type=T_STRING;
+    ret->size++;
   }
   ret->type_field=BIT_STRING;
   return ret;