diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index ac6da07ebdb5..e4ba531bdb03 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -3851,3 +3851,24 @@ JSObject::maybeConstructorDisplayAtom() const return nullptr; return displayAtomFromObjectGroup(*group()); } + +bool +js::SpeciesConstructor(JSContext* cx, HandleObject obj, HandleValue defaultCtor, MutableHandleValue pctor) +{ + HandlePropertyName shName = cx->names().SpeciesConstructor; + RootedValue func(cx); + if (!GlobalObject::getSelfHostedFunction(cx, cx->global(), shName, shName, 2, &func)) + return false; + InvokeArgs args(cx); + if (!args.init(2)) + return false; + args.setCallee(func); + args.setThis(UndefinedValue()); + args[0].setObject(*obj); + args[1].set(defaultCtor); + if (!Invoke(cx, args)) + return false; + + pctor.set(args.rval()); + return true; +} diff --git a/js/src/jsobj.h b/js/src/jsobj.h index ebe506eaca66..42b8be427053 100644 --- a/js/src/jsobj.h +++ b/js/src/jsobj.h @@ -1336,6 +1336,9 @@ FreezeObject(JSContext* cx, HandleObject obj) extern bool TestIntegrityLevel(JSContext* cx, HandleObject obj, IntegrityLevel level, bool* resultp); +extern bool +SpeciesConstructor(JSContext* cx, HandleObject obj, HandleValue defaultCtor, MutableHandleValue pctor); + } /* namespace js */ #endif /* jsobj_h */ diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h index 7fa17e3913d2..3695ec67747a 100644 --- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -235,6 +235,7 @@ macro(shape, shape, "shape") \ macro(size, size, "size") \ macro(source, source, "source") \ + macro(SpeciesConstructor, SpeciesConstructor, "SpeciesConstructor") \ macro(stack, stack, "stack") \ macro(star, star, "*") \ macro(starDefaultStar, starDefaultStar, "*default*") \