From: Jacek Caban Subject: jscript: Properly handle NULL bstr in str_to_number Message-Id: <4F730C5C.1020203@codeweavers.com> Date: Wed, 28 Mar 2012 15:04:28 +0200 --- 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;