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