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