Jacek Caban : jscript: Always use jsval-based to_boolean.

Alexandre Julliard julliard at winehq.org
Mon Sep 17 14:06:34 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 17 15:18:03 2012 +0200

jscript: Always use jsval-based to_boolean.

---

 dlls/jscript/bool.c    |    2 +-
 dlls/jscript/engine.c  |    8 ++--
 dlls/jscript/jscript.h |    3 +-
 dlls/jscript/jsutils.c |   84 +++++++++++++++++------------------------------
 4 files changed, 37 insertions(+), 60 deletions(-)

diff --git a/dlls/jscript/bool.c b/dlls/jscript/bool.c
index f8b4f84..9675965 100644
--- a/dlls/jscript/bool.c
+++ b/dlls/jscript/bool.c
@@ -128,7 +128,7 @@ static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
     HRESULT hres;
 
     if(argc) {
-        hres = to_boolean_jsval(argv[0], &value);
+        hres = to_boolean(argv[0], &value);
         if(FAILED(hres))
             return hres;
     }
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 8595c52..1ffb3d4 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -1212,7 +1212,7 @@ static HRESULT interp_cnd_nz(exec_ctx_t *ctx)
 
     TRACE("\n");
 
-    hres = to_boolean_jsval(stack_top(ctx), &b);
+    hres = to_boolean(stack_top(ctx), &b);
     if(FAILED(hres))
         return hres;
 
@@ -1234,7 +1234,7 @@ static HRESULT interp_cnd_z(exec_ctx_t *ctx)
 
     TRACE("\n");
 
-    hres = to_boolean_jsval(stack_top(ctx), &b);
+    hres = to_boolean(stack_top(ctx), &b);
     if(FAILED(hres))
         return hres;
 
@@ -2185,7 +2185,7 @@ static HRESULT interp_neg(exec_ctx_t *ctx)
     TRACE("\n");
 
     v = stack_pop(ctx);
-    hres = to_boolean_jsval(v, &b);
+    hres = to_boolean(v, &b);
     jsval_release(v);
     if(FAILED(hres))
         return hres;
@@ -2325,7 +2325,7 @@ static HRESULT interp_jmp_z(exec_ctx_t *ctx)
     TRACE("\n");
 
     v = stack_pop(ctx);
-    hres = to_boolean_jsval(v, &b);
+    hres = to_boolean(v, &b);
     jsval_release(v);
     if(FAILED(hres))
         return hres;
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 651b49c..f9820bc 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -255,8 +255,7 @@ typedef enum {
 } hint_t;
 
 HRESULT to_primitive(script_ctx_t*,jsval_t,jsexcept_t*,jsval_t*, hint_t) DECLSPEC_HIDDEN;
-HRESULT to_boolean(VARIANT*,VARIANT_BOOL*) DECLSPEC_HIDDEN;
-HRESULT to_boolean_jsval(jsval_t,BOOL*) DECLSPEC_HIDDEN;
+HRESULT to_boolean(jsval_t,BOOL*) DECLSPEC_HIDDEN;
 HRESULT to_number(script_ctx_t*,VARIANT*,jsexcept_t*,double*) DECLSPEC_HIDDEN;
 HRESULT to_number_jsval(script_ctx_t*,jsval_t,jsexcept_t*,double*) DECLSPEC_HIDDEN;
 HRESULT to_integer(script_ctx_t*,jsval_t,jsexcept_t*,double*) DECLSPEC_HIDDEN;
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 3a96a51..b5c3632 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -437,60 +437,32 @@ HRESULT to_primitive(script_ctx_t *ctx, jsval_t val, jsexcept_t *ei, jsval_t *re
 }
 
 /* ECMA-262 3rd Edition    9.2 */
-HRESULT to_boolean(VARIANT *v, VARIANT_BOOL *b)
+HRESULT to_boolean(jsval_t val, BOOL *ret)
 {
-    switch(V_VT(v)) {
-    case VT_EMPTY:
-    case VT_NULL:
-        *b = VARIANT_FALSE;
-        break;
-    case VT_I4:
-        *b = V_I4(v) ? VARIANT_TRUE : VARIANT_FALSE;
-        break;
-    case VT_R8:
-        if(isnan(V_R8(v))) *b = VARIANT_FALSE;
-        else *b = V_R8(v) ? VARIANT_TRUE : VARIANT_FALSE;
-        break;
-    case VT_BSTR:
-        *b = V_BSTR(v) && *V_BSTR(v) ? VARIANT_TRUE : VARIANT_FALSE;
-        break;
-    case VT_DISPATCH:
-        *b = V_DISPATCH(v) ? VARIANT_TRUE : VARIANT_FALSE;
-        break;
-    case VT_BOOL:
-        *b = V_BOOL(v);
-        break;
-    default:
-        FIXME("unimplemented for vt %d\n", V_VT(v));
-        return E_NOTIMPL;
-    }
-
-    return S_OK;
-}
-
-/* ECMA-262 3rd Edition    9.2 */
-HRESULT to_boolean_jsval(jsval_t v, BOOL *ret)
-{
-    VARIANT_BOOL b;
-    VARIANT var;
-    HRESULT hres;
-
-    if(v.type == JSV_BOOL) {
-        *ret = v.u.b;
+    switch(val.type) {
+    case JSV_UNDEFINED:
+    case JSV_NULL:
+        *ret = VARIANT_FALSE;
+        return S_OK;
+    case JSV_OBJECT:
+        *ret = get_object(val) != NULL;
+        return S_OK;
+    case JSV_STRING:
+        *ret = get_string(val) && *get_string(val);
         return S_OK;
+    case JSV_NUMBER:
+        *ret = !isnan(get_number(val)) && get_number(val);
+        return S_OK;
+    case JSV_BOOL:
+        *ret = get_bool(val);
+        return S_OK;
+    case JSV_VARIANT:
+        FIXME("unimplemented for variant %s\n", debugstr_variant(get_variant(val)));
+        return E_NOTIMPL;
     }
 
-    hres = jsval_to_variant(v, &var);
-    if(FAILED(hres))
-        return hres;
-
-    hres = to_boolean(&var, &b);
-    VariantClear(&var);
-    if(FAILED(hres))
-        return hres;
-
-    *ret = !!b;
-    return S_OK;
+    assert(0);
+    return E_FAIL;
 }
 
 static int hex_to_int(WCHAR c)
@@ -986,11 +958,17 @@ HRESULT variant_change_type(script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTY
         break;
     }
     case VT_BOOL: {
-        VARIANT_BOOL b;
+        jsval_t val;
+        BOOL b;
+
+        hres = variant_to_jsval(src, &val);
+        if(FAILED(hres))
+            return hres;
 
-        hres = to_boolean(src, &b);
+        hres = to_boolean(val, &b);
+        jsval_release(val);
         if(SUCCEEDED(hres))
-            V_BOOL(dst) = b;
+            V_BOOL(dst) = b ? VARIANT_TRUE : VARIANT_FALSE;
         break;
     }
     case VT_BSTR: {




More information about the wine-cvs mailing list