From: Jacek Caban jacek@codeweavers.com
Instead of using fix_protref_prot. --- dlls/jscript/dispex.c | 57 ++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 25 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 7d77ce6a47f..436fc8e1e69 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -318,13 +318,14 @@ static HRESULT find_external_prop(jsdisp_t *This, const WCHAR *name, BOOL case_i return S_OK; }
-static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens, dispex_prop_t **ret) +static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens, + dispex_prop_t *prop, dispex_prop_t **ret) { const builtin_prop_t *builtin; - dispex_prop_t *prop; HRESULT hres;
- prop = lookup_dispex_prop(This, hash, name, case_insens); + if(!prop) + prop = lookup_dispex_prop(This, hash, name, case_insens); if(prop && prop->type != PROP_DELETED) { *ret = prop; return S_OK; @@ -367,27 +368,31 @@ static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name, return hres; }
-static HRESULT find_prop_name_prot(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens, dispex_prop_t **ret) +static HRESULT find_prop_name_prot(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens, + dispex_prop_t *own_prop, dispex_prop_t **ret) { - dispex_prop_t *prot_prop, *own_prop; + dispex_prop_t *prot_prop = NULL; HRESULT hres;
- hres = find_prop_name(This, hash, name, case_insens, &own_prop); + hres = find_prop_name(This, hash, name, case_insens, own_prop, &own_prop); if(FAILED(hres)) return hres; - if(own_prop && own_prop->type != PROP_DELETED) { - fix_protref_prop(This, own_prop); - *ret = own_prop; - return S_OK; + if(own_prop) { + if(own_prop->type == PROP_PROTREF) { + prot_prop = &This->prototype->props[own_prop->u.ref]; + }else if(own_prop->type != PROP_DELETED) { + *ret = own_prop; + return S_OK; + } }
if(This->prototype) { - hres = find_prop_name_prot(This->prototype, hash, name, case_insens, &prot_prop); + hres = find_prop_name_prot(This->prototype, hash, name, case_insens, prot_prop, &prot_prop); if(FAILED(hres)) return hres; if(prot_prop && prot_prop->type != PROP_DELETED) { if(own_prop && case_insens && wcscmp(prot_prop->name, own_prop->name)) { - hres = find_prop_name(This, prot_prop->hash, prot_prop->name, FALSE, &own_prop); + hres = find_prop_name(This, prot_prop->hash, prot_prop->name, FALSE, NULL, &own_prop); if(FAILED(hres)) return hres; if(own_prop && own_prop->type != PROP_DELETED) { @@ -403,6 +408,8 @@ static HRESULT find_prop_name_prot(jsdisp_t *This, unsigned hash, const WCHAR *n if(!own_prop) return E_OUTOFMEMORY; } + }else if(own_prop) { + own_prop->type = PROP_DELETED; } }
@@ -415,7 +422,7 @@ static HRESULT ensure_prop_name(jsdisp_t *This, const WCHAR *name, DWORD create_ dispex_prop_t *prop; HRESULT hres;
- hres = find_prop_name_prot(This, string_hash(name), name, case_insens, &prop); + hres = find_prop_name_prot(This, string_hash(name), name, case_insens, NULL, &prop); if(SUCCEEDED(hres) && (!prop || prop->type == PROP_DELETED)) { TRACE("creating prop %s flags %lx\n", debugstr_w(name), create_flags);
@@ -745,7 +752,7 @@ static HRESULT fill_protrefs(jsdisp_t *This) return hres;
for(iter = This->prototype->props; iter < This->prototype->props+This->prototype->prop_cnt; iter++) { - hres = find_prop_name(This, iter->hash, iter->name, FALSE, &prop); + hres = find_prop_name(This, iter->hash, iter->name, FALSE, NULL, &prop); if(FAILED(hres)) return hres; if(!prop || prop->type==PROP_DELETED) { @@ -2233,7 +2240,7 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByName(IWineJSDispatch *iface, BSTR if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) FIXME("Unsupported grfdex %lx\n", grfdex);
- hres = find_prop_name(This, string_hash(bstrName), bstrName, grfdex & fdexNameCaseInsensitive, &prop); + hres = find_prop_name(This, string_hash(bstrName), bstrName, grfdex & fdexNameCaseInsensitive, NULL, &prop); if(FAILED(hres)) return hres; if(!prop) { @@ -2423,7 +2430,7 @@ HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const built dispex_prop_t *prop; HRESULT hres;
- hres = find_prop_name_prot(constr, string_hash(L"prototype"), L"prototype", FALSE, &prop); + hres = find_prop_name_prot(constr, string_hash(L"prototype"), L"prototype", FALSE, NULL, &prop); if(SUCCEEDED(hres) && prop && prop->type!=PROP_DELETED) { jsval_t val;
@@ -2464,7 +2471,7 @@ HRESULT jsdisp_get_id(jsdisp_t *jsdisp, const WCHAR *name, DWORD flags, DISPID * hres = ensure_prop_name(jsdisp, name, PROPF_ENUMERABLE | PROPF_CONFIGURABLE | PROPF_WRITABLE, flags & fdexNameCaseInsensitive, &prop); else - hres = find_prop_name_prot(jsdisp, string_hash(name), name, flags & fdexNameCaseInsensitive, &prop); + hres = find_prop_name_prot(jsdisp, string_hash(name), name, flags & fdexNameCaseInsensitive, NULL, &prop); if(FAILED(hres)) return hres;
@@ -2525,7 +2532,7 @@ HRESULT jsdisp_call_name(jsdisp_t *disp, const WCHAR *name, WORD flags, unsigned dispex_prop_t *prop; HRESULT hres;
- hres = find_prop_name_prot(disp, string_hash(name), name, FALSE, &prop); + hres = find_prop_name_prot(disp, string_hash(name), name, FALSE, NULL, &prop); if(FAILED(hres)) return hres;
@@ -2755,7 +2762,7 @@ HRESULT jsdisp_propput(jsdisp_t *obj, const WCHAR *name, DWORD flags, BOOL throw if(obj->extensible) hres = ensure_prop_name(obj, name, flags, FALSE, &prop); else - hres = find_prop_name(obj, string_hash(name), name, FALSE, &prop); + hres = find_prop_name(obj, string_hash(name), name, FALSE, NULL, &prop); if(FAILED(hres)) return hres; if(!prop || (prop->type == PROP_DELETED && !obj->extensible)) @@ -2856,7 +2863,7 @@ HRESULT jsdisp_propget_name(jsdisp_t *obj, const WCHAR *name, jsval_t *val) dispex_prop_t *prop; HRESULT hres;
- hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, &prop); + hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, NULL, &prop); if(FAILED(hres)) return hres;
@@ -2876,7 +2883,7 @@ HRESULT jsdisp_get_idx(jsdisp_t *obj, DWORD idx, jsval_t *r)
swprintf(name, ARRAY_SIZE(name), L"%d", idx);
- hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, &prop); + hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, NULL, &prop); if(FAILED(hres)) return hres;
@@ -2933,7 +2940,7 @@ HRESULT jsdisp_delete_idx(jsdisp_t *obj, DWORD idx)
swprintf(buf, ARRAY_SIZE(buf), L"%d", idx);
- hres = find_prop_name(obj, string_hash(buf), buf, FALSE, &prop); + hres = find_prop_name(obj, string_hash(buf), buf, FALSE, NULL, &prop); if(FAILED(hres) || !prop) return hres;
@@ -3029,7 +3036,7 @@ HRESULT disp_delete_name(script_ctx_t *ctx, IDispatch *disp, jsstr_t *name, BOOL return E_OUTOFMEMORY; }
- hres = find_prop_name(jsdisp, string_hash(ptr), ptr, FALSE, &prop); + hres = find_prop_name(jsdisp, string_hash(ptr), ptr, FALSE, NULL, &prop); if(prop) { hres = delete_prop(prop, ret); }else { @@ -3076,7 +3083,7 @@ HRESULT jsdisp_get_own_property(jsdisp_t *obj, const WCHAR *name, BOOL flags_onl dispex_prop_t *prop; HRESULT hres;
- hres = find_prop_name(obj, string_hash(name), name, FALSE, &prop); + hres = find_prop_name(obj, string_hash(name), name, FALSE, NULL, &prop); if(FAILED(hres)) return hres;
@@ -3120,7 +3127,7 @@ HRESULT jsdisp_define_property(jsdisp_t *obj, const WCHAR *name, property_desc_t dispex_prop_t *prop; HRESULT hres;
- hres = find_prop_name(obj, string_hash(name), name, FALSE, &prop); + hres = find_prop_name(obj, string_hash(name), name, FALSE, NULL, &prop); if(FAILED(hres)) return hres;