Jacek Caban : jscript: Properly handle NULL bstr in str_to_number.

Alexandre Julliard julliard at winehq.org
Wed Mar 28 12:47:10 CDT 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Mar 28 15:04:28 2012 +0200

jscript: Properly handle NULL bstr in str_to_number.

---

 dlls/jscript/jsutils.c     |    5 +++++
 dlls/jscript/tests/lang.js |    4 +++-
 dlls/jscript/tests/run.c   |   28 ++++++++++++++++++++++++----
 3 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index 31c471f..040ec58 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -320,6 +320,11 @@ static HRESULT str_to_number(BSTR str, double *ret)
 
     static const WCHAR infinityW[] = {'I','n','f','i','n','i','t','y'};
 
+    if(!ptr) {
+        *ret = 0;
+        return S_OK;
+    }
+
     while(isspaceW(*ptr))
         ptr++;
 
diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js
index b6fe821..8f5e5d5 100644
--- a/dlls/jscript/tests/lang.js
+++ b/dlls/jscript/tests/lang.js
@@ -1238,7 +1238,9 @@ for(var i=0; i<2; i++)
     tmp[i] = /b/;
 ok(tmp[0] != tmp[1], "tmp[0] == tmp [1]");
 
-ok(createNullBSTR() === '', "createNullBSTR() !== ''");
+ok(isNullBSTR(getNullBSTR()), "isNullBSTR(getNullBSTR()) failed\n");
+ok(getNullBSTR() === '', "getNullBSTR() !== ''");
+ok(+getNullBSTR() === 0 , "+getNullBTR() !=== 0");
 
 ok(getVT(nullDisp) === "VT_DISPATCH", "getVT(nullDisp) = " + getVT(nullDisp));
 ok(typeof(nullDisp) === "object", "typeof(nullDisp) = " + typeof(nullDisp));
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index dbf83e6..e6f0009 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -84,7 +84,7 @@ DEFINE_EXPECT(DeleteMemberByDispID);
 #define DISPID_GLOBAL_OK            0x1004
 #define DISPID_GLOBAL_GETVT         0x1005
 #define DISPID_GLOBAL_TESTOBJ       0x1006
-#define DISPID_GLOBAL_NULL_BSTR     0x1007
+#define DISPID_GLOBAL_GETNULLBSTR   0x1007
 #define DISPID_GLOBAL_NULL_DISP     0x1008
 #define DISPID_GLOBAL_TESTTHIS      0x1009
 #define DISPID_GLOBAL_TESTTHIS2     0x100a
@@ -95,6 +95,7 @@ DEFINE_EXPECT(DeleteMemberByDispID);
 #define DISPID_GLOBAL_ISWIN64       0x100f
 #define DISPID_GLOBAL_PUREDISP      0x1010
 #define DISPID_GLOBAL_TESTPROPDELETE  0x1010
+#define DISPID_GLOBAL_ISNULLBSTR    0x1011
 
 #define DISPID_TESTOBJ_PROP         0x2000
 #define DISPID_TESTOBJ_ONLYDISPID   0x2001
@@ -438,8 +439,12 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
         *pid = DISPID_GLOBAL_TESTOBJ;
         return S_OK;
     }
-    if(!strcmp_wa(bstrName, "createNullBSTR")) {
-        *pid = DISPID_GLOBAL_NULL_BSTR;
+    if(!strcmp_wa(bstrName, "getNullBSTR")) {
+        *pid = DISPID_GLOBAL_GETNULLBSTR;
+        return S_OK;
+    }
+    if(!strcmp_wa(bstrName, "isNullBSTR")) {
+        *pid = DISPID_GLOBAL_ISNULLBSTR;
         return S_OK;
     }
     if(!strcmp_wa(bstrName, "nullDisp")) {
@@ -663,13 +668,28 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         V_DISPATCH(pvarRes) = (IDispatch*)&pureDisp;
         return S_OK;
 
-    case DISPID_GLOBAL_NULL_BSTR:
+    case DISPID_GLOBAL_GETNULLBSTR:
         if(pvarRes) {
             V_VT(pvarRes) = VT_BSTR;
             V_BSTR(pvarRes) = NULL;
         }
         return S_OK;
 
+    case DISPID_GLOBAL_ISNULLBSTR:
+        ok(pdp != NULL, "pdp == NULL\n");
+        ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
+        ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
+        ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
+        ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
+        ok(pvarRes != NULL, "pvarRes == NULL\n");
+        ok(V_VT(pvarRes) ==  VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
+        ok(pei != NULL, "pei == NULL\n");
+        ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
+
+        V_VT(pvarRes) = VT_BOOL;
+        V_BOOL(pvarRes) = V_BSTR(pdp->rgvarg) ? VARIANT_FALSE : VARIANT_TRUE;
+        return S_OK;
+
     case DISPID_GLOBAL_ISWIN64:
         if(pvarRes) {
             V_VT(pvarRes) = VT_BOOL;




More information about the wine-cvs mailing list