return result;
}
-void ArgumentsObject::getCollectables(QVector<Object *> &objects)
+void ArgumentsObject::markObjects()
{
for (int i = 0; i < mappedArguments.size(); ++i) {
Object *o = mappedArguments.at(i).asObject();
if (o)
- objects.append(o);
+ o->mark();
}
- Object::getCollectables(objects);
+ Object::markObjects();
}
bool defineOwnProperty(ExecutionContext *ctx, uint index, const PropertyDescriptor *desc);
- virtual void getCollectables(QVector<Object *> &objects);
+ virtual void markObjects();
};
}
return ok;
}
-void Array::getCollectables(QVector<Object *> &objects) const {
+void Array::markObjects() const
+{
uint i = sparse ? 0 : offset;
for (; i < (uint)values.size(); ++i) {
const PropertyDescriptor &pd = values.at(i);
if (pd.isData()) {
if (Object *o = pd.value.asObject())
- objects.append(o);
+ o->mark();
} else if (pd.isAccessor()) {
if (pd.get)
- objects.append(pd.get);
+ pd.get->mark();
if (pd.set)
- objects.append(pd.set);
+ pd.set->mark();
}
}
}
}
}
- void getCollectables(QVector<Object *> &objects) const;
+ void markObjects() const;
void push_front(Value v) {
if (!sparse) {
return target->hasInstance(ctx, value);
}
-void BoundFunction::getCollectables(QVector<Object *> &objects)
+void BoundFunction::markObjects()
{
- FunctionObject::getCollectables(objects);
- objects.append(target);
+ target->mark();
if (Object *o = boundThis.asObject())
- objects.append(o);
+ o->mark();
for (int i = 0; i < boundArgs.size(); ++i)
if (Object *o = boundArgs.at(i).asObject())
- objects.append(o);
+ o->mark();
+ FunctionObject::markObjects();
}
virtual Value call(ExecutionContext *context, Value thisObject, Value *args, int argc);
virtual Value construct(ExecutionContext *context, Value *args, int argc);
virtual bool hasInstance(ExecutionContext *ctx, const Value &value);
- virtual void getCollectables(QVector<Object *> &objects);
+ virtual void markObjects();
};
} // namespace VM
void *operator new(size_t size, MemoryManager *mm);
void operator delete(void *ptr);
+ inline void mark() {
+ if (markBit)
+ return;
+ markBit = 1;
+ markObjects();
+ }
+
protected:
- virtual void getCollectables(QVector<Object *> &objects) = 0;
+ virtual void markObjects() = 0;
union {
Managed *nextFree;
::memset((void *)(obj + 1), c, size - sizeof(Managed));
}
-std::size_t MemoryManager::mark(const QVector<Object *> &objects)
+void MemoryManager::mark(const QVector<Object *> &objects)
{
- std::size_t marks = 0;
-
- QVector<Object *> kids;
- kids.reserve(32);
-
foreach (Object *o, objects) {
if (!o)
continue;
-
- Managed *obj = o;
- assert(obj->inUse);
- if (obj->markBit == 0) {
- obj->markBit = 1;
- ++marks;
- static_cast<Managed *>(o)->getCollectables(kids);
- marks += mark(kids);
- kids.resize(0);
- }
+ o->mark();
}
- return marks;
+ return;
}
std::size_t MemoryManager::sweep()
private:
void collectRoots(QVector<VM::Object *> &roots) const;
- static std::size_t mark(const QVector<Object *> &objects);
+ static void mark(const QVector<Object *> &objects);
std::size_t sweep();
std::size_t sweep(char *chunkStart, std::size_t chunkSize, size_t size);
pd->value = value;
}
-void Object::getCollectables(QVector<Object *> &objects)
+void Object::markObjects()
{
if (prototype)
- objects.append(prototype);
+ prototype->mark();
if (members) {
for (PropertyTable::iterator it = members->begin(), eit = members->end(); it < eit; ++it) {
PropertyDescriptor &pd = (*it)->descriptor;
if (pd.isData()) {
if (Object *o = pd.value.asObject())
- objects.append(o);
+ o->mark();
} else if (pd.isAccessor()) {
if (pd.get)
- objects.append(pd.get);
+ pd.get->mark();
if (pd.set)
- objects.append(pd.set);
+ pd.set->mark();
}
}
}
- array.getCollectables(objects);
+ array.markObjects();
}
// Section 8.12.1
-void ForEachIteratorObject::getCollectables(QVector<Object *> &objects)
+void ForEachIteratorObject::markObjects()
{
- Object::getCollectables(objects);
+ Object::markObjects();
if (it.object)
- objects.append(it.object);
+ it.object->mark();
}
void defineReadonlyProperty(String *name, Value value);
protected:
- virtual void getCollectables(QVector<Object *> &objects);
+ virtual void markObjects();
friend struct ObjectIterator;
};
Value nextPropertyName() { return it.nextPropertyNameAsString(); }
protected:
- virtual void getCollectables(QVector<Object *> &objects);
+ virtual void markObjects();
};
struct BooleanObject: Object {