2d3775a1b1
Change 6302 description: - Wire the stack frame iterator to use stack maps for traversing objects if there are stack maps in the code object. If there are no stack maps it still does the old style stack frame traversal between fp and sp looking for tagged pointers. - Added a mechanism to be able to iterate over the code space and look for a particular object. Review URL: https://chromiumcodereview.appspot.com//10030001 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@6331 260f80e4-7a28-3924-810f-c04153c831b5
104 lines
3.1 KiB
C++
104 lines
3.1 KiB
C++
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#include "platform/assert.h"
|
|
#include "vm/bitmap.h"
|
|
#include "vm/object.h"
|
|
#include "vm/unit_test.h"
|
|
|
|
namespace dart {
|
|
|
|
TEST_CASE(BitmapBuilder) {
|
|
// Test basic bit map builder operations.
|
|
BitmapBuilder* bmap1_builder = new BitmapBuilder();
|
|
|
|
EXPECT_EQ(-1, bmap1_builder->Maximum());
|
|
EXPECT_EQ(-1, bmap1_builder->Minimum());
|
|
|
|
bool value = true;
|
|
for (int32_t i = 0; i < 128; i++) {
|
|
bmap1_builder->Set(i, value);
|
|
value = !value;
|
|
}
|
|
value = true;
|
|
for (int32_t i = 0; i < 128; i++) {
|
|
EXPECT_EQ(value, bmap1_builder->Get(i));
|
|
value = !value;
|
|
}
|
|
value = true;
|
|
for (int32_t i = 0; i < 1024; i++) {
|
|
bmap1_builder->Set(i, value);
|
|
value = !value;
|
|
}
|
|
value = true;
|
|
for (int32_t i = 0; i < 1024; i++) {
|
|
EXPECT_EQ(value, bmap1_builder->Get(i));
|
|
value = !value;
|
|
}
|
|
// Create a Bitmap object from the builder and verify it's contents.
|
|
const Stackmap& bmap1 = Stackmap::Handle(Stackmap::New(0, bmap1_builder));
|
|
EXPECT_EQ(1022, bmap1_builder->Maximum());
|
|
EXPECT_EQ(0, bmap1_builder->Minimum());
|
|
OS::Print("%s\n", bmap1.ToCString());
|
|
value = true;
|
|
for (int32_t i = 0; i < 1024; i++) {
|
|
EXPECT_EQ(value, bmap1.IsObject(i));
|
|
value = !value;
|
|
}
|
|
EXPECT(!bmap1.IsObject(2056)); // Out of range so returns false.
|
|
|
|
// Test the SetRange function in the builder.
|
|
bmap1_builder->SetRange(0, 256, false);
|
|
bmap1_builder->SetRange(257, 1024, true);
|
|
bmap1_builder->SetRange(1025, 2048, false);
|
|
for (int32_t i = 0; i <= 256; i++) {
|
|
EXPECT(!bmap1_builder->Get(i));
|
|
}
|
|
for (int32_t i = 257; i <= 1024; i++) {
|
|
EXPECT(bmap1_builder->Get(i));
|
|
}
|
|
for (int32_t i = 1025; i <= 2048; i++) {
|
|
EXPECT(!bmap1_builder->Get(i));
|
|
}
|
|
const Stackmap& bmap2 = Stackmap::Handle(Stackmap::New(0, bmap1_builder));
|
|
EXPECT_EQ(1024, bmap1_builder->Maximum());
|
|
EXPECT_EQ(257, bmap1_builder->Minimum());
|
|
for (int32_t i = 0; i <= 256; i++) {
|
|
EXPECT(!bmap2.IsObject(i));
|
|
}
|
|
for (int32_t i = 257; i <= 1024; i++) {
|
|
EXPECT(bmap2.IsObject(i));
|
|
}
|
|
for (int32_t i = 1025; i <= 2048; i++) {
|
|
EXPECT(!bmap2.IsObject(i));
|
|
}
|
|
|
|
// Test the functionality to copy a Stackmap object into a builder.
|
|
BitmapBuilder* bmap2_builder = new BitmapBuilder();
|
|
bmap2_builder->SetBits(bmap1);
|
|
EXPECT_EQ(1022, bmap2_builder->Maximum());
|
|
EXPECT_EQ(0, bmap2_builder->Minimum());
|
|
value = true;
|
|
for (int32_t i = 0; i < 1024; i++) {
|
|
EXPECT_EQ(value, bmap2_builder->Get(i));
|
|
value = !value;
|
|
}
|
|
|
|
BitmapBuilder* bmap3_builder = new BitmapBuilder();
|
|
bmap3_builder->SetBits(bmap2);
|
|
EXPECT_EQ(1024, bmap3_builder->Maximum());
|
|
EXPECT_EQ(257, bmap3_builder->Minimum());
|
|
for (int32_t i = 0; i <= 256; i++) {
|
|
EXPECT(!bmap3_builder->Get(i));
|
|
}
|
|
for (int32_t i = 257; i <= 1024; i++) {
|
|
EXPECT(bmap3_builder->Get(i));
|
|
}
|
|
for (int32_t i = 1025; i <= 2048; i++) {
|
|
EXPECT(!bmap3_builder->Get(i));
|
|
}
|
|
}
|
|
|
|
} // namespace dart
|