Fixes for "null instanceof" and class initialization
First issue was that the codegen seemed to expect r0 to contain 0 for
a false result in the null object case. This is a quick fix to make
that true. Given that the code is doing the work of a null check and
pulling out the object's class, the code should probably just pass the
class to the helper function, making this a case of IsAssignableFrom,
not instanceof.
Second issues were related to missing EnsureInitialized calls in two
different code paths, one coming from reflection, one coming from
managed code. New Class::AllocObject assert should help keep us out of
trouble in the future in this area, although perhaps Heap::AllocObject
should have a check as well.
Change-Id: Ib7975b6457481c1ac85135d38f42c6061e6443a0
diff --git a/src/object.h b/src/object.h
index 1a137bd..47aa98d 100644
--- a/src/object.h
+++ b/src/object.h
@@ -191,11 +191,9 @@
// C++ mirror of java.lang.Object
class MANAGED Object {
public:
- static bool InstanceOf(const Object* object, const Class* klass) {
- if (object == NULL) {
- return false;
- }
- return object->InstanceOf(klass);
+ static uint32_t InstanceOfFromCode(const Object* object, const Class* klass) {
+ DCHECK(object != NULL);
+ return object->InstanceOf(klass) ? 1 : 0;
}
static MemberOffset ClassOffset() {
@@ -1295,6 +1293,11 @@
return GetStatus() >= kStatusVerified;
}
+ // Returns true if the class is initializing.
+ bool IsInitializing() const {
+ return GetStatus() >= kStatusInitializing;
+ }
+
// Returns true if the class is initialized.
bool IsInitialized() const {
return GetStatus() == kStatusInitialized;