jitcraft/ObjectVisitor.h
changeset 85 06a0015b6a5c
parent 72 40746ab0a30b
     1.1 --- a/jitcraft/ObjectVisitor.h	Fri Jul 20 00:03:10 2012 -0700
     1.2 +++ b/jitcraft/ObjectVisitor.h	Mon Jul 23 01:19:44 2012 -0700
     1.3 @@ -28,6 +28,7 @@
     1.4  #include "Functions.h"
     1.5  #include "Array.h"
     1.6  #include "Strings.h"
     1.7 +#include "Environments.h"
     1.8  
     1.9  namespace ke {
    1.10  
    1.11 @@ -82,6 +83,8 @@
    1.12          visitField(obj, Module::offsetOfPublics());
    1.13          visitField(obj, Module::offsetOfNatives());
    1.14          visitField(obj, Module::offsetOfFile());
    1.15 +        visitField(obj, Module::offsetOfEnvironment());
    1.16 +        visitField(obj, Module::offsetOfCode());
    1.17          return sizeof(Module);
    1.18      }
    1.19  
    1.20 @@ -119,6 +122,28 @@
    1.21          return sizeof(ArrayMap);
    1.22      }
    1.23  
    1.24 +    size_t iterateEnvironmentSlotDescriptorArray(EnvironmentSlotDescriptorArray *env) {
    1.25 +        unsigned length = env->length();
    1.26 +        EnvironmentSlotDescriptor *desc = env->slots();
    1.27 +        for (unsigned i = 0; i < length; i++)
    1.28 +            this->visit(desc->type.addr());
    1.29 +        return env->size();
    1.30 +    }
    1.31 +
    1.32 +    size_t iterateEnvironmentMap(EnvironmentMap *map) {
    1.33 +        visitField(map, EnvironmentMap::offsetOfSlots());
    1.34 +        return map->size();
    1.35 +    }
    1.36 +
    1.37 +    size_t iterateEnvironment(Environment *env) {
    1.38 +        EnvironmentMap *map = env->map();
    1.39 +        const unsigned *offsets = map->traceOffsets();
    1.40 +        unsigned noffsets = map->traceOffsetCount();
    1.41 +        for (unsigned i = 0; i < noffsets; i++)
    1.42 +            visitField(env, Environment::offsetOfSlotOffset(offsets[i]));
    1.43 +        return env->size();
    1.44 +    }
    1.45 +
    1.46    public:
    1.47      size_t iterate(Object *obj) {
    1.48          visitField(obj, Object::offsetOfMap());
    1.49 @@ -154,12 +179,21 @@
    1.50            case MapKind_Array:
    1.51              return Align(iterateArray(Array::cast(obj), ArrayMap::cast(map)), kObjectAlignment);
    1.52  
    1.53 +          case MapKind_EnvironmentSlotDescriptorArray:
    1.54 +            return iterateEnvironmentSlotDescriptorArray(EnvironmentSlotDescriptorArray::cast(obj));
    1.55 +
    1.56 +          case MapKind_Environment:
    1.57 +            return iterateEnvironment(Environment::cast(obj));
    1.58 +
    1.59            case MapKind_Native:
    1.60              return iterateNative(obj);
    1.61  
    1.62            case MapKind_MetaArray:
    1.63              return iterateArrayMap(ArrayMap::cast(obj));
    1.64  
    1.65 +          case MapKind_MetaEnvironment:
    1.66 +            return iterateEnvironmentMap(EnvironmentMap::cast(obj));
    1.67 +
    1.68            default:
    1.69              assert(map->kind() == MapKind_Meta);
    1.70              return sizeof(Map);
    1.71 @@ -201,9 +235,18 @@
    1.72        case MapKind_Array:
    1.73          return Align(Array::SizeOf(Array::cast(obj)), kObjectAlignment);
    1.74  
    1.75 +      case MapKind_EnvironmentSlotDescriptorArray:
    1.76 +        return EnvironmentSlotDescriptorArray::cast(obj)->size();
    1.77 +
    1.78 +      case MapKind_Environment:
    1.79 +        return Environment::cast(obj)->size();
    1.80 +
    1.81        case MapKind_MetaArray:
    1.82          return sizeof(ArrayMap);
    1.83  
    1.84 +      case MapKind_MetaEnvironment:
    1.85 +        return EnvironmentMap::cast(obj)->size();
    1.86 +
    1.87        case MapKind_FreeRegion:
    1.88          return *reinterpret_cast<size_t *>(reinterpret_cast<Address>(obj + 1));
    1.89