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