Add a context argument to the visitor callback.
Change-Id: I1e49d66043ebe8cbc9cbf5edf167c37bc52fad48
diff --git a/vm/alloc/Verify.c b/vm/alloc/Verify.c
index 0353c9c..2bb8808 100644
--- a/vm/alloc/Verify.c
+++ b/vm/alloc/Verify.c
@@ -52,6 +52,11 @@
verifyReferenceUnmask(addr, 0);
}
+static void visitorCallback(void *addr, void *arg)
+{
+ verifyReference(addr);
+}
+
/*
* Verifies an object reference. Determines the type of the reference
* and dispatches to a specialized verification routine.
@@ -59,7 +64,7 @@
void dvmVerifyObject(const Object *obj)
{
LOGV("Entering dvmVerifyObject(obj=%p)", obj);
- dvmVisitObject((Visitor *)verifyReference, (Object *)obj);
+ dvmVisitObject(visitorCallback, (Object *)obj, NULL);
LOGV("Exiting dvmVerifyObject(obj=%p)", obj);
}
diff --git a/vm/alloc/Visit.c b/vm/alloc/Visit.c
index 103b1f6..8d47220 100644
--- a/vm/alloc/Visit.c
+++ b/vm/alloc/Visit.c
@@ -21,7 +21,7 @@
/*
* Visits the instance fields of a class or data object.
*/
-static void visitInstanceFields(Visitor *visitor, Object *obj)
+static void visitInstanceFields(Visitor *visitor, Object *obj, void *arg)
{
assert(visitor != NULL);
assert(obj != NULL);
@@ -33,7 +33,7 @@
size_t rshift = CLZ(refOffsets);
size_t offset = CLASS_OFFSET_FROM_CLZ(rshift);
Object **ref = BYTE_OFFSET(obj, offset);
- (*visitor)(ref);
+ (*visitor)(ref, arg);
refOffsets &= ~(CLASS_HIGH_BIT >> rshift);
}
} else {
@@ -44,7 +44,7 @@
for (i = 0; i < clazz->ifieldRefCount; ++i, ++field) {
size_t offset = field->byteOffset;
Object **ref = BYTE_OFFSET(obj, offset);
- (*visitor)(ref);
+ (*visitor)(ref, arg);
}
}
}
@@ -54,7 +54,7 @@
/*
* Visits the static fields of a class object.
*/
-static void visitStaticFields(Visitor *visitor, ClassObject *clazz)
+static void visitStaticFields(Visitor *visitor, ClassObject *clazz, void *arg)
{
int i;
@@ -63,7 +63,7 @@
for (i = 0; i < clazz->sfieldCount; ++i) {
char ch = clazz->sfields[i].field.signature[0];
if (ch == '[' || ch == 'L') {
- (*visitor)(&clazz->sfields[i].value.l);
+ (*visitor)(&clazz->sfields[i].value.l, arg);
}
}
}
@@ -71,38 +71,38 @@
/*
* Visit the interfaces of a class object.
*/
-static void visitInterfaces(Visitor *visitor, ClassObject *clazz)
+static void visitInterfaces(Visitor *visitor, ClassObject *clazz, void *arg)
{
int i;
assert(visitor != NULL);
assert(clazz != NULL);
for (i = 0; i < clazz->interfaceCount; ++i) {
- (*visitor)(&clazz->interfaces[i]);
+ (*visitor)(&clazz->interfaces[i], arg);
}
}
/*
* Visits all the references stored in a class object instance.
*/
-static void visitClassObject(Visitor *visitor, ClassObject *obj)
+static void visitClassObject(Visitor *visitor, ClassObject *obj, void *arg)
{
assert(visitor != NULL);
assert(obj != NULL);
LOGV("Entering visitClassObject(visitor=%p,obj=%p)", visitor, obj);
assert(!strcmp(obj->obj.clazz->descriptor, "Ljava/lang/Class;"));
- (*visitor)(&obj->obj.clazz);
+ (*visitor)(&obj->obj.clazz, arg);
if (IS_CLASS_FLAG_SET(obj, CLASS_ISARRAY)) {
- (*visitor)(&obj->elementClass);
+ (*visitor)(&obj->elementClass, arg);
}
if (obj->status > CLASS_IDX) {
- (*visitor)(&obj->super);
+ (*visitor)(&obj->super, arg);
}
- (*visitor)(&obj->classLoader);
- visitInstanceFields(visitor, (Object *)obj);
- visitStaticFields(visitor, obj);
+ (*visitor)(&obj->classLoader, arg);
+ visitInstanceFields(visitor, (Object *)obj, arg);
+ visitStaticFields(visitor, obj, arg);
if (obj->status > CLASS_IDX) {
- visitInterfaces(visitor, obj);
+ visitInterfaces(visitor, obj, arg);
}
LOGV("Exiting visitClassObject(visitor=%p,obj=%p)", visitor, obj);
}
@@ -111,19 +111,19 @@
* Visits the class object and, if the array is typed as an object
* array, all of the array elements.
*/
-static void visitArrayObject(Visitor *visitor, Object *obj)
+static void visitArrayObject(Visitor *visitor, Object *obj, void *arg)
{
assert(visitor != NULL);
assert(obj != NULL);
assert(obj->clazz != NULL);
LOGV("Entering visitArrayObject(visitor=%p,obj=%p)", visitor, obj);
- (*visitor)(&obj->clazz);
+ (*visitor)(&obj->clazz, arg);
if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISOBJECTARRAY)) {
ArrayObject *array = (ArrayObject *)obj;
Object **contents = (Object **)array->contents;
size_t i;
for (i = 0; i < array->length; ++i) {
- (*visitor)(&contents[i]);
+ (*visitor)(&contents[i], arg);
}
}
LOGV("Exiting visitArrayObject(visitor=%p,obj=%p)", visitor, obj);
@@ -133,18 +133,18 @@
* Visits the class object and reference typed instance fields of a
* data object.
*/
-static void visitDataObject(Visitor *visitor, Object *obj)
+static void visitDataObject(Visitor *visitor, Object *obj, void *arg)
{
assert(visitor != NULL);
assert(obj != NULL);
assert(obj->clazz != NULL);
LOGV("Entering visitDataObject(visitor=%p,obj=%p)", visitor, obj);
- (*visitor)(&obj->clazz);
- visitInstanceFields(visitor, obj);
+ (*visitor)(&obj->clazz, arg);
+ visitInstanceFields(visitor, obj, arg);
if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISREFERENCE)) {
size_t offset = gDvm.offJavaLangRefReference_referent;
Object **ref = BYTE_OFFSET(obj, offset);
- (*visitor)(ref);
+ (*visitor)(ref, arg);
}
LOGV("Exiting visitDataObject(visitor=%p,obj=%p)", visitor, obj);
}
@@ -152,18 +152,18 @@
/*
* Visits all of the reference stored in an object.
*/
-void dvmVisitObject(Visitor *visitor, Object *obj)
+void dvmVisitObject(Visitor *visitor, Object *obj, void *arg)
{
assert(visitor != NULL);
assert(obj != NULL);
assert(obj->clazz != NULL);
LOGV("Entering dvmVisitObject(visitor=%p,obj=%p)", visitor, obj);
if (obj->clazz == gDvm.classJavaLangClass) {
- visitClassObject(visitor, (ClassObject *)obj);
+ visitClassObject(visitor, (ClassObject *)obj, arg);
} else if (IS_CLASS_FLAG_SET(obj->clazz, CLASS_ISARRAY)) {
- visitArrayObject(visitor, obj);
+ visitArrayObject(visitor, obj, arg);
} else {
- visitDataObject(visitor, obj);
+ visitDataObject(visitor, obj, arg);
}
LOGV("Exiting dvmVisitObject(visitor=%p,obj=%p)", visitor, obj);
}
diff --git a/vm/alloc/Visit.h b/vm/alloc/Visit.h
index 5bc9b60..343d567 100644
--- a/vm/alloc/Visit.h
+++ b/vm/alloc/Visit.h
@@ -19,8 +19,8 @@
#include "Dalvik.h"
-typedef void Visitor(void *obj);
+typedef void Visitor(void *obj, void *arg);
-void dvmVisitObject(Visitor *visitor, Object *obj);
+void dvmVisitObject(Visitor *visitor, Object *obj, void *arg);
#endif /* _DALVIK_ALLOC_VISIT */