The type of ObjectOps::enumerate
. This callback overrides a portion of SpiderMonkey's default [[Enumerate]] internal method.
Syntax
typedef bool (* JSNewEnumerateOp)(JSContext *cx, JS::HandleObject obj, JS::AutoIdVector &properties); // Added in SpiderMonkeySidebar 38 typedef bool (* JSNewEnumerateOp)(JSContext *cx, JS::HandleObject obj, JSIterateOp enum_op, JS::MutableHandleValue statep, JS::MutableHandleId idp); // Obsolete since JSAPI 37
Name | Type | Description |
---|---|---|
cx |
JSContext * |
The context in which the enumeration is taking place. |
obj |
JS::HandleObject |
The object to be enumerated. |
properties |
JS::AutoIdVector & |
Out parameter. Id array to populate with all property keys. |
enum_op |
JSIterateOp |
Obsolete since JSAPI 37 Specifies which step in iteration is happening. See the Description below. |
statep |
JS::MutableHandleId |
Obsolete since JSAPI 37 In/out parameter. The meaning depends on enum_op . See the Description below. |
idp |
JS::MutableHandleId |
Obsolete since JSAPI 37 In/out parameter. The meaning depends on enum_op . See the Description below. |
Description
From SpiderMonkey 38, JSNewEnumerateOp
is the type of ObjectOps::enumerate
. This callback overrides a portion of SpiderMonkey's default [[Enumerate]]
internal method. When an ordinary object is enumerated, that object and each object on its prototype chain is tested for an enumerate op, and those ops are called in order. The properties each op adds to the properties
vector are added to the set of values the for-in
loop will iterate over. All of this is nonstandard.
An object is "enumerated" when it's the target of a for-in
loop or JS_Enumerate
. All other property inspection, including Object.keys(obj)
, goes through [[OwnKeys]]
.
The callback's job is to populate properties
with all property keys that the for-in
loop should visit.
Before JSAPI 37, JSNewEnumerateOp
was the type of JSClass.enumerate
.
To use a JSNewEnumerateOp
in a JSClass
, set the JSCLASS_NEW_ENUMERATE
bit in the JSClass.flags
field and set the JSClass.enumerate
field to your JSNewEnumerateOp
, casting it to JSEnumerateOp
. (SpiderMonkey, noting the JSCLASS_NEW_ENUMERATE
flag, will cast that function pointer back to type JSNewEnumerateOp
before calling it.)
The behavior depends on the value of enum_op
:
JSENUMERATE_INIT
-
A new, opaque iterator state should be allocated and stored in
*statep
. (You can usePRIVATE_TO_JSVAL
to tag the pointer to be stored).The number of properties that will be enumerated should be returned as an integer jsval in
*idp
, ifidp
is non-null, and provided the number of enumerable properties is known. Ifidp
is non-null and the number of enumerable properties can't be computed in advance,*idp
should be set toJSVAL_ZERO
. JSENUMERATE_INIT_ALL
- Used identically to
JSENUMERATE_INIT
, but exposes all properties of the object regardless of enumerability. JSENUMERATE_NEXT
-
A previously allocated opaque iterator state is passed in via
statep
. Return the nextjsid
in the iteration using*idp
. The opaque iterator state pointed at bystatep
is destroyed and*statep
is set toJSVAL_NULL
if there are no properties left to enumerate. JSENUMERATE_DESTROY
-
Destroy the opaque iterator state previously allocated in
*statep
by a call to this function whenenum_op
wasJSENUMERATE_INIT
orJSENUMERATE_INIT_ALL
.
The return value is used to indicate success, with a value of false indicating failure.