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