Module: wine Branch: master Commit: 42c2bd7bd99d4e49e5b6b2c45aef303604f3c0e8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=42c2bd7bd99d4e49e5b6b2c45a...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jun 21 17:45:50 2011 +0200
jscript: Correctly handle forin statement on pure IDispatch object.
---
dlls/jscript/engine.c | 5 ++- dlls/jscript/tests/lang.js | 3 ++ dlls/jscript/tests/run.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c index 1b56e63..89523bb 100644 --- a/dlls/jscript/engine.c +++ b/dlls/jscript/engine.c @@ -884,8 +884,9 @@ HRESULT forin_statement_eval(script_ctx_t *ctx, statement_t *_stat, return_type_ hres = IDispatch_QueryInterface(V_DISPATCH(&val), &IID_IDispatchEx, (void**)&in_obj); IDispatch_Release(V_DISPATCH(&val)); if(FAILED(hres)) { - FIXME("Object doesn't support IDispatchEx\n"); - return E_NOTIMPL; + TRACE("Object doesn't support IDispatchEx\n"); + V_VT(ret) = VT_EMPTY; + return S_OK; }
V_VT(&retv) = VT_EMPTY; diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index bf74ed7..b71d80d 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -205,6 +205,9 @@ for(var iter in null) for(var iter in false) ok(false, "unexpected forin call, test = " + iter);
+for(var iter in pureDisp) + ok(false, "unexpected forin call in pureDisp object"); + tmp = 0; if(true) tmp = 1; diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c index 18252be..88c69ef 100644 --- a/dlls/jscript/tests/run.c +++ b/dlls/jscript/tests/run.c @@ -90,6 +90,7 @@ DEFINE_EXPECT(invoke_func); #define DISPID_GLOBAL_PROPGETFUNC 0x100d #define DISPID_GLOBAL_OBJECT_FLAG 0x100e #define DISPID_GLOBAL_ISWIN64 0x100f +#define DISPID_GLOBAL_PUREDISP 0x1010
#define DISPID_TESTOBJ_PROP 0x2000 #define DISPID_TESTOBJ_ONLYDISPID 0x2001 @@ -324,6 +325,29 @@ static IDispatchExVtbl testObjVtbl = {
static IDispatchEx testObj = { &testObjVtbl };
+static HRESULT WINAPI pureDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch)) { + *ppv = iface; + return S_OK; + } + + *ppv = NULL; + return E_NOINTERFACE; +} + +static IDispatchExVtbl pureDispVtbl = { + pureDisp_QueryInterface, + DispatchEx_AddRef, + DispatchEx_Release, + DispatchEx_GetTypeInfoCount, + DispatchEx_GetTypeInfo, + DispatchEx_GetIDsOfNames, + DispatchEx_Invoke +}; + +static IDispatchEx pureDisp = { &pureDispVtbl }; + static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { if(!strcmp_wa(bstrName, "ok")) { @@ -417,6 +441,12 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD return S_OK; }
+ if(!strcmp_wa(bstrName, "pureDisp")) { + test_grfdex(grfdex, fdexNameCaseSensitive); + *pid = DISPID_GLOBAL_PUREDISP; + return S_OK; + } + if(strict_dispid_check) ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName)); return DISP_E_UNKNOWNNAME; @@ -566,6 +596,21 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, V_DISPATCH(pvarRes) = (IDispatch*)&testObj; return S_OK;
+ case DISPID_GLOBAL_PUREDISP: + 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) = (IDispatch*)&pureDisp; + return S_OK; + case DISPID_GLOBAL_NULL_BSTR: if(pvarRes) { V_VT(pvarRes) = VT_BSTR;