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