From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/dispex.c | 133 +++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 68 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index b14b58ad6ae..da8c31fc278 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -479,73 +479,6 @@ static HRESULT convert_params(script_ctx_t *ctx, const DISPPARAMS *dp, jsval_t * return S_OK; }
-static HRESULT prop_put(jsdisp_t *This, dispex_prop_t *prop, jsval_t val) -{ - HRESULT hres; - - if(prop->type == PROP_PROTREF) { - dispex_prop_t *prop_iter = prop; - jsdisp_t *prototype_iter = This; - - do { - prototype_iter = prototype_iter->prototype; - prop_iter = prototype_iter->props + prop_iter->u.ref; - } while(prop_iter->type == PROP_PROTREF); - - if(prop_iter->type == PROP_ACCESSOR) - prop = prop_iter; - } - - switch(prop->type) { - case PROP_BUILTIN: - if(!prop->u.p->setter) { - TRACE("getter with no setter\n"); - return S_OK; - } - return prop->u.p->setter(This->ctx, This, val); - case PROP_PROTREF: - case PROP_DELETED: - if(!This->extensible) - return S_OK; - prop->type = PROP_JSVAL; - prop->flags = PROPF_ENUMERABLE | PROPF_CONFIGURABLE | PROPF_WRITABLE; - prop->u.val = jsval_undefined(); - break; - case PROP_JSVAL: - if(!(prop->flags & PROPF_WRITABLE)) - return S_OK; - - jsval_release(prop->u.val); - break; - case PROP_ACCESSOR: - if(!prop->u.accessor.setter) { - TRACE("no setter\n"); - return S_OK; - } - return jsdisp_call_value(prop->u.accessor.setter, jsval_obj(This), DISPATCH_METHOD, 1, &val, NULL); - case PROP_IDX: - if(!This->builtin_info->idx_put) { - TRACE("no put_idx\n"); - return S_OK; - } - return This->builtin_info->idx_put(This, prop->u.idx, val); - default: - ERR("type %d\n", prop->type); - return E_FAIL; - } - - TRACE("%p.%s = %s\n", This, debugstr_w(prop->name), debugstr_jsval(val)); - - hres = jsval_copy(val, &prop->u.val); - if(FAILED(hres)) - return hres; - - if(This->builtin_info->on_put) - This->builtin_info->on_put(This, prop->name); - - return S_OK; -} - static HRESULT dispex_prop_get(struct prop_desc *prop, IDispatch *jsthis, jsval_t *r) { dispex_prop_t *p = &prop->jsdisp->props[prop_id_to_idx(prop->id)]; @@ -592,7 +525,71 @@ static HRESULT dispex_prop_get(struct prop_desc *prop, IDispatch *jsthis, jsval_
static HRESULT dispex_prop_put(struct prop_desc *prop, jsval_t val) { - return prop_put(prop->jsdisp, &prop->jsdisp->props[prop_id_to_idx(prop->id)], val); + dispex_prop_t *p = &prop->jsdisp->props[prop_id_to_idx(prop->id)]; + jsdisp_t *jsdisp = prop->jsdisp; + HRESULT hres; + + if(p->type == PROP_PROTREF) { + dispex_prop_t *prop_iter = p; + jsdisp_t *prototype_iter = jsdisp; + + do { + prototype_iter = prototype_iter->prototype; + prop_iter = prototype_iter->props + prop_iter->u.ref; + } while(prop_iter->type == PROP_PROTREF); + + if(prop_iter->type == PROP_ACCESSOR) + p = prop_iter; + } + + switch(p->type) { + case PROP_BUILTIN: + if(!p->u.p->setter) { + TRACE("getter with no setter\n"); + return S_OK; + } + return p->u.p->setter(jsdisp->ctx, jsdisp, val); + case PROP_PROTREF: + case PROP_DELETED: + if(!jsdisp->extensible) + return S_OK; + p->type = PROP_JSVAL; + p->flags = PROPF_ENUMERABLE | PROPF_CONFIGURABLE | PROPF_WRITABLE; + p->u.val = jsval_undefined(); + break; + case PROP_JSVAL: + if(!(p->flags & PROPF_WRITABLE)) + return S_OK; + + jsval_release(p->u.val); + break; + case PROP_ACCESSOR: + if(!p->u.accessor.setter) { + TRACE("no setter\n"); + return S_OK; + } + return jsdisp_call_value(p->u.accessor.setter, jsval_obj(jsdisp), DISPATCH_METHOD, 1, &val, NULL); + case PROP_IDX: + if(!jsdisp->builtin_info->idx_put) { + TRACE("no put_idx\n"); + return S_OK; + } + return jsdisp->builtin_info->idx_put(jsdisp, p->u.idx, val); + default: + ERR("type %d\n", p->type); + return E_FAIL; + } + + TRACE("%p.%s = %s\n", jsdisp, debugstr_w(p->name), debugstr_jsval(val)); + + hres = jsval_copy(val, &p->u.val); + if(FAILED(hres)) + return hres; + + if(jsdisp->builtin_info->on_put) + jsdisp->builtin_info->on_put(jsdisp, p->name); + + return S_OK; }
static HRESULT dispex_prop_invoke(struct prop_desc *prop, IDispatch *jsthis, WORD flags,