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