Jacek Caban : jscript: Properly handle builtin properties in Object. prototype.hasOwnProperty implementation.

Alexandre Julliard julliard at winehq.org
Mon Jul 23 13:54:24 CDT 2012


Module: wine
Branch: master
Commit: 10179c210e5a9e09808f6f03009a855cc373b00f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=10179c210e5a9e09808f6f03009a855cc373b00f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jul 23 15:53:52 2012 +0200

jscript: Properly handle builtin properties in Object.prototype.hasOwnProperty implementation.

---

 dlls/jscript/dispex.c  |    9 ++++-----
 dlls/jscript/jscript.h |    2 +-
 dlls/jscript/object.c  |   12 +++++++++---
 3 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 909ed37..501ce4a 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -1388,16 +1388,15 @@ HRESULT jsdisp_delete_idx(jsdisp_t *obj, DWORD idx)
     return delete_prop(prop);
 }
 
-VARIANT_BOOL jsdisp_is_own_prop(jsdisp_t *obj, BSTR name)
+HRESULT jsdisp_is_own_prop(jsdisp_t *obj, BSTR name, VARIANT_BOOL *ret)
 {
     dispex_prop_t *prop;
     HRESULT hres;
 
     hres = find_prop_name(obj, string_hash(name), name, &prop);
     if(FAILED(hres))
-        return VARIANT_FALSE;
-    else if(!prop)
-        return VARIANT_FALSE;
+        return hres;
 
-    return prop->type==PROP_VARIANT ? VARIANT_TRUE : VARIANT_FALSE;
+    *ret = prop && (prop->type == PROP_VARIANT || prop->type == PROP_BUILTIN) ? VARIANT_TRUE : VARIANT_FALSE;
+    return S_OK;
 }
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 484049c..5d82db0 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -222,7 +222,7 @@ HRESULT jsdisp_propget_name(jsdisp_t*,LPCWSTR,VARIANT*,jsexcept_t*) DECLSPEC_HID
 HRESULT jsdisp_get_idx(jsdisp_t*,DWORD,VARIANT*,jsexcept_t*) DECLSPEC_HIDDEN;
 HRESULT jsdisp_get_id(jsdisp_t*,const WCHAR*,DWORD,DISPID*) DECLSPEC_HIDDEN;
 HRESULT jsdisp_delete_idx(jsdisp_t*,DWORD) DECLSPEC_HIDDEN;
-VARIANT_BOOL jsdisp_is_own_prop(jsdisp_t *obj, BSTR name) DECLSPEC_HIDDEN;
+HRESULT jsdisp_is_own_prop(jsdisp_t*,BSTR,VARIANT_BOOL*) DECLSPEC_HIDDEN;
 
 HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD,
         jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index 173c227..6ba253d 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -110,7 +110,6 @@ static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl
         VARIANT *retv, jsexcept_t *ei)
 {
     BSTR name;
-    BOOL result;
     DISPID id;
     HRESULT hres;
 
@@ -130,14 +129,21 @@ static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl
         return hres;
 
     if(is_jsdisp(jsthis)) {
-        result = jsdisp_is_own_prop(jsthis->u.jsdisp, name);
+        VARIANT_BOOL result;
+
+        hres = jsdisp_is_own_prop(jsthis->u.jsdisp, name, &result);
+        if(FAILED(hres))
+            return hres;
+
         if(retv) {
             V_VT(retv) = VT_BOOL;
             V_BOOL(retv) = result;
         }
 
         return S_OK;
-    } else if(is_dispex(jsthis)) {
+    }
+
+    if(is_dispex(jsthis)) {
         hres = IDispatchEx_GetDispID(jsthis->u.dispex, name,
                 make_grfdex(ctx, fdexNameCaseSensitive), &id);
     } else {




More information about the wine-cvs mailing list