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