Jacek Caban : jscript: Added disp_delete_name helper and use it in interp_delete.

Alexandre Julliard julliard at winehq.org
Fri Nov 30 13:48:21 CST 2012


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Nov 30 13:02:19 2012 +0100

jscript: Added disp_delete_name helper and use it in interp_delete.

---

 dlls/jscript/dispex.c  |   43 +++++++++++++++++++++++++++++++++++++++++++
 dlls/jscript/engine.c  |   21 +--------------------
 dlls/jscript/jscript.h |    1 +
 3 files changed, 45 insertions(+), 20 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index d7ff77d..1b7ae50 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -1498,6 +1498,49 @@ HRESULT disp_delete(IDispatch *disp, DISPID id, BOOL *ret)
     return S_OK;
 }
 
+HRESULT disp_delete_name(script_ctx_t *ctx, IDispatch *disp, jsstr_t *name, BOOL *ret)
+{
+    IDispatchEx *dispex;
+    jsdisp_t *jsdisp;
+    HRESULT hres;
+
+    jsdisp = iface_to_jsdisp((IUnknown*)disp);
+    if(jsdisp) {
+        dispex_prop_t *prop;
+
+        *ret = TRUE;
+        hres = find_prop_name(jsdisp, string_hash(name->str), name->str, &prop);
+        if(prop)
+            hres = delete_prop(prop);
+        else
+            hres = DISP_E_MEMBERNOTFOUND;
+
+        jsdisp_release(jsdisp);
+        return hres;
+    }
+
+    hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+    if(SUCCEEDED(hres)) {
+        BSTR bstr;
+
+        bstr = SysAllocStringLen(name->str, jsstr_length(name));
+        if(bstr) {
+            hres = IDispatchEx_DeleteMemberByName(dispex, bstr, make_grfdex(ctx, fdexNameCaseSensitive));
+            SysFreeString(bstr);
+            *ret = TRUE;
+        }else {
+            hres = E_OUTOFMEMORY;
+        }
+
+        IDispatchEx_Release(dispex);
+    }else {
+        hres = S_OK;
+        ret = FALSE;
+    }
+
+    return hres;
+}
+
 HRESULT jsdisp_is_own_prop(jsdisp_t *obj, const WCHAR *name, BOOL *ret)
 {
     dispex_prop_t *prop;
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 20791bf..3fedea1 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -1592,7 +1592,6 @@ static HRESULT interp_mod(exec_ctx_t *ctx)
 static HRESULT interp_delete(exec_ctx_t *ctx)
 {
     jsval_t objv, namev;
-    IDispatchEx *dispex;
     IDispatch *obj;
     jsstr_t *name;
     BOOL ret;
@@ -1617,25 +1616,7 @@ static HRESULT interp_delete(exec_ctx_t *ctx)
         return hres;
     }
 
-    hres = IDispatch_QueryInterface(obj, &IID_IDispatchEx, (void**)&dispex);
-    if(SUCCEEDED(hres)) {
-        BSTR bstr;
-
-        bstr = SysAllocStringLen(name->str, jsstr_length(name));
-        if(bstr) {
-            hres = IDispatchEx_DeleteMemberByName(dispex, bstr, make_grfdex(ctx->script, fdexNameCaseSensitive));
-            SysFreeString(bstr);
-            ret = TRUE;
-        }else {
-            hres = E_OUTOFMEMORY;
-        }
-
-        IDispatchEx_Release(dispex);
-    }else {
-        hres = S_OK;
-        ret = FALSE;
-    }
-
+    hres = disp_delete_name(ctx->script, obj, name, &ret);
     IDispatch_Release(obj);
     jsstr_release(name);
     if(FAILED(hres))
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 147cc1a..69ac417 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -276,6 +276,7 @@ HRESULT jsdisp_propget_name(jsdisp_t*,LPCWSTR,jsval_t*) DECLSPEC_HIDDEN;
 HRESULT jsdisp_get_idx(jsdisp_t*,DWORD,jsval_t*) DECLSPEC_HIDDEN;
 HRESULT jsdisp_get_id(jsdisp_t*,const WCHAR*,DWORD,DISPID*) DECLSPEC_HIDDEN;
 HRESULT disp_delete(IDispatch*,DISPID,BOOL*) DECLSPEC_HIDDEN;
+HRESULT disp_delete_name(script_ctx_t*,IDispatch*,jsstr_t*,BOOL*);
 HRESULT jsdisp_delete_idx(jsdisp_t*,DWORD) DECLSPEC_HIDDEN;
 HRESULT jsdisp_is_own_prop(jsdisp_t*,const WCHAR*,BOOL*) DECLSPEC_HIDDEN;
 HRESULT jsdisp_is_enumerable(jsdisp_t*,const WCHAR*,BOOL*) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list