Add an Array::Alloc convenience for the compiler.
Change-Id: Ie65321d7439ac0ff0b4a39cb507710df088baa6d
diff --git a/src/object.cc b/src/object.cc
index 8765713..bfa200a 100644
--- a/src/object.cc
+++ b/src/object.cc
@@ -14,6 +14,10 @@
namespace art {
+Array* Array::Alloc(Class* array_class, size_t component_count) {
+ return Alloc(array_class, component_count, array_class->GetComponentSize());
+}
+
bool Class::Implements(const Class* klass) const {
DCHECK(klass != NULL);
DCHECK(klass->IsInterface());
diff --git a/src/object.h b/src/object.h
index 8efa059..ca09d07 100644
--- a/src/object.h
+++ b/src/object.h
@@ -604,6 +604,10 @@
return sizeof(Array) + component_count * component_size;
}
+ // A convenience for code that doesn't know the component size,
+ // and doesn't want to have to work it out itself.
+ static Array* Alloc(Class* array_class, size_t component_count);
+
static Array* Alloc(Class* array_class,
size_t component_count,
size_t component_size) {
diff --git a/src/object_test.cc b/src/object_test.cc
index c757297..c517459 100644
--- a/src/object_test.cc
+++ b/src/object_test.cc
@@ -86,6 +86,20 @@
oa->GetClass()->GetInterface(1));
}
+TEST_F(ObjectTest, AllocArray) {
+ Class* c = class_linker_->FindSystemClass("[I");
+ Array* a = Array::Alloc(c, 1);
+ ASSERT_TRUE(c == a->GetClass());
+
+ c = class_linker_->FindSystemClass("[Ljava/lang/Object;");
+ a = Array::Alloc(c, 1);
+ ASSERT_TRUE(c == a->GetClass());
+
+ c = class_linker_->FindSystemClass("[[Ljava/lang/Object;");
+ a = Array::Alloc(c, 1);
+ ASSERT_TRUE(c == a->GetClass());
+}
+
template<typename ArrayT>
void TestPrimitiveArray(ClassLinker* cl) {
typedef typename ArrayT::ElementType T;