mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-01 05:48:26 +00:00
Bug 709885 - Simplify read barriers for shapes and types (r=bhackett)
This commit is contained in:
parent
6c18b646e6
commit
45d61bacbe
@ -426,6 +426,7 @@ class ReadBarriered
|
||||
T *value;
|
||||
|
||||
public:
|
||||
ReadBarriered() : value(NULL) {}
|
||||
ReadBarriered(T *value) : value(value) {}
|
||||
|
||||
T *get() const {
|
||||
@ -437,6 +438,9 @@ class ReadBarriered
|
||||
|
||||
operator T*() const { return get(); }
|
||||
|
||||
T &operator*() const { return *get(); }
|
||||
T *operator->() const { return get(); }
|
||||
|
||||
T *unsafeGet() { return value; }
|
||||
|
||||
void set(T *v) { value = v; }
|
||||
|
@ -2617,7 +2617,7 @@ struct types::ObjectTableKey
|
||||
|
||||
struct types::ObjectTableEntry
|
||||
{
|
||||
TypeObject *object;
|
||||
ReadBarriered<TypeObject> object;
|
||||
Type *types;
|
||||
};
|
||||
|
||||
@ -5837,9 +5837,6 @@ JSObject::getNewType(JSContext *cx, JSFunction *fun)
|
||||
if (type->newScript && type->newScript->fun != fun)
|
||||
type->clearNewScript(cx);
|
||||
|
||||
if (cx->compartment->needsBarrier())
|
||||
TypeObject::readBarrier(type);
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
@ -5905,9 +5902,6 @@ JSCompartment::getLazyType(JSContext *cx, JSObject *proto)
|
||||
TypeObject *type = *p;
|
||||
JS_ASSERT(type->lazy());
|
||||
|
||||
if (cx->compartment->needsBarrier())
|
||||
TypeObject::readBarrier(type);
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
|
@ -898,7 +898,7 @@ struct TypeObjectEntry
|
||||
static inline HashNumber hash(JSObject *base);
|
||||
static inline bool match(TypeObject *key, JSObject *lookup);
|
||||
};
|
||||
typedef HashSet<TypeObject *, TypeObjectEntry, SystemAllocPolicy> TypeObjectSet;
|
||||
typedef HashSet<ReadBarriered<TypeObject>, TypeObjectEntry, SystemAllocPolicy> TypeObjectSet;
|
||||
|
||||
/*
|
||||
* Call to mark a script's arguments as having been created, recompile any
|
||||
@ -1120,14 +1120,14 @@ class TypeScript
|
||||
};
|
||||
|
||||
struct ArrayTableKey;
|
||||
typedef HashMap<ArrayTableKey,TypeObject*,ArrayTableKey,SystemAllocPolicy> ArrayTypeTable;
|
||||
typedef HashMap<ArrayTableKey,ReadBarriered<TypeObject>,ArrayTableKey,SystemAllocPolicy> ArrayTypeTable;
|
||||
|
||||
struct ObjectTableKey;
|
||||
struct ObjectTableEntry;
|
||||
typedef HashMap<ObjectTableKey,ObjectTableEntry,ObjectTableKey,SystemAllocPolicy> ObjectTypeTable;
|
||||
|
||||
struct AllocationSiteKey;
|
||||
typedef HashMap<AllocationSiteKey,TypeObject*,AllocationSiteKey,SystemAllocPolicy> AllocationSiteTable;
|
||||
typedef HashMap<AllocationSiteKey,ReadBarriered<TypeObject>,AllocationSiteKey,SystemAllocPolicy> AllocationSiteTable;
|
||||
|
||||
/* Type information for a compartment. */
|
||||
struct TypeCompartment
|
||||
|
@ -1279,9 +1279,8 @@ TypeObject::readBarrier(TypeObject *type)
|
||||
{
|
||||
#ifdef JSGC_INCREMENTAL
|
||||
JSCompartment *comp = type->compartment();
|
||||
JS_ASSERT(comp->needsBarrier());
|
||||
|
||||
MarkTypeObjectUnbarriered(comp->barrierTracer(), type, "read barrier");
|
||||
if (comp->needsBarrier())
|
||||
MarkTypeObjectUnbarriered(comp->barrierTracer(), type, "read barrier");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1275,14 +1275,8 @@ BaseShape::getUnowned(JSContext *cx, const BaseShape &base)
|
||||
|
||||
BaseShapeSet::AddPtr p = table.lookupForAdd(&base);
|
||||
|
||||
if (p) {
|
||||
UnownedBaseShape *base = *p;
|
||||
|
||||
if (cx->compartment->needsBarrier())
|
||||
BaseShape::readBarrier(base);
|
||||
|
||||
return base;
|
||||
}
|
||||
if (p)
|
||||
return *p;
|
||||
|
||||
BaseShape *nbase_ = js_NewGCBaseShape(cx);
|
||||
if (!nbase_)
|
||||
@ -1382,14 +1376,8 @@ EmptyShape::getInitialShape(JSContext *cx, Class *clasp, JSObject *proto, JSObje
|
||||
|
||||
InitialShapeSet::AddPtr p = table.lookupForAdd(lookup);
|
||||
|
||||
if (p) {
|
||||
Shape *shape = p->shape;
|
||||
|
||||
if (cx->compartment->needsBarrier())
|
||||
Shape::readBarrier(shape);
|
||||
|
||||
return shape;
|
||||
}
|
||||
if (p)
|
||||
return p->shape;
|
||||
|
||||
BaseShape base(clasp, parent, objectFlags);
|
||||
UnownedBaseShape *nbase = BaseShape::getUnowned(cx, base);
|
||||
|
@ -493,7 +493,7 @@ struct BaseShapeEntry
|
||||
static inline HashNumber hash(const BaseShape *base);
|
||||
static inline bool match(UnownedBaseShape *key, const BaseShape *lookup);
|
||||
};
|
||||
typedef HashSet<UnownedBaseShape *, BaseShapeEntry, SystemAllocPolicy> BaseShapeSet;
|
||||
typedef HashSet<ReadBarriered<UnownedBaseShape>, BaseShapeEntry, SystemAllocPolicy> BaseShapeSet;
|
||||
|
||||
struct Shape : public js::gc::Cell
|
||||
{
|
||||
@ -975,7 +975,7 @@ struct InitialShapeEntry
|
||||
* certain classes (e.g. String, RegExp) which may add certain baked-in
|
||||
* properties.
|
||||
*/
|
||||
js::Shape *shape;
|
||||
ReadBarriered<Shape> shape;
|
||||
|
||||
/*
|
||||
* Matching prototype for the entry. The shape of an object determines its
|
||||
|
@ -362,9 +362,8 @@ Shape::readBarrier(const Shape *shape)
|
||||
{
|
||||
#ifdef JSGC_INCREMENTAL
|
||||
JSCompartment *comp = shape->compartment();
|
||||
JS_ASSERT(comp->needsBarrier());
|
||||
|
||||
MarkShapeUnbarriered(comp->barrierTracer(), shape, "read barrier");
|
||||
if (comp->needsBarrier())
|
||||
MarkShapeUnbarriered(comp->barrierTracer(), shape, "read barrier");
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -391,9 +390,8 @@ BaseShape::readBarrier(BaseShape *base)
|
||||
{
|
||||
#ifdef JSGC_INCREMENTAL
|
||||
JSCompartment *comp = base->compartment();
|
||||
JS_ASSERT(comp->needsBarrier());
|
||||
|
||||
MarkBaseShapeUnbarriered(comp->barrierTracer(), base, "read barrier");
|
||||
if (comp->needsBarrier())
|
||||
MarkBaseShapeUnbarriered(comp->barrierTracer(), base, "read barrier");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user