Jacek Caban : jscript: Optimize String.concat implementation.

Alexandre Julliard julliard at winehq.org
Thu Apr 25 14:25:18 CDT 2013


Module: wine
Branch: master
Commit: b46ace51f8605180e37434da1005770bafde459a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b46ace51f8605180e37434da1005770bafde459a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Apr 25 15:23:48 2013 +0200

jscript: Optimize String.concat implementation.

---

 dlls/jscript/string.c |   89 ++++++++++++++++++++++++++++++++----------------
 1 files changed, 59 insertions(+), 30 deletions(-)

diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index bf635a8..8ef1656 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -377,51 +377,80 @@ static HRESULT String_charCodeAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
 static HRESULT String_concat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
         jsval_t *r)
 {
-    unsigned len = 0, i, str_cnt;
-    jsstr_t **strs, *ret = NULL;
-    WCHAR *ptr;
+    jsstr_t *ret, *str;
     HRESULT hres;
 
     TRACE("\n");
 
-    str_cnt = argc+1;
-    strs = heap_alloc_zero(str_cnt * sizeof(*strs));
-    if(!strs)
-        return E_OUTOFMEMORY;
+    hres = get_string_val(ctx, jsthis, &str);
+    if(FAILED(hres))
+        return hres;
 
-    hres = to_string(ctx, jsval_disp(jsthis->u.disp), strs);
-    if(SUCCEEDED(hres)) {
+    switch(argc) {
+    case 0:
+        ret = str;
+        break;
+    case 1: {
+        jsstr_t *arg_str;
+
+        hres = to_string(ctx, argv[0], &arg_str);
+        if(FAILED(hres)) {
+            jsstr_release(str);
+            return hres;
+        }
+
+        ret = jsstr_concat(str, arg_str);
+        jsstr_release(str);
+        if(!ret)
+            return E_OUTOFMEMORY;
+        break;
+    }
+    default: {
+        const unsigned str_cnt = argc+1;
+        unsigned len = 0, i;
+        jsstr_t **strs;
+        WCHAR *ptr;
+
+        strs = heap_alloc_zero(str_cnt * sizeof(*strs));
+        if(!strs) {
+            jsstr_release(str);
+            return E_OUTOFMEMORY;
+        }
+
+        strs[0] = str;
         for(i=0; i < argc; i++) {
             hres = to_string(ctx, argv[i], strs+i+1);
             if(FAILED(hres))
                 break;
         }
-    }
 
-    if(SUCCEEDED(hres)) {
-        for(i=0; i < str_cnt; i++) {
-            len += jsstr_length(strs[i]);
-            if(len > JSSTR_MAX_LENGTH) {
-                hres = E_OUTOFMEMORY;
-                break;
+        if(SUCCEEDED(hres)) {
+            for(i=0; i < str_cnt; i++) {
+                len += jsstr_length(strs[i]);
+                if(len > JSSTR_MAX_LENGTH) {
+                    hres = E_OUTOFMEMORY;
+                    break;
+                }
             }
-        }
 
-        ptr = jsstr_alloc_buf(len, &ret);
-        if(ptr) {
-            for(i=0; i < str_cnt; i++)
-                ptr += jsstr_flush(strs[i], ptr);
-        }else {
-            hres = E_OUTOFMEMORY;
+            if(SUCCEEDED(hres)) {
+                ptr = jsstr_alloc_buf(len, &ret);
+                if(ptr) {
+                    for(i=0; i < str_cnt; i++)
+                        ptr += jsstr_flush(strs[i], ptr);
+                }else {
+                    hres = E_OUTOFMEMORY;
+                }
+            }
         }
-    }
-
-    for(i=0; i < str_cnt; i++)
-        jsstr_release(strs[i]);
-    heap_free(strs);
 
-    if(FAILED(hres))
-        return hres;
+        while(i--)
+            jsstr_release(strs[i]);
+        heap_free(strs);
+        if(FAILED(hres))
+            return hres;
+    }
+    }
 
     if(r)
         *r = jsval_string(ret);




More information about the wine-cvs mailing list