From 9819f5299ea4cec07283b3370c67e83917535982 Mon Sep 17 00:00:00 2001 From: Eric Faust Date: Fri, 13 Nov 2015 18:22:21 -0800 Subject: [PATCH] Bug 1055472 - Part 3: Make the Object constructor properly subclassable. (r=Waldo) --- js/src/builtin/Object.cpp | 7 ++++++- js/src/tests/ecma_6/Class/extendBuiltinConstructors.js | 1 + js/src/tests/ecma_6/Class/superCallBaseInvoked.js | 2 -- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/js/src/builtin/Object.cpp b/js/src/builtin/Object.cpp index 372c39ea4f6a..cfdc652c7a8d 100644 --- a/js/src/builtin/Object.cpp +++ b/js/src/builtin/Object.cpp @@ -33,7 +33,12 @@ js::obj_construct(JSContext* cx, unsigned argc, Value* vp) CallArgs args = CallArgsFromVp(argc, vp); RootedObject obj(cx, nullptr); - if (args.length() > 0 && !args[0].isNullOrUndefined()) { + if (args.isConstructing() && (&args.newTarget().toObject() != &args.callee())) { + RootedObject newTarget(cx, &args.newTarget().toObject()); + obj = CreateThis(cx, &PlainObject::class_, newTarget); + if (!obj) + return false; + } else if (args.length() > 0 && !args[0].isNullOrUndefined()) { obj = ToObject(cx, args[0]); if (!obj) return false; diff --git a/js/src/tests/ecma_6/Class/extendBuiltinConstructors.js b/js/src/tests/ecma_6/Class/extendBuiltinConstructors.js index 6367b328a359..baa70e5b3b22 100644 --- a/js/src/tests/ecma_6/Class/extendBuiltinConstructors.js +++ b/js/src/tests/ecma_6/Class/extendBuiltinConstructors.js @@ -16,6 +16,7 @@ function testBuiltin(builtin) { testBuiltin(Function); +testBuiltin(Object); `; diff --git a/js/src/tests/ecma_6/Class/superCallBaseInvoked.js b/js/src/tests/ecma_6/Class/superCallBaseInvoked.js index 807b132000be..59ef23650dc3 100644 --- a/js/src/tests/ecma_6/Class/superCallBaseInvoked.js +++ b/js/src/tests/ecma_6/Class/superCallBaseInvoked.js @@ -53,8 +53,6 @@ testBase(p); handler.construct = (target, args, nt) => Reflect.construct(target, args, nt); testBase(p); -// Object will have to wait for fixed builtins. - `; if (classesEnabled())