mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-17 07:15:46 +00:00
Bug 884124 (part 2) - Add a StopIterationObject class. r=jwalden.
--HG-- extra : rebase_source : c3ea0d095ad651b6aa1bb565f1d4ec65654660bd
This commit is contained in:
parent
f99d675d39
commit
704013c183
@ -68,6 +68,7 @@
|
||||
#include "vm/Interpreter.h"
|
||||
#include "vm/NumericConversions.h"
|
||||
#include "vm/Shape.h"
|
||||
#include "vm/StopIterationObject.h"
|
||||
#include "vm/StringBuffer.h"
|
||||
#include "vm/WeakMapObject.h"
|
||||
#include "vm/Xdr.h"
|
||||
@ -1815,7 +1816,7 @@ static const JSStdName standard_class_atoms[] = {
|
||||
{js_InitExceptionClasses, EAGER_ATOM_AND_CLASP(Error)},
|
||||
{js_InitRegExpClass, EAGER_ATOM_AND_OCLASP(RegExp)},
|
||||
#if JS_HAS_GENERATORS
|
||||
{js_InitIteratorClasses, EAGER_ATOM_AND_CLASP(StopIteration)},
|
||||
{js_InitIteratorClasses, EAGER_ATOM_AND_OCLASP(StopIteration)},
|
||||
#endif
|
||||
{js_InitJSONClass, EAGER_ATOM_AND_CLASP(JSON)},
|
||||
{js_InitTypedArrayClasses, EAGER_CLASS_ATOM(ArrayBuffer), &js::ArrayBufferObject::protoClass},
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "ion/IonCompartment.h"
|
||||
#endif
|
||||
#include "js/RootingAPI.h"
|
||||
#include "vm/StopIterationObject.h"
|
||||
|
||||
#include "jsgcinlines.h"
|
||||
#include "jsobjinlines.h"
|
||||
@ -234,7 +235,7 @@ JSCompartment::wrap(JSContext *cx, MutableHandleValue vp, HandleObject existingA
|
||||
return WrapForSameCompartment(cx, obj, vp);
|
||||
|
||||
/* Translate StopIteration singleton. */
|
||||
if (obj->isStopIteration())
|
||||
if (obj->is<StopIterationObject>())
|
||||
return js_FindClassObject(cx, JSProto_StopIteration, vp);
|
||||
|
||||
/* Unwrap the object, but don't unwrap outer windows. */
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "vm/GlobalObject.h"
|
||||
#include "vm/Interpreter.h"
|
||||
#include "vm/Shape.h"
|
||||
#include "vm/StopIterationObject.h"
|
||||
|
||||
#include "jsinferinlines.h"
|
||||
#include "jsobjinlines.h"
|
||||
@ -1194,6 +1195,12 @@ js_SuppressDeletedElements(JSContext *cx, HandleObject obj, uint32_t begin, uint
|
||||
return SuppressDeletedPropertyHelper(cx, obj, IndexRangePredicate(begin, end));
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsStopIteration(const js::Value &v)
|
||||
{
|
||||
return v.isObject() && v.toObject().is<StopIterationObject>();
|
||||
}
|
||||
|
||||
bool
|
||||
js_IteratorMore(JSContext *cx, HandleObject iterobj, MutableHandleValue rval)
|
||||
{
|
||||
@ -1286,7 +1293,7 @@ stopiter_hasInstance(JSContext *cx, HandleObject obj, MutableHandleValue v, JSBo
|
||||
return true;
|
||||
}
|
||||
|
||||
Class js::StopIterationClass = {
|
||||
Class StopIterationObject::class_ = {
|
||||
"StopIteration",
|
||||
JSCLASS_HAS_CACHED_PROTO(JSProto_StopIteration) |
|
||||
JSCLASS_FREEZE_PROTO,
|
||||
@ -1821,7 +1828,7 @@ GlobalObject::initIteratorClasses(JSContext *cx, Handle<GlobalObject *> global)
|
||||
#endif
|
||||
|
||||
if (global->getPrototype(JSProto_StopIteration).isUndefined()) {
|
||||
proto = global->createBlankPrototype(cx, &StopIterationClass);
|
||||
proto = global->createBlankPrototype(cx, &StopIterationObject::class_);
|
||||
if (!proto || !JSObject::freeze(cx, proto))
|
||||
return false;
|
||||
|
||||
@ -1829,7 +1836,7 @@ GlobalObject::initIteratorClasses(JSContext *cx, Handle<GlobalObject *> global)
|
||||
if (!DefineConstructorAndPrototype(cx, global, JSProto_StopIteration, proto, proto))
|
||||
return false;
|
||||
|
||||
MarkStandardClassInitializedNoProto(global, &StopIterationClass);
|
||||
MarkStandardClassInitializedNoProto(global, &StopIterationObject::class_);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -212,7 +212,6 @@ extern Class MathClass;
|
||||
extern Class ObjectClass;
|
||||
extern Class ProxyClass;
|
||||
extern Class RegExpStaticsClass;
|
||||
extern Class StopIterationClass;
|
||||
|
||||
class ArrayBufferObject;
|
||||
class GlobalObject;
|
||||
@ -955,7 +954,6 @@ class JSObject : public js::ObjectImpl
|
||||
inline bool isObject() const { return hasClass(&js::ObjectClass); }
|
||||
using js::ObjectImpl::isProxy;
|
||||
inline bool isRegExpStatics() const { return hasClass(&js::RegExpStaticsClass); }
|
||||
inline bool isStopIteration() const { return hasClass(&js::StopIterationClass); }
|
||||
inline bool isTypedArray() const;
|
||||
|
||||
/* Subtypes of Proxy. */
|
||||
|
@ -1248,12 +1248,6 @@ GetOuterObject(JSContext *cx, HandleObject obj)
|
||||
return obj;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
IsStopIteration(const js::Value &v)
|
||||
{
|
||||
return v.isObject() && v.toObject().isStopIteration();
|
||||
}
|
||||
|
||||
static JS_ALWAYS_INLINE bool
|
||||
IsFunctionObject(const js::Value &v)
|
||||
{
|
||||
|
22
js/src/vm/StopIterationObject.h
Normal file
22
js/src/vm/StopIterationObject.h
Normal file
@ -0,0 +1,22 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
* vim: set ts=8 sts=4 et sw=4 tw=99:
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef vm_StopIterationObject_h
|
||||
#define vm_StopIterationObject_h
|
||||
|
||||
#include "jsobj.h"
|
||||
|
||||
namespace js {
|
||||
|
||||
class StopIterationObject : public JSObject
|
||||
{
|
||||
public:
|
||||
static Class class_;
|
||||
};
|
||||
|
||||
} // namespace js
|
||||
|
||||
#endif /* vm_StopIterationObject_h */
|
Loading…
Reference in New Issue
Block a user