Module: wine Branch: master Commit: dda957d87cf27acfd6819e2c486f383d14968663 URL: http://source.winehq.org/git/wine.git/?a=commit;h=dda957d87cf27acfd6819e2c48...
Author: Jacek Caban jacek@codeweavers.com Date: Sun Sep 6 19:09:30 2009 +0200
jscript: Fixed typeof implementation for null VT_DISPATCH.
---
dlls/jscript/engine.c | 3 +-- dlls/jscript/tests/lang.js | 3 +++ dlls/jscript/tests/run.c | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 3931fff..593294c 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -2336,8 +2336,7 @@ static HRESULT typeof_exprval(exec_ctx_t *ctx, exprval_t *exprval, jsexcept_t *e case VT_DISPATCH: { DispatchEx *dispex;
- dispex = iface_to_jsdisp((IUnknown*)V_DISPATCH(&val)); - if(dispex) { + if(V_DISPATCH(&val) && (dispex = iface_to_jsdisp((IUnknown*)V_DISPATCH(&val)))) { *ret = is_class(dispex, JSCLASS_FUNCTION) ? functionW : objectW; jsdisp_release(dispex); }else { diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index 5cd97d2..354fdb4 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -922,6 +922,9 @@ ok(re.source === "=(\?|%3F)", "re.source = " + re.source);
ok(createNullBSTR() === '', "createNullBSTR() !== ''");
+ok(getVT(nullDisp) === "VT_DISPATCH", "getVT(nullDisp) = " + typeof(nullDisp)); +ok(typeof(nullDisp) === "object", "typeof(nullDisp) = " + typeof(nullDisp)); + function do_test() {} function nosemicolon() {} nosemicolon(); function () {} nosemicolon(); diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c index fe8274f..90b022d 100644 --- a/dlls/jscript/tests/run.c +++ b/dlls/jscript/tests/run.c @@ -76,6 +76,7 @@ DEFINE_EXPECT(GetItemInfo_testVal); #define DISPID_GLOBAL_GETVT 0x1005 #define DISPID_GLOBAL_TESTOBJ 0x1006 #define DISPID_GLOBAL_NULL_BSTR 0x1007 +#define DISPID_GLOBAL_NULL_DISP 0x1008
static const WCHAR testW[] = {'t','e','s','t',0}; static const CHAR testA[] = "test"; @@ -298,6 +299,10 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD *pid = DISPID_GLOBAL_NULL_BSTR; return S_OK; } + if(!strcmp_wa(bstrName, "nullDisp")) { + *pid = DISPID_GLOBAL_NULL_DISP; + return S_OK; + } if(!strcmp_wa(bstrName, "notExists")) { CHECK_EXPECT(global_notexists_d); ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex); @@ -456,6 +461,21 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, V_BSTR(pvarRes) = NULL; } return S_OK; + + case DISPID_GLOBAL_NULL_DISP: + ok(wFlags == INVOKE_PROPERTYGET, "wFlags = %x\n", wFlags); + ok(pdp != NULL, "pdp == NULL\n"); + ok(!pdp->rgvarg, "rgvarg != NULL\n"); + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); + ok(!pdp->cArgs, "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"); + + V_VT(pvarRes) = VT_DISPATCH; + V_DISPATCH(pvarRes) = NULL; + return S_OK; }
ok(0, "unexpected call %x\n", id);