зеркало из https://github.com/mozilla/gecko-dev.git
Speed up adding new properties with a common base shape, bug 704327.
This commit is contained in:
Родитель
3d85556f58
Коммит
370d4dd7e4
|
@ -657,11 +657,16 @@ JSObject::addPropertyInternal(JSContext *cx, jsid id,
|
|||
/* Find or create a property tree node labeled by our arguments. */
|
||||
Shape *shape;
|
||||
{
|
||||
BaseShape base(getClass(), getParent(), lastProperty()->getObjectFlags(),
|
||||
attrs, getter, setter);
|
||||
BaseShape *nbase = BaseShape::getUnowned(cx, base);
|
||||
if (!nbase)
|
||||
return NULL;
|
||||
BaseShape *nbase;
|
||||
if (lastProperty()->base()->matchesGetterSetter(getter, setter)) {
|
||||
nbase = lastProperty()->base();
|
||||
} else {
|
||||
BaseShape base(getClass(), getParent(), lastProperty()->getObjectFlags(),
|
||||
attrs, getter, setter);
|
||||
nbase = BaseShape::getUnowned(cx, base);
|
||||
if (!nbase)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Shape child(nbase, id, slot, numFixedSlots(), attrs, flags, shortid);
|
||||
shape = getChildProperty(cx, lastProperty(), child);
|
||||
|
|
|
@ -412,10 +412,13 @@ class BaseShape : public js::gc::Cell
|
|||
|
||||
inline BaseShape(Class *clasp, JSObject *parent, uint32 objectFlags);
|
||||
inline BaseShape(Class *clasp, JSObject *parent, uint32 objectFlags,
|
||||
uint8 attrs, js::PropertyOp rawGetter, js::StrictPropertyOp rawSetter);
|
||||
uint8 attrs, PropertyOp rawGetter, StrictPropertyOp rawSetter);
|
||||
|
||||
bool isOwned() const { return !!(flags & OWNED_SHAPE); }
|
||||
|
||||
inline bool matchesGetterSetter(PropertyOp rawGetter,
|
||||
StrictPropertyOp rawSetter) const;
|
||||
|
||||
inline void adoptUnowned(UnownedBaseShape *other);
|
||||
inline void setOwned(UnownedBaseShape *unowned);
|
||||
|
||||
|
|
|
@ -108,6 +108,12 @@ BaseShape::BaseShape(Class *clasp, JSObject *parent, uint32 objectFlags,
|
|||
flags |= HAS_SETTER_OBJECT;
|
||||
}
|
||||
|
||||
inline bool
|
||||
BaseShape::matchesGetterSetter(PropertyOp rawGetter, StrictPropertyOp rawSetter) const
|
||||
{
|
||||
return rawGetter == this->rawGetter && rawSetter == this->rawSetter;
|
||||
}
|
||||
|
||||
inline void
|
||||
BaseShape::setParent(JSObject *obj)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче