]> granicus.if.org Git - gc/commitdiff
Add GC_is_heap_ptr() to GC API
authorIvan Maidanski <ivmai@mail.ru>
Thu, 29 Dec 2011 12:12:37 +0000 (16:12 +0400)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 29 Dec 2011 12:12:37 +0000 (16:12 +0400)
* include/gc.h (GC_is_heap_ptr): New API function declaration.
* misc.c (GC_is_heap_ptr): New function.
* tests/test.c (run_one_test): Add GC_is_heap_ptr tests.

include/gc.h
misc.c
tests/test.c

index a7fd449085bbb1b8bd135ab71a483317b606593f..a6eac699ec7aa55d25a9a46504d8d21b0c15ef7d 100644 (file)
@@ -410,6 +410,12 @@ GC_API void GC_CALL GC_end_stubborn_change(void *);
 /* GC_free.                                                             */
 GC_API void * GC_CALL GC_base(void * /* displaced_pointer */);
 
+/* Return TRUE if and only if the argument points to somewhere in GC    */
+/* heap.  Primary use is as a fast alternative to GC_base to check      */
+/* whether the pointed object is allocated by GC or not.  It is assumed */
+/* that the collector is already initialized.                           */
+GC_API int GC_CALL GC_is_heap_ptr(const void *);
+
 /* Given a pointer to the base of an object, return its size in bytes.  */
 /* The returned size may be slightly larger than what was originally    */
 /* requested.                                                           */
diff --git a/misc.c b/misc.c
index 18cc44d569b6e2b6036d6d210cb24943831e3a14..63262e1e6afc6358a18a97d2553872d974410792 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -391,6 +391,15 @@ GC_API void * GC_CALL GC_base(void * p)
     return((void *)r);
 }
 
+/* Return TRUE if and only if p points to somewhere in GC heap. */
+GC_API int GC_CALL GC_is_heap_ptr(const void *p)
+{
+    bottom_index *bi;
+
+    GC_ASSERT(GC_is_initialized);
+    GET_BI(p, bi);
+    return HDR_FROM_BI(bi, p) != 0;
+}
 
 /* Return the size of an object, given a pointer to its base.           */
 /* (For small objects this also happens to work from interior pointers, */
index 9802f34e85d6c00816f2955f443de64a735dcfd6..e51f74cf0c0d903e27e1ad33537b5fe58831c520 100644 (file)
@@ -1105,6 +1105,18 @@ void run_one_test(void)
         GC_printf("GC_base(heap ptr) produced incorrect result\n");
         FAIL;
       }
+      if (!GC_is_heap_ptr(x)) {
+        GC_printf("GC_is_heap_ptr(heap_ptr) produced incorrect result\n");
+        FAIL;
+      }
+      if (GC_is_heap_ptr(&x)) {
+        GC_printf("GC_is_heap_ptr(&local_var) produced incorrect result\n");
+        FAIL;
+      }
+      if (GC_is_heap_ptr(&fail_count) || GC_is_heap_ptr(NULL)) {
+        GC_printf("GC_is_heap_ptr(&global_var) produced incorrect result\n");
+        FAIL;
+      }
       (void)GC_PRE_INCR(x, 0);
       (void)GC_POST_INCR(x);
       (void)GC_POST_DECR(x);