diff --git a/src/array.c b/src/array.c
index b1cf7c100f511b9309dc7bb48eea1014fe5cdf76..4cbf089a8d2baa893de37bf07d4c83d1b6565462 100644
--- a/src/array.c
+++ b/src/array.c
@@ -441,6 +441,27 @@ struct array *slice_array(struct array *v,INT32 start,INT32 end)
   return a;
 }
 
+/*
+ * Slice a pice of an array (nondestructively)
+ * return an array consisting of v[start..end-1]
+ */
+struct array *friendly_slice_array(struct array *v,INT32 start,INT32 end)
+{
+  struct array *a;
+
+#ifdef DEBUG
+  if(start > end || end>v->size || start<0)
+    fatal("Illegal arguments to slice_array()\n");
+#endif
+
+  a=allocate_array_no_init(end-start,0);
+  a->type_field = v->type_field;
+
+  assign_svalues_no_free(ITEM(a), ITEM(v)+start, end-start, v->type_field);
+
+  return a;
+}
+
 /*
  * Copy an array
  */
diff --git a/src/array.h b/src/array.h
index a9f69a6a64d6f8511ebb813be79351d73bffb9a9..107f97495449c785b44fc92fe455cd5bb98a1902 100644
--- a/src/array.h
+++ b/src/array.h
@@ -76,6 +76,7 @@ struct array *array_shrink(struct array *v,INT32 size);
 struct array *array_remove(struct array *v,INT32 index);
 INT32 array_search(struct array *v, struct svalue *s,INT32 start);
 struct array *slice_array(struct array *v,INT32 start,INT32 end);
+struct array *friendly_slice_array(struct array *v,INT32 start,INT32 end);
 struct array *copy_array(struct array *v);
 void check_array_for_destruct(struct array *v);
 INT32 array_find_destructed_object(struct array *v);