зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1380087 - Add an intrinsic to test for Map and Set objects. r=till
--HG-- extra : rebase_source : c30f89c15ddce434a86ca043b7ae6a9c5d00c905
This commit is contained in:
Родитель
a108ef2f00
Коммит
8c234e0627
|
@ -25,26 +25,21 @@ function MapConstructorInit(iterable) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ES6 20121122 draft 15.14.4.4. */
|
// ES2018 draft rev f83aa38282c2a60c6916ebc410bfdf105a0f6a54
|
||||||
|
// 23.1.3.5 Map.prototype.forEach ( callbackfn [ , thisArg ] )
|
||||||
function MapForEach(callbackfn, thisArg = undefined) {
|
function MapForEach(callbackfn, thisArg = undefined) {
|
||||||
/* Step 1-2. */
|
// Step 1.
|
||||||
var M = this;
|
var M = this;
|
||||||
if (!IsObject(M))
|
|
||||||
ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "Map", "forEach", typeof M);
|
|
||||||
|
|
||||||
/* Step 3-4. */
|
// Steps 2-3.
|
||||||
try {
|
if (!IsObject(M) || !IsMapObject(M))
|
||||||
callFunction(std_Map_has, M);
|
return callFunction(CallMapMethodIfWrapped, M, callbackfn, thisArg, "MapForEach");
|
||||||
} catch (e) {
|
|
||||||
// has will throw on non-Map objects, throw our own error in that case.
|
|
||||||
ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "Map", "forEach", typeof M);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Step 5. */
|
// Step 4.
|
||||||
if (!IsCallable(callbackfn))
|
if (!IsCallable(callbackfn))
|
||||||
ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
|
ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
|
||||||
|
|
||||||
/* Step 6-8. */
|
// Steps 5-8.
|
||||||
var entries = callFunction(std_Map_iterator, M);
|
var entries = callFunction(std_Map_iterator, M);
|
||||||
while (true) {
|
while (true) {
|
||||||
var result = callFunction(MapIteratorNext, entries);
|
var result = callFunction(MapIteratorNext, entries);
|
||||||
|
|
|
@ -19,26 +19,21 @@ function SetConstructorInit(iterable) {
|
||||||
callContentFunction(adder, set, nextValue);
|
callContentFunction(adder, set, nextValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ES6 20121122 draft 15.16.4.6. */
|
// ES2018 draft rev f83aa38282c2a60c6916ebc410bfdf105a0f6a54
|
||||||
|
// 23.2.3.6 Set.prototype.forEach ( callbackfn [ , thisArg ] )
|
||||||
function SetForEach(callbackfn, thisArg = undefined) {
|
function SetForEach(callbackfn, thisArg = undefined) {
|
||||||
/* Step 1-2. */
|
// Step 1.
|
||||||
var S = this;
|
var S = this;
|
||||||
if (!IsObject(S))
|
|
||||||
ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "Set", "forEach", typeof S);
|
|
||||||
|
|
||||||
/* Step 3-4. */
|
// Steps 2-3.
|
||||||
try {
|
if (!IsObject(S) || !IsSetObject(S))
|
||||||
callFunction(std_Set_has, S);
|
return callFunction(CallSetMethodIfWrapped, S, callbackfn, thisArg, "SetForEach");
|
||||||
} catch (e) {
|
|
||||||
// has will throw on non-Set objects, throw our own error in that case.
|
|
||||||
ThrowTypeError(JSMSG_INCOMPATIBLE_PROTO, "Set", "forEach", typeof S);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Step 5-6. */
|
// Step 4.
|
||||||
if (!IsCallable(callbackfn))
|
if (!IsCallable(callbackfn))
|
||||||
ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
|
ThrowTypeError(JSMSG_NOT_FUNCTION, DecompileArg(0, callbackfn));
|
||||||
|
|
||||||
/* Step 7-8. */
|
// Steps 5-8.
|
||||||
var values = callFunction(std_Set_iterator, S);
|
var values = callFunction(std_Set_iterator, S);
|
||||||
while (true) {
|
while (true) {
|
||||||
var result = callFunction(SetIteratorNext, values);
|
var result = callFunction(SetIteratorNext, values);
|
||||||
|
|
|
@ -128,8 +128,10 @@
|
||||||
_(IntrinsicIsSetIterator) \
|
_(IntrinsicIsSetIterator) \
|
||||||
_(IntrinsicIsStringIterator) \
|
_(IntrinsicIsStringIterator) \
|
||||||
\
|
\
|
||||||
|
_(IntrinsicIsMapObject) \
|
||||||
_(IntrinsicGetNextMapEntryForIterator) \
|
_(IntrinsicGetNextMapEntryForIterator) \
|
||||||
\
|
\
|
||||||
|
_(IntrinsicIsSetObject) \
|
||||||
_(IntrinsicGetNextSetEntryForIterator) \
|
_(IntrinsicGetNextSetEntryForIterator) \
|
||||||
\
|
\
|
||||||
_(IntrinsicNewArrayIterator) \
|
_(IntrinsicNewArrayIterator) \
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include "builtin/AtomicsObject.h"
|
#include "builtin/AtomicsObject.h"
|
||||||
#include "builtin/Intl.h"
|
#include "builtin/Intl.h"
|
||||||
|
#include "builtin/MapObject.h"
|
||||||
#include "builtin/SIMD.h"
|
#include "builtin/SIMD.h"
|
||||||
#include "builtin/TestingFunctions.h"
|
#include "builtin/TestingFunctions.h"
|
||||||
#include "builtin/TypedObject.h"
|
#include "builtin/TypedObject.h"
|
||||||
|
@ -313,10 +314,14 @@ IonBuilder::inlineNativeCall(CallInfo& callInfo, JSFunction* target)
|
||||||
return inlineFinishBoundFunctionInit(callInfo);
|
return inlineFinishBoundFunctionInit(callInfo);
|
||||||
|
|
||||||
// Map intrinsics.
|
// Map intrinsics.
|
||||||
|
case InlinableNative::IntrinsicIsMapObject:
|
||||||
|
return inlineHasClass(callInfo, &MapObject::class_);
|
||||||
case InlinableNative::IntrinsicGetNextMapEntryForIterator:
|
case InlinableNative::IntrinsicGetNextMapEntryForIterator:
|
||||||
return inlineGetNextEntryForIterator(callInfo, MGetNextEntryForIterator::Map);
|
return inlineGetNextEntryForIterator(callInfo, MGetNextEntryForIterator::Map);
|
||||||
|
|
||||||
// Set intrinsics.
|
// Set intrinsics.
|
||||||
|
case InlinableNative::IntrinsicIsSetObject:
|
||||||
|
return inlineHasClass(callInfo, &SetObject::class_);
|
||||||
case InlinableNative::IntrinsicGetNextSetEntryForIterator:
|
case InlinableNative::IntrinsicGetNextSetEntryForIterator:
|
||||||
return inlineGetNextEntryForIterator(callInfo, MGetNextEntryForIterator::Set);
|
return inlineGetNextEntryForIterator(callInfo, MGetNextEntryForIterator::Set);
|
||||||
|
|
||||||
|
|
|
@ -2428,6 +2428,14 @@ static const JSFunctionSpec intrinsic_functions[] = {
|
||||||
JS_FN("CallStarGeneratorMethodIfWrapped",
|
JS_FN("CallStarGeneratorMethodIfWrapped",
|
||||||
CallNonGenericSelfhostedMethod<Is<StarGeneratorObject>>, 2, 0),
|
CallNonGenericSelfhostedMethod<Is<StarGeneratorObject>>, 2, 0),
|
||||||
|
|
||||||
|
JS_INLINABLE_FN("IsMapObject", intrinsic_IsInstanceOfBuiltin<MapObject>, 1, 0,
|
||||||
|
IntrinsicIsMapObject),
|
||||||
|
JS_FN("CallMapMethodIfWrapped", CallNonGenericSelfhostedMethod<Is<MapObject>>, 2, 0),
|
||||||
|
|
||||||
|
JS_INLINABLE_FN("IsSetObject", intrinsic_IsInstanceOfBuiltin<SetObject>, 1, 0,
|
||||||
|
IntrinsicIsSetObject),
|
||||||
|
JS_FN("CallSetMethodIfWrapped", CallNonGenericSelfhostedMethod<Is<SetObject>>, 2, 0),
|
||||||
|
|
||||||
JS_FN("IsWeakSet", intrinsic_IsInstanceOfBuiltin<WeakSetObject>, 1,0),
|
JS_FN("IsWeakSet", intrinsic_IsInstanceOfBuiltin<WeakSetObject>, 1,0),
|
||||||
JS_FN("CallWeakSetMethodIfWrapped",
|
JS_FN("CallWeakSetMethodIfWrapped",
|
||||||
CallNonGenericSelfhostedMethod<Is<WeakSetObject>>, 2, 0),
|
CallNonGenericSelfhostedMethod<Is<WeakSetObject>>, 2, 0),
|
||||||
|
|
Загрузка…
Ссылка в новой задаче