Add a method to get the contents of an XArray so we can index in
it really fast, or iterate over it. This is dangerous and breaks
the nice abstraction (sigh).
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11122 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_xarray.c b/coregrind/m_xarray.c
index 9b2baee..cdcf978 100644
--- a/coregrind/m_xarray.c
+++ b/coregrind/m_xarray.c
@@ -306,6 +306,16 @@
xa->usedsizeE -= n;
}
+void VG_(getContentsXA_UNSAFE)( XArray* xao,
+ /*OUT*/void** ctsP,
+ /*OUT*/Word* usedP )
+{
+ struct _XArray* xa = (struct _XArray*)xao;
+ vg_assert(xa);
+ *ctsP = (void*)xa->arr;
+ *usedP = xa->usedsizeE;
+}
+
/* --------- Printeffery --------- */
static void add_char_to_XA ( HChar c, void* opaque )
diff --git a/include/pub_tool_xarray.h b/include/pub_tool_xarray.h
index 8d2d32b..cd1b02e 100644
--- a/include/pub_tool_xarray.h
+++ b/include/pub_tool_xarray.h
@@ -125,6 +125,16 @@
is NULL, in which case the parent's cost-center is used. */
extern XArray* VG_(cloneXA)( HChar* cc, XArray* xa );
+/* Get the raw array and size so callers can index it really fast.
+ This is dangerous in the sense that there's no range or
+ anything-else checking. It's also dangerous in that if
+ VG_(addToXA) is used, the contents may be re-located without
+ warning, hence making the contents address returned here
+ invalid. */
+extern void VG_(getContentsXA_UNSAFE)( XArray* sr,
+ /*OUT*/void** ctsP,
+ /*OUT*/Word* usedP );
+
/* Convenience function: printf into an XArray of HChar, adding stuff
at the end. This is very convenient for concocting arbitrary
length printf output in an XArray. Note that the resulting string