1.1 --- a/src/ObjectVisitor.h Sun Aug 05 01:28:12 2012 -0700
1.2 +++ b/src/ObjectVisitor.h Sun Aug 05 01:45:37 2012 -0700
1.3 @@ -58,11 +58,11 @@
1.4 Object **ptr = reinterpret_cast<Object **>(array + 1);
1.5 for (unsigned i = 0; i < length; i++)
1.6 this->visit(ptr + i);
1.7 - return FixedArray::SizeFor(length);
1.8 + return array->objSize();
1.9 }
1.10
1.11 size_t iterateByteArray(ByteArray *array) {
1.12 - return ByteArray::SizeFor(array->length());
1.13 + return array->objSize();
1.14 }
1.15
1.16 size_t iterateCode(Object *obj) {
1.17 @@ -110,7 +110,7 @@
1.18 }
1.19
1.20 size_t iterateString(Object *obj) {
1.21 - return String::SizeFor(String::cast(obj)->length());
1.22 + return String::cast(obj)->objSize();
1.23 }
1.24
1.25 size_t iterateArray(Array *array, ArrayMap *map) {
1.26 @@ -134,18 +134,18 @@
1.27 EnvironmentSlotDescriptor *desc = env->slots();
1.28 for (unsigned i = 0; i < length; i++)
1.29 this->visit(desc->type.addr());
1.30 - return env->size();
1.31 + return env->objSize();
1.32 }
1.33
1.34 size_t iterateEnvironmentMap(EnvironmentMap *map) {
1.35 visitField(map, EnvironmentMap::offsetOfSlots());
1.36 - return map->size();
1.37 + return map->objSize();
1.38 }
1.39
1.40 size_t iterateStructMap(StructMap *map) {
1.41 visitField(map, StructMap::offsetOfType());
1.42 visitField(map, StructMap::offsetOfComposed());
1.43 - return map->size();
1.44 + return map->objSize();
1.45 }
1.46
1.47 size_t iterateEnvironment(Environment *env) {
1.48 @@ -154,7 +154,7 @@
1.49 unsigned noffsets = map->traceOffsetCount();
1.50 for (unsigned i = 0; i < noffsets; i++)
1.51 visitField(env, Environment::offsetOfSlotOffset(offsets[i]));
1.52 - return env->size();
1.53 + return env->objSize();
1.54 }
1.55
1.56 size_t iterateStruct(Struct *obj) {
1.57 @@ -163,16 +163,16 @@
1.58 unsigned noffsets = map->traceOffsetCount();
1.59 for (unsigned i = 0; i < noffsets; i++)
1.60 visitField(obj, Struct::offsetOfSlotOffset(offsets[i]));
1.61 - return obj->size();
1.62 + return obj->objSize();
1.63 }
1.64
1.65 - public:
1.66 - size_t iterate(Object *obj) {
1.67 + private:
1.68 + size_t iterateObject(Object *obj) {
1.69 visitField(obj, Object::offsetOfMap());
1.70 return iterate(obj, obj->map());
1.71 }
1.72
1.73 - size_t iterate(Object *obj, Map *map) {
1.74 + size_t iterateObject(Object *obj, Map *map) {
1.75 switch (map->kind()) {
1.76 case MapKind_Type:
1.77 return iterateType(obj);
1.78 @@ -230,20 +230,29 @@
1.79 return sizeof(Map);
1.80 }
1.81 }
1.82 +
1.83 + public:
1.84 + size_t iterate(Object *obj) {
1.85 + return Align(iterateObject(obj), kObjectAlignment);
1.86 + }
1.87 +
1.88 + size_t iterate(Object *obj, Map *map) {
1.89 + return Align(iterateObject(obj, map), kObjectAlignment);
1.90 + }
1.91 };
1.92
1.93 static inline size_t
1.94 -SizeOfObject(Object *obj, Map *map)
1.95 +SizeOfObjectRaw(Object *obj, Map *map)
1.96 {
1.97 switch (map->kind()) {
1.98 case MapKind_Type:
1.99 return sizeof(Type);
1.100
1.101 case MapKind_FixedArray:
1.102 - return FixedArray::SizeFor(FixedArray::cast(obj)->length());
1.103 + return FixedArray::cast(obj)->objSize();
1.104
1.105 case MapKind_ByteArray:
1.106 - return ByteArray::SizeFor(ByteArray::cast(obj)->length());
1.107 + return ByteArray::cast(obj)->objSize();
1.108
1.109 case MapKind_Code:
1.110 return sizeof(Code);
1.111 @@ -261,7 +270,7 @@
1.112 return sizeof(Function);
1.113
1.114 case MapKind_String:
1.115 - return String::SizeFor(String::cast(obj)->length());
1.116 + return String::cast(obj)->objSize();
1.117
1.118 case MapKind_Native:
1.119 return sizeof(Native);
1.120 @@ -270,22 +279,22 @@
1.121 return Align(Array::SizeOf(Array::cast(obj)), kObjectAlignment);
1.122
1.123 case MapKind_Struct:
1.124 - return Struct::cast(obj)->size();
1.125 + return Struct::cast(obj)->objSize();
1.126
1.127 case MapKind_EnvironmentSlotDescriptorArray:
1.128 - return EnvironmentSlotDescriptorArray::cast(obj)->size();
1.129 + return EnvironmentSlotDescriptorArray::cast(obj)->objSize();
1.130
1.131 case MapKind_Environment:
1.132 - return Environment::cast(obj)->size();
1.133 + return Environment::cast(obj)->objSize();
1.134
1.135 case MapKind_MetaArray:
1.136 return sizeof(ArrayMap);
1.137
1.138 case MapKind_MetaEnvironment:
1.139 - return EnvironmentMap::cast(obj)->size();
1.140 + return EnvironmentMap::cast(obj)->objSize();
1.141
1.142 case MapKind_MetaStruct:
1.143 - return StructMap::cast(obj)->size();
1.144 + return StructMap::cast(obj)->objSize();
1.145
1.146 case MapKind_FreeRegion:
1.147 return *reinterpret_cast<size_t *>(reinterpret_cast<Address>(obj + 1));
1.148 @@ -296,6 +305,12 @@
1.149 }
1.150 }
1.151
1.152 +static inline size_t
1.153 +SizeOfObject(Object *obj, Map *map)
1.154 +{
1.155 + return Align(SizeOfObjectRaw(obj, map), kObjectAlignment);
1.156 +}
1.157 +
1.158 class ObjectSizeEvaluator
1.159 {
1.160 public: