| Index: src/vm/program.cc
|
| diff --git a/src/vm/program.cc b/src/vm/program.cc
|
| index b7abaa58eff20c3fcdc84bbf33a17fed9bfb3ce0..5a896956709b8b0dc736c169ba35574fc2112b0e 100644
|
| --- a/src/vm/program.cc
|
| +++ b/src/vm/program.cc
|
| @@ -126,6 +126,8 @@ Process* Program::ProcessSpawnForMain(List<List<uint8>> arguments) {
|
| PrintStatistics();
|
| }
|
|
|
| + VerifyObjectPlacements();
|
| +
|
| Process* process = SpawnProcess(NULL);
|
|
|
| // TODO(erikcorry): This is not valid for multiple programs, where the
|
| @@ -352,6 +354,8 @@ void Program::FinishProgramGC() {
|
|
|
| if (debug_info_ != NULL) debug_info_->UpdateBreakpoints();
|
|
|
| + VerifyObjectPlacements();
|
| +
|
| if (Flags::validate_heaps) ValidateHeapsAreConsistent();
|
| }
|
|
|
| @@ -805,6 +809,15 @@ void Program::Initialize() {
|
| null_object_ =
|
| reinterpret_cast<Instance*>(heap()->Allocate(null_format.fixed_size()));
|
|
|
| + InstanceFormat false_format =
|
| + InstanceFormat::instance_format(0, InstanceFormat::FALSE_MARKER);
|
| + uword false_address =
|
| + HeapObject::cast(heap()->Allocate(false_format.fixed_size()))->address();
|
| + InstanceFormat true_format =
|
| + InstanceFormat::instance_format(0, InstanceFormat::TRUE_MARKER);
|
| + uword true_address =
|
| + HeapObject::cast(heap()->Allocate(true_format.fixed_size()))->address();
|
| +
|
| meta_class_ = Class::cast(heap()->CreateMetaClass());
|
|
|
| {
|
| @@ -991,25 +1004,21 @@ void Program::Initialize() {
|
| }
|
|
|
| { // Create False class and the false object.
|
| - InstanceFormat format =
|
| - InstanceFormat::instance_format(0, InstanceFormat::FALSE_MARKER);
|
| - Class* false_class =
|
| - Class::cast(heap()->CreateClass(format, meta_class_, null_object_));
|
| + Class* false_class = Class::cast(
|
| + heap()->CreateClass(false_format, meta_class_, null_object_));
|
| false_class->set_super_class(bool_class_);
|
| false_class->set_methods(empty_array_);
|
| false_object_ = Instance::cast(
|
| - heap()->CreateInstance(false_class, null_object(), true));
|
| + heap()->CreateBooleanObject(false_address, false_class, null_object()));
|
| }
|
|
|
| { // Create True class and the true object.
|
| - InstanceFormat format =
|
| - InstanceFormat::instance_format(0, InstanceFormat::TRUE_MARKER);
|
| - Class* true_class =
|
| - Class::cast(heap()->CreateClass(format, meta_class_, null_object_));
|
| + Class* true_class = Class::cast(
|
| + heap()->CreateClass(true_format, meta_class_, null_object_));
|
| true_class->set_super_class(bool_class_);
|
| true_class->set_methods(empty_array_);
|
| - true_object_ =
|
| - Instance::cast(heap()->CreateInstance(true_class, null_object(), true));
|
| + true_object_ = Instance::cast(
|
| + heap()->CreateBooleanObject(true_address, true_class, null_object()));
|
| }
|
|
|
| { // Create stack overflow error object.
|
| @@ -1036,9 +1045,20 @@ void Program::Initialize() {
|
| CreateStringFromAscii(StringFromCharZ("Illegal state.")));
|
|
|
| native_failure_result_ = null_object_;
|
| + VerifyObjectPlacements();
|
| +}
|
| +
|
| +void Program::VerifyObjectPlacements() {
|
| + uword n = reinterpret_cast<uword>(null_object_);
|
| + uword f = reinterpret_cast<uword>(false_object_);
|
| + uword t = reinterpret_cast<uword>(true_object_);
|
| + ASSERT(f - n == 2 * kWordSize);
|
| + ASSERT(t - f == 2 * kWordSize);
|
| }
|
|
|
| void Program::IterateRoots(PointerVisitor* visitor) {
|
| + VerifyObjectPlacements();
|
| +
|
| IterateRootsIgnoringSession(visitor);
|
| if (debug_info_ != NULL) {
|
| debug_info_->VisitProgramPointers(visitor);
|
|
|