diff -r 12807399b953 -r b3f0aaee735a src/ObjectVisitor.h --- a/src/ObjectVisitor.h Sun Aug 05 01:28:12 2012 -0700 +++ b/src/ObjectVisitor.h Sun Aug 05 01:45:37 2012 -0700 @@ -58,11 +58,11 @@ Object **ptr = reinterpret_cast(array + 1); for (unsigned i = 0; i < length; i++) this->visit(ptr + i); - return FixedArray::SizeFor(length); + return array->objSize(); } size_t iterateByteArray(ByteArray *array) { - return ByteArray::SizeFor(array->length()); + return array->objSize(); } size_t iterateCode(Object *obj) { @@ -110,7 +110,7 @@ } size_t iterateString(Object *obj) { - return String::SizeFor(String::cast(obj)->length()); + return String::cast(obj)->objSize(); } size_t iterateArray(Array *array, ArrayMap *map) { @@ -134,18 +134,18 @@ EnvironmentSlotDescriptor *desc = env->slots(); for (unsigned i = 0; i < length; i++) this->visit(desc->type.addr()); - return env->size(); + return env->objSize(); } size_t iterateEnvironmentMap(EnvironmentMap *map) { visitField(map, EnvironmentMap::offsetOfSlots()); - return map->size(); + return map->objSize(); } size_t iterateStructMap(StructMap *map) { visitField(map, StructMap::offsetOfType()); visitField(map, StructMap::offsetOfComposed()); - return map->size(); + return map->objSize(); } size_t iterateEnvironment(Environment *env) { @@ -154,7 +154,7 @@ unsigned noffsets = map->traceOffsetCount(); for (unsigned i = 0; i < noffsets; i++) visitField(env, Environment::offsetOfSlotOffset(offsets[i])); - return env->size(); + return env->objSize(); } size_t iterateStruct(Struct *obj) { @@ -163,16 +163,16 @@ unsigned noffsets = map->traceOffsetCount(); for (unsigned i = 0; i < noffsets; i++) visitField(obj, Struct::offsetOfSlotOffset(offsets[i])); - return obj->size(); + return obj->objSize(); } - public: - size_t iterate(Object *obj) { + private: + size_t iterateObject(Object *obj) { visitField(obj, Object::offsetOfMap()); return iterate(obj, obj->map()); } - size_t iterate(Object *obj, Map *map) { + size_t iterateObject(Object *obj, Map *map) { switch (map->kind()) { case MapKind_Type: return iterateType(obj); @@ -230,20 +230,29 @@ return sizeof(Map); } } + + public: + size_t iterate(Object *obj) { + return Align(iterateObject(obj), kObjectAlignment); + } + + size_t iterate(Object *obj, Map *map) { + return Align(iterateObject(obj, map), kObjectAlignment); + } }; static inline size_t -SizeOfObject(Object *obj, Map *map) +SizeOfObjectRaw(Object *obj, Map *map) { switch (map->kind()) { case MapKind_Type: return sizeof(Type); case MapKind_FixedArray: - return FixedArray::SizeFor(FixedArray::cast(obj)->length()); + return FixedArray::cast(obj)->objSize(); case MapKind_ByteArray: - return ByteArray::SizeFor(ByteArray::cast(obj)->length()); + return ByteArray::cast(obj)->objSize(); case MapKind_Code: return sizeof(Code); @@ -261,7 +270,7 @@ return sizeof(Function); case MapKind_String: - return String::SizeFor(String::cast(obj)->length()); + return String::cast(obj)->objSize(); case MapKind_Native: return sizeof(Native); @@ -270,22 +279,22 @@ return Align(Array::SizeOf(Array::cast(obj)), kObjectAlignment); case MapKind_Struct: - return Struct::cast(obj)->size(); + return Struct::cast(obj)->objSize(); case MapKind_EnvironmentSlotDescriptorArray: - return EnvironmentSlotDescriptorArray::cast(obj)->size(); + return EnvironmentSlotDescriptorArray::cast(obj)->objSize(); case MapKind_Environment: - return Environment::cast(obj)->size(); + return Environment::cast(obj)->objSize(); case MapKind_MetaArray: return sizeof(ArrayMap); case MapKind_MetaEnvironment: - return EnvironmentMap::cast(obj)->size(); + return EnvironmentMap::cast(obj)->objSize(); case MapKind_MetaStruct: - return StructMap::cast(obj)->size(); + return StructMap::cast(obj)->objSize(); case MapKind_FreeRegion: return *reinterpret_cast(reinterpret_cast
(obj + 1)); @@ -296,6 +305,12 @@ } } +static inline size_t +SizeOfObject(Object *obj, Map *map) +{ + return Align(SizeOfObjectRaw(obj, map), kObjectAlignment); +} + class ObjectSizeEvaluator { public: