Jacek Caban : jscript: Fixed typeof implementation for null VT_DISPATCH.
Alexandre Julliard
julliard at winehq.org
Tue Sep 8 08:54:25 CDT 2009
Module: wine
Branch: master
Commit: dda957d87cf27acfd6819e2c486f383d14968663
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dda957d87cf27acfd6819e2c486f383d14968663
Author: Jacek Caban <jacek at 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);
More information about the wine-cvs
mailing list