Jacek Caban : jscript: Added jsstr_substr helper and use it in String object implementation.

Alexandre Julliard julliard at winehq.org
Mon Mar 4 13:23:38 CST 2013


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar  4 10:57:14 2013 +0100

jscript: Added jsstr_substr helper and use it in String object implementation.

---

 dlls/jscript/jsstr.h  |    5 +++++
 dlls/jscript/string.c |   27 +++++++++++++--------------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/dlls/jscript/jsstr.h b/dlls/jscript/jsstr.h
index 8ac7410..8883dcb 100644
--- a/dlls/jscript/jsstr.h
+++ b/dlls/jscript/jsstr.h
@@ -59,6 +59,11 @@ static inline BOOL jsstr_eq(jsstr_t *str1, jsstr_t *str2)
     return len == jsstr_length(str2) && !memcmp(str1->str, str2->str, len*sizeof(WCHAR));
 }
 
+static inline jsstr_t *jsstr_substr(jsstr_t *str, unsigned off, unsigned len)
+{
+    return jsstr_alloc_len(str->str+off, len);
+}
+
 int jsstr_cmp(jsstr_t*,jsstr_t*) DECLSPEC_HIDDEN;
 jsstr_t *jsstr_concat(jsstr_t*,jsstr_t*) DECLSPEC_HIDDEN;
 
diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c
index e607754..70be13a 100644
--- a/dlls/jscript/string.c
+++ b/dlls/jscript/string.c
@@ -276,7 +276,7 @@ static HRESULT String_charAt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
     }
 
     if(0 <= pos && pos < jsstr_length(str)) {
-        ret = jsstr_alloc_len(str->str+pos, 1);
+        ret = jsstr_substr(str, pos, 1);
         if(!ret)
             return E_OUTOFMEMORY;
     }else {
@@ -649,10 +649,10 @@ static HRESULT rep_call(script_ctx_t *ctx, jsdisp_t *func,
 
     if(SUCCEEDED(hres)) {
         for(i=0; i < match->paren_count; i++) {
-            if(match->parens[i].index == -1)
-                tmp_str = jsstr_empty();
+            if(match->parens[i].index != -1)
+                tmp_str = jsstr_substr(str, match->parens[i].index, match->parens[i].length);
             else
-                tmp_str = jsstr_alloc_len(str->str+match->parens[i].index, match->parens[i].length);
+                tmp_str = jsstr_empty();
             if(!tmp_str) {
                hres = E_OUTOFMEMORY;
                break;
@@ -1016,7 +1016,7 @@ static HRESULT String_slice(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsi
         end = start;
 
     if(r) {
-        jsstr_t *retstr = jsstr_alloc_len(str->str+start, end-start);
+        jsstr_t *retstr = jsstr_substr(str, start, end-start);
         if(!retstr) {
             jsstr_release(str);
             return E_OUTOFMEMORY;
@@ -1225,15 +1225,14 @@ static HRESULT String_substring(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
     }
 
     if(r) {
-        jsstr_t *ret = jsstr_alloc_len(str->str+start, end-start);
-        if(!ret) {
-            jsstr_release(str);
-            return E_OUTOFMEMORY;
-        }
-        *r = jsval_string(ret);
+        jsstr_t *ret = jsstr_substr(str, start, end-start);
+        if(ret)
+            *r = jsval_string(ret);
+        else
+            hres = E_OUTOFMEMORY;
     }
     jsstr_release(str);
-    return S_OK;
+    return hres;
 }
 
 /* ECMA-262 3rd Edition    B.2.3 */
@@ -1280,7 +1279,7 @@ static HRESULT String_substr(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
 
     hres = S_OK;
     if(r) {
-        jsstr_t *ret = jsstr_alloc_len(str->str+start, len);
+        jsstr_t *ret = jsstr_substr(str, start, len);
         if(ret)
             *r = jsval_string(ret);
         else
@@ -1426,7 +1425,7 @@ static HRESULT String_idx_get(jsdisp_t *jsdisp, unsigned idx, jsval_t *r)
 
     TRACE("%p[%u] = %s\n", string, idx, debugstr_wn(string->str->str+idx, 1));
 
-    ret = jsstr_alloc_len(string->str->str+idx, 1);
+    ret = jsstr_substr(string->str, idx, 1);
     if(!ret)
         return E_OUTOFMEMORY;
 




More information about the wine-cvs mailing list