Jacek Caban : jscript: Use single string instance for strings representing NULL BSTR instead of a flag .

Alexandre Julliard julliard at winehq.org
Wed Apr 24 13:45:58 CDT 2013


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 24 11:32:33 2013 +0200

jscript: Use single string instance for strings representing NULL BSTR instead of a flag.

---

 dlls/jscript/jsstr.c   |   27 ++++++++++++++++++++++-----
 dlls/jscript/jsstr.h   |    7 ++++---
 dlls/jscript/jsutils.c |   16 +++++++++-------
 3 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/dlls/jscript/jsstr.c b/dlls/jscript/jsstr.c
index 0d0eb0f..add0195 100644
--- a/dlls/jscript/jsstr.c
+++ b/dlls/jscript/jsstr.c
@@ -277,7 +277,7 @@ const WCHAR *jsstr_rope_flatten(jsstr_rope_t *str)
     return jsstr_as_heap(&str->str)->buf = buf;
 }
 
-static jsstr_t *empty_str, *nan_str, *undefined_str;
+static jsstr_t *empty_str, *nan_str, *undefined_str, *null_bstr_str;
 
 jsstr_t *jsstr_nan(void)
 {
@@ -294,6 +294,16 @@ jsstr_t *jsstr_undefined(void)
     return jsstr_addref(undefined_str);
 }
 
+jsstr_t *jsstr_null_bstr(void)
+{
+    return jsstr_addref(null_bstr_str);
+}
+
+BOOL is_null_bstr(jsstr_t *str)
+{
+    return str == null_bstr_str;
+}
+
 BOOL init_strings(void)
 {
     static const WCHAR NaNW[] = { 'N','a','N',0 };
@@ -305,12 +315,19 @@ BOOL init_strings(void)
         return FALSE;
     if(!(undefined_str = jsstr_alloc(undefinedW)))
         return FALSE;
-    return TRUE;
+    if(!jsstr_alloc_buf(0, &null_bstr_str))
+        return FALSE;
+     return TRUE;
 }
 
 void free_strings(void)
 {
-    jsstr_release(empty_str);
-    jsstr_release(nan_str);
-    jsstr_release(undefined_str);
+    if(empty_str)
+        jsstr_release(empty_str);
+    if(nan_str)
+        jsstr_release(nan_str);
+    if(undefined_str)
+        jsstr_release(undefined_str);
+    if(null_bstr_str)
+        jsstr_release(null_bstr_str);
 }
diff --git a/dlls/jscript/jsstr.h b/dlls/jscript/jsstr.h
index 727b2d0..2ad03f1 100644
--- a/dlls/jscript/jsstr.h
+++ b/dlls/jscript/jsstr.h
@@ -17,7 +17,7 @@
  */
 
 /*
- * This is a common header for all string representations. The exact layout of the string
+ * jsstr_t is a common header for all string representations. The exact layout of the string
  * representation may be:
  *
  * - inline string - string bytes directly follow string headers.
@@ -42,8 +42,6 @@ struct _jsstr_t {
 #define JSSTR_MAX_LENGTH (1 << (32-JSSTR_LENGTH_SHIFT))
 #define JSSTR_FLAGS_MASK ((1 << JSSTR_LENGTH_SHIFT)-1)
 
-#define JSSTR_FLAG_NULLBSTR 4
-
 #define JSSTR_FLAG_LBIT     1
 #define JSSTR_FLAG_FLAT     2
 #define JSSTR_FLAG_TAG_MASK 3
@@ -187,6 +185,9 @@ jsstr_t *jsstr_nan(void) DECLSPEC_HIDDEN;
 jsstr_t *jsstr_empty(void) DECLSPEC_HIDDEN;
 jsstr_t *jsstr_undefined(void) DECLSPEC_HIDDEN;
 
+jsstr_t *jsstr_null_bstr(void) DECLSPEC_HIDDEN;
+BOOL is_null_bstr(jsstr_t*) DECLSPEC_HIDDEN;
+
 BOOL init_strings(void) DECLSPEC_HIDDEN;
 void free_strings(void) DECLSPEC_HIDDEN;
 
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 60ca474..87bad26 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -294,11 +294,13 @@ HRESULT variant_to_jsval(VARIANT *var, jsval_t *r)
     case VT_BSTR: {
         jsstr_t *str;
 
-        str = jsstr_alloc_len(V_BSTR(var), SysStringLen(V_BSTR(var)));
-        if(!str)
-            return E_OUTOFMEMORY;
-        if(!V_BSTR(var))
-            str->length_flags |= JSSTR_FLAG_NULLBSTR;
+        if(V_BSTR(var)) {
+            str = jsstr_alloc_len(V_BSTR(var), SysStringLen(V_BSTR(var)));
+            if(!str)
+                return E_OUTOFMEMORY;
+        }else {
+            str = jsstr_null_bstr();
+        }
 
         *r = jsval_string(str);
         return S_OK;
@@ -351,7 +353,7 @@ HRESULT jsval_to_variant(jsval_t val, VARIANT *retv)
         jsstr_t *str = get_string(val);
 
         V_VT(retv) = VT_BSTR;
-        if(str->length_flags & JSSTR_FLAG_NULLBSTR) {
+        if(is_null_bstr(str)) {
             V_BSTR(retv) = NULL;
         }else {
             V_BSTR(retv) = SysAllocStringLen(NULL, jsstr_length(str));
@@ -913,7 +915,7 @@ HRESULT variant_change_type(script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTY
         if(FAILED(hres))
             break;
 
-        if(str->length_flags & JSSTR_FLAG_NULLBSTR) {
+        if(is_null_bstr(str)) {
             V_BSTR(dst) = NULL;
             break;
         }




More information about the wine-cvs mailing list