author | Tooru Fujisawa <arai_a@mac.com> |
Thu, 14 Jan 2016 19:37:04 +0900 | |
changeset 292150 | 1837056e2ce28c7a5149f60fb2392af9b72abce6 |
parent 292149 | 35bd15c16547dd563d97e0b1c7ca825ac93d07f2 |
child 292151 | ac7bd86f3e6020d1afd3271bb26e04e146472b29 |
push id | 74764 |
push user | arai_a@mac.com |
push date | Thu, 07 Apr 2016 10:49:15 +0000 |
treeherder | mozilla-inbound@4d0f975a2311 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | lth |
bugs | 1165053 |
milestone | 48.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
js/src/vm/CommonPropertyNames.h | file | annotate | diff | comparison | revisions | |
js/src/vm/TypedArrayObject.cpp | file | annotate | diff | comparison | revisions |
--- a/js/src/vm/CommonPropertyNames.h +++ b/js/src/vm/CommonPropertyNames.h @@ -14,16 +14,17 @@ #define FOR_EACH_COMMON_PROPERTYNAME(macro) \ macro(add, add, "add") \ macro(allowContentSpread, allowContentSpread, "allowContentSpread") \ macro(anonymous, anonymous, "anonymous") \ macro(Any, Any, "Any") \ macro(apply, apply, "apply") \ macro(arguments, arguments, "arguments") \ macro(as, as, "as") \ + macro(ArrayBufferSpecies, ArrayBufferSpecies, "ArrayBufferSpecies") \ macro(ArrayIteratorNext, ArrayIteratorNext, "ArrayIteratorNext") \ macro(ArrayType, ArrayType, "ArrayType") \ macro(ArrayValues, ArrayValues, "ArrayValues") \ macro(ArrayValuesAt, ArrayValuesAt, "ArrayValuesAt") \ macro(Async, Async, "Async") \ macro(Bool8x16, Bool8x16, "Bool8x16") \ macro(Bool16x8, Bool16x8, "Bool16x8") \ macro(Bool32x4, Bool32x4, "Bool32x4") \
--- a/js/src/vm/TypedArrayObject.cpp +++ b/js/src/vm/TypedArrayObject.cpp @@ -30,16 +30,17 @@ #include "builtin/TypedObjectConstants.h" #include "gc/Barrier.h" #include "gc/Marking.h" #include "js/Conversions.h" #include "vm/ArrayBufferObject.h" #include "vm/GlobalObject.h" #include "vm/Interpreter.h" +#include "vm/SelfHosting.h" #include "vm/TypedArrayCommon.h" #include "vm/WrapperObject.h" #include "jsatominlines.h" #include "vm/ArrayBufferObject-inl.h" #include "vm/NativeObject-inl.h" #include "vm/Shape-inl.h" @@ -752,22 +753,54 @@ TypedArrayObjectTemplate<T>::AllocateArr // ES 2016 draft Mar 25, 2016 24.1.1.1 steps 1 (remaining part), 2-6. if (!maybeCreateArrayBuffer(cx, elementLength, proto, buffer)) return false; return true; } static bool +IsArrayBufferConstructor(const Value& v) +{ + return v.isObject() && + v.toObject().is<JSFunction>() && + v.toObject().as<JSFunction>().isNative() && + v.toObject().as<JSFunction>().native() == ArrayBufferObject::class_constructor; +} + +static bool +IsArrayBufferSpecies(JSContext* cx, HandleObject origBuffer) +{ + RootedValue ctor(cx); + if (!GetPropertyPure(cx, origBuffer, NameToId(cx->names().constructor), ctor.address())) + return false; + + if (!IsArrayBufferConstructor(ctor)) + return false; + + RootedObject ctorObj(cx, &ctor.toObject()); + RootedId speciesId(cx, SYMBOL_TO_JSID(cx->wellKnownSymbols().species)); + JSFunction* getter; + if (!GetGetterPure(cx, ctorObj, speciesId, &getter)) + return false; + + return IsSelfHostedFunctionWithName(getter, cx->names().ArrayBufferSpecies); +} + +static bool GetSpeciesConstructor(JSContext* cx, HandleObject obj, bool isWrapped, MutableHandleValue ctor) { if (!isWrapped) { if (!GlobalObject::ensureConstructor(cx, cx->global(), JSProto_ArrayBuffer)) return false; RootedValue defaultCtor(cx, cx->global()->getConstructor(JSProto_ArrayBuffer)); + if (IsArrayBufferSpecies(cx, obj)) { + ctor.set(defaultCtor); + return true; + } if (!SpeciesConstructor(cx, obj, defaultCtor, ctor)) return false; return true; } { JSAutoCompartment ac(cx, obj);