Module: wine Branch: master Commit: 34d4a9c75188093675b97bc142f2ff6e6489a268 URL: https://source.winehq.org/git/wine.git/?a=commit;h=34d4a9c75188093675b97bc14...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Aug 21 12:31:18 2019 +0200
jscript: Add Object.defineProperties implementation.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/jscript/object.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 619356b..7794f1d 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -409,6 +409,57 @@ static HRESULT to_property_descriptor(script_ctx_t *ctx, jsdisp_t *attr_obj, pro return hres; }
+static HRESULT jsdisp_define_properties(script_ctx_t *ctx, jsdisp_t *obj, jsval_t list_val) +{ + DISPID id = DISPID_STARTENUM; + property_desc_t prop_desc; + IDispatch *list_disp; + jsdisp_t *list_obj, *desc_obj; + jsval_t desc_val; + BSTR name; + HRESULT hres; + + hres = to_object(ctx, list_val, &list_disp); + if(FAILED(hres)) + return hres; + + if(!(list_obj = to_jsdisp(list_disp))) { + FIXME("non-JS list obj\n"); + IDispatch_Release(list_disp); + return E_NOTIMPL; + } + + while(1) { + hres = jsdisp_next_prop(list_obj, id, TRUE, &id); + if(hres != S_OK) + break; + + hres = jsdisp_propget(list_obj, id, &desc_val); + if(FAILED(hres)) + break; + + if(!is_object_instance(desc_val) || !get_object(desc_val) || !(desc_obj = to_jsdisp(get_object(desc_val)))) { + jsval_release(desc_val); + break; + } + + hres = to_property_descriptor(ctx, desc_obj, &prop_desc); + jsdisp_release(desc_obj); + if(FAILED(hres)) + break; + + hres = IDispatchEx_GetMemberName(&list_obj->IDispatchEx_iface, id, &name); + if(SUCCEEDED(hres)) + hres = jsdisp_define_property(obj, name, &prop_desc); + release_property_descriptor(&prop_desc); + if(FAILED(hres)) + break; + } + + jsdisp_release(list_obj); + return FAILED(hres) ? hres : S_OK; +} + static HRESULT Object_defineProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { @@ -455,8 +506,20 @@ static HRESULT Object_defineProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl static HRESULT Object_defineProperties(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - FIXME("\n"); - return E_NOTIMPL; + jsdisp_t *obj; + HRESULT hres; + + if(argc < 1 || !is_object_instance(argv[0]) || !get_object(argv[0]) || !(obj = to_jsdisp(get_object(argv[0])))) { + FIXME("not an object\n"); + return E_NOTIMPL; + } + + TRACE("%p\n", obj); + + hres = jsdisp_define_properties(ctx, obj, argc >= 2 ? argv[1] : jsval_undefined()); + if(SUCCEEDED(hres) && r) + *r = jsval_obj(jsdisp_addref(obj)); + return hres; }
static HRESULT Object_getOwnPropertyDescriptor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,