src/ObjectVisitor.h
changeset 161 b3f0aaee735a
parent 155 7926a7921fa3
child 168 4d0fff61d65e
     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: