From 3402a638b3717d456f54c1225b9219c6e78b6857 Mon Sep 17 00:00:00 2001
From: Per Hedbor <ph@opera.com>
Date: Mon, 20 May 2013 18:30:21 +0200
Subject: [PATCH] Optimized array*str when the array only contains one element.

It now simply returns the array element (if it is a string, that is).
---
 src/array.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/array.c b/src/array.c
index be6a437049..30465370fd 100644
--- a/src/array.c
+++ b/src/array.c
@@ -2427,7 +2427,7 @@ PMOD_EXPORT struct array *explode(struct pike_string *str,
     s=str->str;
     end=s+(str->len << str->size_shift);
 
-    ret=allocate_array(10);
+    ret=allocate_array(2);
     ret->size=0;
 
     mojt=compile_memsearcher(MKPCHARP_STR(del),
@@ -2507,6 +2507,8 @@ PMOD_EXPORT struct pike_string *implode(struct array *a,
   len=0;
   delims = 0;
 
+
+
   for(e=a->size, ae=a->item; e--; ae++)
     switch(TYPEOF(*ae))
     {
@@ -2529,7 +2531,14 @@ PMOD_EXPORT struct pike_string *implode(struct array *a,
     len-=del->len;
     delims--;
   }
-  
+
+  if( a->size == 1 && TYPEOF(*ITEM(a)) == PIKE_T_STRING )
+  {
+      struct pike_string * res = ITEM(a)->u.string;
+      res->refs++;
+      return res;
+  }
+
   ret=begin_wide_shared_string(len,max_shift);
   r=MKPCHARP_STR(ret);
   len = del->len;
-- 
GitLab