From b5058ada58587da848d37bd20436d61b646c3682 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 15 Mar 2019 16:14:44 +0100 Subject: [PATCH] jscript: Add Object.create implementation. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/jscript/object.c | 41 ++++++++++++++++++++++++++++++++++++++++ dlls/mshtml/tests/es5.js | 12 ++++++++++++ 2 files changed, 53 insertions(+) diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index c4c3a6e86ac..19d67b514fe 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -32,6 +32,7 @@ static const WCHAR propertyIsEnumerableW[] = {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0}; +static const WCHAR createW[] = {'c','r','e','a','t','e',0}; static const WCHAR getOwnPropertyDescriptorW[] = {'g','e','t','O','w','n','P','r','o','p','e','r','t','y','D','e','s','c','r','i','p','t','o','r',0}; static const WCHAR getPrototypeOfW[] = @@ -521,6 +522,45 @@ static HRESULT Object_getOwnPropertyDescriptor(script_ctx_t *ctx, vdisp_t *jsthi return hres; } +static HRESULT Object_create(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, + unsigned argc, jsval_t *argv, jsval_t *r) +{ + jsdisp_t *proto = NULL, *obj; + HRESULT hres; + + if(!argc || (!is_object_instance(argv[0]) && !is_null(argv[0]))) { + FIXME("Invalid arg\n"); + return E_INVALIDARG; + } + + TRACE("(%s)\n", debugstr_jsval(argv[0])); + + if(argc > 1) { + FIXME("Unsupported properties argument %s\n", debugstr_jsval(argv[1])); + return E_NOTIMPL; + } + + if(argc && is_object_instance(argv[0])) { + if(get_object(argv[0])) + proto = to_jsdisp(get_object(argv[0])); + if(!proto) { + FIXME("Non-JS prototype\n"); + return E_NOTIMPL; + } + }else if(!is_null(argv[0])) { + FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined())); + return E_INVALIDARG; + } + + if(r) { + hres = create_dispex(ctx, NULL, proto, &obj); + if(FAILED(hres)) + return hres; + *r = jsval_obj(obj); + } + return S_OK; +} + static HRESULT Object_getPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { @@ -547,6 +587,7 @@ static HRESULT Object_getPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl } static const builtin_prop_t ObjectConstr_props[] = { + {createW, Object_create, PROPF_ES5|PROPF_METHOD|2}, {definePropertiesW, Object_defineProperties, PROPF_ES5|PROPF_METHOD|2}, {definePropertyW, Object_defineProperty, PROPF_ES5|PROPF_METHOD|2}, {getOwnPropertyDescriptorW, Object_getOwnPropertyDescriptor, PROPF_ES5|PROPF_METHOD|2}, diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 6cfee812615..0ee2efffe8e 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -637,6 +637,9 @@ function test_string_split() { } function test_getPrototypeOf() { + ok(Object.create.length === 2, "Object.create.length = " + Object.create.length); + ok(Object.getPrototypeOf.length === 1, "Object.getPrototypeOf.length = " + Object.getPrototypeOf.length); + ok(Object.getPrototypeOf(new Object()) === Object.prototype, "Object.getPrototypeOf(new Object()) !== Object.prototype"); @@ -660,6 +663,15 @@ function test_getPrototypeOf() { ok(Object.getPrototypeOf(Object.prototype) === null, "Object.getPrototypeOf(Object.prototype) !== null"); + obj = Object.create(proto = { test: 1 }); + ok(Object.getPrototypeOf(obj) === proto, + "Object.getPrototypeOf(obj) !== proto"); + ok(obj.test === 1, "obj.test = " + obj.test); + + obj = Object.create(null); + ok(!("toString" in obj), "toString is in obj"); + ok(Object.getPrototypeOf(obj) === null, "Object.getPrototypeOf(obj) = " + Object.getPrototypeOf(obj)); + next_test(); }