Module: wine Branch: master Commit: fd91fe52b779f91f8e62ebdacc2e52ac358929f5 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fd91fe52b779f91f8e62ebdac...
Author: Jacek Caban jacek@codeweavers.com Date: Tue May 15 13:26:25 2018 +0200
jscript: Support getting value of accessor property.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/jscript/dispex.c | 20 ++++++++++++++------ dlls/mshtml/tests/es5.js | 10 ++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index a1298eb..2557471 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -434,8 +434,14 @@ static HRESULT invoke_prop_func(jsdisp_t *This, IDispatch *jsthis, dispex_prop_t
static HRESULT prop_get(jsdisp_t *This, dispex_prop_t *prop, jsval_t *r) { + jsdisp_t *prop_obj = This; HRESULT hres;
+ while(prop->type == PROP_PROTREF) { + prop_obj = prop_obj->prototype; + prop = prop_obj->props + prop->u.ref; + } + switch(prop->type) { case PROP_BUILTIN: if(prop->u.p->getter) { @@ -456,18 +462,20 @@ static HRESULT prop_get(jsdisp_t *This, dispex_prop_t *prop, jsval_t *r) *r = jsval_obj(obj); } break; - case PROP_PROTREF: - hres = prop_get(This->prototype, This->prototype->props + prop->u.ref, r); - break; case PROP_JSVAL: hres = jsval_copy(prop->u.val, r); break; case PROP_ACCESSOR: - FIXME("not supported on accessor property\n"); - hres = E_NOTIMPL; + if(prop->u.accessor.getter) { + hres = jsdisp_call_value(prop->u.accessor.getter, to_disp(This), + DISPATCH_METHOD, 0, NULL, r); + }else { + *r = jsval_undefined(); + hres = S_OK; + } break; case PROP_IDX: - hres = This->builtin_info->idx_get(This, prop->u.idx, r); + hres = prop_obj->builtin_info->idx_get(prop_obj, prop->u.idx, r); break; default: ERR("type %d\n", prop->type); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index df5b7c7..4e7b83b 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -257,6 +257,8 @@ function test_defineProperty() { Object.defineProperty(obj, "getsetprop", desc); test_accessor_prop_desc(obj, "getsetprop", desc);
+ ok(obj.getsetprop === 1, "getsetprop = " + obj.getsetprop); + Object.defineProperty(obj, "notConf", {writable: true, enumerable: true, configurable: false, value: 1}); test_own_data_prop_desc(obj, "notConf", true, true, false);
@@ -379,9 +381,11 @@ function test_defineProperty() { function child() {} desc = { get: function() { + ok(this === obj, "this != obj"); return getsetprop_value; }, set: function(v) { + ok(this === obj, "this != obj"); getsetprop_value = v; }, configurable: true @@ -389,11 +393,17 @@ function test_defineProperty() { Object.defineProperty(child.prototype, "parent_accessor", desc);
obj = new child(); + getsetprop_value = 6; + ok(obj.parent_accessor === 6, "parent_accessor = " + obj.parent_accessor);
ok(Object.getOwnPropertyDescriptor(obj, "parent_accessor") === undefined, "getOwnPropertyDescriptor(parent_accessor) did not return undefined"); test_accessor_prop_desc(child.prototype, "parent_accessor", desc);
+ desc.get = undefined; + Object.defineProperty(child.prototype, "parent_accessor", desc); + ok(obj.parent_accessor === undefined, "parent_accessor = " + obj.parent_accessor); + next_test(); }