Bug 884124 (part 2) - Add a StopIterationObject class. r=jwalden.

--HG--
extra : rebase_source : c3ea0d095ad651b6aa1bb565f1d4ec65654660bd
This commit is contained in:
Nicholas Nethercote 2013-06-18 19:56:19 -07:00
parent f99d675d39
commit 704013c183
6 changed files with 36 additions and 13 deletions

View File

@ -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},

View File

@ -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. */

View File

@ -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;

View File

@ -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. */

View File

@ -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)
{

View 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 */