OSDN Git Service

2005-03-02 David Ayers <d.ayers@inode.at>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Mar 2005 19:37:03 +0000 (19:37 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 Mar 2005 19:37:03 +0000 (19:37 +0000)
        PR libobjc/19024
        * Makefile.in (OBJS): Add hash_compat.lo.
        (OBJS_GC): Add hash_compat_gc.lo.
        (hash_compat_gc.lo): New target and rule.
        * objc/hash.h (hash_new, hash_delete, hash_add, hash_remove)
        (hash_next, hash_value_for_key, hash_is_key_in_hash)
        (hash_ptr, hash_string, compare_ptrs, compare_strings): Prefix
        with objc_.  Add deprecated non prefixed inlined versions.
        (OBJC_IGNORE_DEPRECATED_API): New macro to hide deprecated
        declarations.
        * hash.c (hash_new, hash_delete, hash_add, hash_remove, hash_next)
        (hash_value_for_key, hash_is_key_in_hash): Prefix with objc_ and
        update callers.
        * hash_compat.c: New file.
        * archive.c: Update callers.
        * init.c: Likewise.
        * selector.c: Likewise.
        * libobjc.def: Add objc_ versions of hash functions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95793 138bc75d-0d04-0410-961f-82ee72b054a4

libobjc/ChangeLog
libobjc/Makefile.in
libobjc/archive.c
libobjc/hash.c
libobjc/hash_compat.c [new file with mode: 0644]
libobjc/init.c
libobjc/libobjc.def
libobjc/objc/hash.h
libobjc/selector.c

index 1edd668..e9da0f5 100644 (file)
@@ -1,3 +1,24 @@
+2005-03-02  David Ayers  <d.ayers@inode.at>
+
+       PR libobjc/19024
+       * Makefile.in (OBJS): Add hash_compat.lo.
+       (OBJS_GC): Add hash_compat_gc.lo.
+       (hash_compat_gc.lo): New target and rule.
+       * objc/hash.h (hash_new, hash_delete, hash_add, hash_remove)
+       (hash_next, hash_value_for_key, hash_is_key_in_hash)
+       (hash_ptr, hash_string, compare_ptrs, compare_strings): Prefix
+       with objc_.  Add deprecated non prefixed inlined versions.
+       (OBJC_IGNORE_DEPRECATED_API): New macro to hide deprecated
+       declarations.
+       * hash.c (hash_new, hash_delete, hash_add, hash_remove, hash_next)
+       (hash_value_for_key, hash_is_key_in_hash): Prefix with objc_ and
+       update callers.
+       * hash_compat.c: New file.
+       * archive.c: Update callers.
+       * init.c: Likewise.
+       * selector.c: Likewise.
+       * libobjc.def: Add objc_ versions of hash functions.
+
 2005-02-28  Andrew Pinski <pinskia@physics.uc.edu>
 
        PR libobjc/20252
index 3c09183..3290167 100644 (file)
@@ -146,13 +146,13 @@ OBJC_H = hash.h objc-list.h sarray.h objc.h objc-api.h \
 OBJS =    archive.lo class.lo encoding.lo gc.lo hash.lo init.lo linking.lo \
          misc.lo nil_method.lo NXConstStr.lo Object.lo objects.lo \
          Protocol.lo sarray.lo selector.lo sendmsg.lo thr.lo \
-         $(OBJC_THREAD_FILE).lo exception.lo
+         $(OBJC_THREAD_FILE).lo exception.lo hash_compat.lo
 
 OBJS_GC = archive_gc.lo class_gc.lo encoding_gc.lo gc_gc.lo hash_gc.lo \
          init_gc.lo linking_gc.lo misc_gc.lo nil_method_gc.lo \
          NXConstStr_gc.lo Object_gc.lo objects_gc.lo Protocol_gc.lo \
          sarray_gc.lo selector_gc.lo sendmsg_gc.lo thr_gc.lo \
-         $(OBJC_THREAD_FILE)_gc.lo exception_gc.lo
+         $(OBJC_THREAD_FILE)_gc.lo exception_gc.lo hash_compat_gc.lo
 
 runtime-info.h: 
        echo "" > tmp-runtime.m
@@ -183,6 +183,10 @@ hash_gc.lo: hash.c
        $(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
                $(INCLUDES) $<
 
+hash_compat_gc.lo: hash_compat.c
+       $(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
+               $(INCLUDES) $<
+
 init_gc.lo: init.c
        $(LIBTOOL_COMPILE) $(CC) -c -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
                $(INCLUDES) $<
index 096ca69..5c3616c 100644 (file)
@@ -301,12 +301,13 @@ objc_write_string_atomic (struct objc_typed_stream *stream,
                          unsigned char *string, unsigned int nbytes)
 {
   unsigned long key;
-  if ((key = PTR2LONG(hash_value_for_key (stream->stream_table, string))))
+  if ((key = PTR2LONG(objc_hash_value_for_key (stream->stream_table, string))))
     return objc_write_use_common (stream, key);
   else
     {
       int length;
-      hash_add (&stream->stream_table, LONG2PTR(key=PTR2LONG(string)), string);
+      objc_hash_add (&stream->stream_table,
+                    LONG2PTR(key=PTR2LONG(string)), string);
       if ((length = objc_write_register_common (stream, key)))
        return objc_write_string (stream, string, nbytes);
       return length;
@@ -386,7 +387,7 @@ int
 objc_write_object_reference (struct objc_typed_stream *stream, id object)
 {
   unsigned long key;
-  if ((key = PTR2LONG(hash_value_for_key (stream->object_table, object))))
+  if ((key = PTR2LONG(objc_hash_value_for_key (stream->object_table, object))))
     return objc_write_use_common (stream, key);
 
   __objc_write_extension (stream, _BX_OBJREF);
@@ -415,7 +416,7 @@ int
 objc_write_object (struct objc_typed_stream *stream, id object)
 {
   unsigned long key;
-  if ((key = PTR2LONG(hash_value_for_key (stream->object_table, object))))
+  if ((key = PTR2LONG(objc_hash_value_for_key (stream->object_table, object))))
     return objc_write_use_common (stream, key);
 
   else if (object == nil)
@@ -424,7 +425,8 @@ objc_write_object (struct objc_typed_stream *stream, id object)
   else
     {
       int length;
-      hash_add (&stream->object_table, LONG2PTR(key=PTR2LONG(object)), object);
+      objc_hash_add (&stream->object_table,
+                    LONG2PTR(key=PTR2LONG(object)), object);
       if ((length = objc_write_register_common (stream, key)))
        return __objc_write_object (stream, object);
       return length;
@@ -446,12 +448,13 @@ objc_write_class (struct objc_typed_stream *stream,
                         struct objc_class *class)
 {
   unsigned long key;
-  if ((key = PTR2LONG(hash_value_for_key (stream->stream_table, class))))
+  if ((key = PTR2LONG(objc_hash_value_for_key (stream->stream_table, class))))
     return objc_write_use_common (stream, key);
   else
     {
       int length;
-      hash_add (&stream->stream_table, LONG2PTR(key = PTR2LONG(class)), class);
+      objc_hash_add (&stream->stream_table,
+                    LONG2PTR(key = PTR2LONG(class)), class);
       if ((length = objc_write_register_common (stream, key)))
        return __objc_write_class (stream, class);
       return length;
@@ -482,12 +485,13 @@ objc_write_selector (struct objc_typed_stream *stream, SEL selector)
     return __objc_write_selector (stream, selector);
 
   sel_name = sel_get_name (selector);
-  if ((key = PTR2LONG(hash_value_for_key (stream->stream_table, sel_name))))
+  if ((key = PTR2LONG(objc_hash_value_for_key (stream->stream_table,
+                                              sel_name))))
     return objc_write_use_common (stream, key);
   else
     {
       int length;
-      hash_add (&stream->stream_table, 
+      objc_hash_add (&stream->stream_table, 
                LONG2PTR(key = PTR2LONG(sel_name)), (char *) sel_name);
       if ((length = objc_write_register_common (stream, key)))
        return __objc_write_selector (stream, selector);
@@ -755,7 +759,7 @@ objc_read_string (struct objc_typed_stream *stream,
          int length = buf[0]&_B_VALUE;
          (*string) = (char*)objc_malloc (length + 1);
          if (key)
-           hash_add (&stream->stream_table, LONG2PTR(key), *string);
+           objc_hash_add (&stream->stream_table, LONG2PTR(key), *string);
          len = (*stream->read) (stream->physical, *string, length);
          (*string)[length] = '\0';
        }
@@ -765,7 +769,7 @@ objc_read_string (struct objc_typed_stream *stream,
        {
          char *tmp;
          len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         tmp = hash_value_for_key (stream->stream_table, LONG2PTR (key));
+         tmp = objc_hash_value_for_key (stream->stream_table, LONG2PTR (key));
          *string = objc_malloc (strlen (tmp) + 1);
          strcpy (*string, tmp);
        }
@@ -778,7 +782,7 @@ objc_read_string (struct objc_typed_stream *stream,
          if (len) {
            (*string) = (char*)objc_malloc (nbytes + 1);
            if (key)
-             hash_add (&stream->stream_table, LONG2PTR(key), *string);
+             objc_hash_add (&stream->stream_table, LONG2PTR(key), *string);
            len = (*stream->read) (stream->physical, *string, nbytes);
            (*string)[nbytes] = '\0';
          }
@@ -823,7 +827,7 @@ objc_read_object (struct objc_typed_stream *stream, id *object)
 
          /* register? */
          if (key)
-           hash_add (&stream->object_table, LONG2PTR(key), *object);
+           objc_hash_add (&stream->object_table, LONG2PTR(key), *object);
 
          /* send -read: */
          if (__objc_responds_to (*object, read_sel))
@@ -841,17 +845,19 @@ objc_read_object (struct objc_typed_stream *stream, id *object)
          if (key)
            objc_error (nil, OBJC_ERR_BAD_KEY, "cannot register use upcode...");
          len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         (*object) = hash_value_for_key (stream->object_table, LONG2PTR(key));
+         (*object) = objc_hash_value_for_key (stream->object_table,
+                                              LONG2PTR(key));
        }
 
       else if (buf[0] == (_B_EXT | _BX_OBJREF))        /* a forward reference */
        {
          struct objc_list *other;
          len = objc_read_unsigned_long (stream, &key);
-         other = (struct objc_list *) hash_value_for_key (stream->object_refs, 
+         other 
+           = (struct objc_list *) objc_hash_value_for_key (stream->object_refs, 
                                                           LONG2PTR(key));
-         hash_add (&stream->object_refs, LONG2PTR(key), 
-                   (void *)list_cons (object, other));
+         objc_hash_add (&stream->object_refs, LONG2PTR(key), 
+                        (void *)list_cons (object, other));
        }
 
       else if (buf[0] == (_B_EXT | _BX_OBJROOT)) /* a root object */
@@ -898,10 +904,11 @@ objc_read_class (struct objc_typed_stream *stream, Class *class)
 
          /* register */
          if (key)
-           hash_add (&stream->stream_table, LONG2PTR(key), *class);
+           objc_hash_add (&stream->stream_table, LONG2PTR(key), *class);
 
          objc_read_unsigned_long (stream, &version);
-         hash_add (&stream->class_table, (*class)->name, (void *)version);
+         objc_hash_add (&stream->class_table,
+                        (*class)->name, (void *)version);
        }
 
       else if ((buf[0]&_B_CODE) == _B_UCOMM)
@@ -909,7 +916,8 @@ objc_read_class (struct objc_typed_stream *stream, Class *class)
          if (key)
            objc_error (nil, OBJC_ERR_BAD_KEY, "cannot register use upcode...");
          len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         *class = hash_value_for_key (stream->stream_table, LONG2PTR(key));
+         *class = objc_hash_value_for_key (stream->stream_table,
+                                           LONG2PTR(key));
          if (! *class)
            objc_error (nil, OBJC_ERR_BAD_CLASS,
                        "cannot find class for key %lu", key);
@@ -956,7 +964,8 @@ objc_read_selector (struct objc_typed_stream *stream, SEL* selector)
 
          /* register */
          if (key)
-           hash_add (&stream->stream_table, LONG2PTR(key), (void *) *selector);
+           objc_hash_add (&stream->stream_table,
+                          LONG2PTR(key), (void *) *selector);
        }
 
       else if ((buf[0]&_B_CODE) == _B_UCOMM)
@@ -964,8 +973,8 @@ objc_read_selector (struct objc_typed_stream *stream, SEL* selector)
          if (key)
            objc_error (nil, OBJC_ERR_BAD_KEY, "cannot register use upcode...");
          len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key);
-         (*selector) = hash_value_for_key (stream->stream_table, 
-                                           LONG2PTR(key));
+         (*selector) = objc_hash_value_for_key (stream->stream_table, 
+                                                LONG2PTR(key));
        }
 
       else
@@ -1475,54 +1484,54 @@ __objc_write_typed_stream_signature (TypedStream *stream)
 
 static void __objc_finish_write_root_object(struct objc_typed_stream *stream)
 {
-  hash_delete (stream->object_table);
-  stream->object_table = hash_new(64,
-                                 (hash_func_type)hash_ptr,
-                                 (compare_func_type)compare_ptrs);
+  objc_hash_delete (stream->object_table);
+  stream->object_table = objc_hash_new (64,
+                                       (hash_func_type) objc_hash_ptr,
+                                       (compare_func_type) objc_compare_ptrs);
 }
 
 static void __objc_finish_read_root_object(struct objc_typed_stream *stream)
 {
   node_ptr node;
   SEL awake_sel = sel_get_any_uid ("awake");
-  cache_ptr free_list = hash_new (64,
-                                 (hash_func_type) hash_ptr,
-                                 (compare_func_type) compare_ptrs);
+  cache_ptr free_list = objc_hash_new (64,
+                                      (hash_func_type) objc_hash_ptr,
+                                      (compare_func_type) objc_compare_ptrs);
 
   /* resolve object forward references */
-  for (node = hash_next (stream->object_refs, NULL); node;
-       node = hash_next (stream->object_refs, node))
+  for (node = objc_hash_next (stream->object_refs, NULL); node;
+       node = objc_hash_next (stream->object_refs, node))
     {
       struct objc_list *reflist = node->value;
       const void *key = node->key;
-      id object = hash_value_for_key (stream->object_table, key);
+      id object = objc_hash_value_for_key (stream->object_table, key);
       while (reflist)
        {
          *((id*) reflist->head) = object;
-         if (hash_value_for_key (free_list,reflist) == NULL)
-           hash_add (&free_list,reflist,reflist);
+         if (objc_hash_value_for_key (free_list,reflist) == NULL)
+           objc_hash_add (&free_list,reflist,reflist);
 
          reflist = reflist->tail;
        }
     }
     
   /* apply __objc_free to all objects stored in free_list */
-  for (node = hash_next (free_list, NULL); node;
-       node = hash_next (free_list, node))
+  for (node = objc_hash_next (free_list, NULL); node;
+       node = objc_hash_next (free_list, node))
     objc_free ((void *) node->key);
 
-  hash_delete (free_list);
+  objc_hash_delete (free_list);
 
   /* empty object reference table */
-  hash_delete (stream->object_refs);
-  stream->object_refs = hash_new(8, (hash_func_type)hash_ptr,
-                                (compare_func_type)compare_ptrs);
+  objc_hash_delete (stream->object_refs);
+  stream->object_refs = objc_hash_new (8, (hash_func_type) objc_hash_ptr,
+                                      (compare_func_type) objc_compare_ptrs);
   
   /* call -awake for all objects read  */
   if (awake_sel)
     {
-      for (node = hash_next (stream->object_table, NULL); node;
-          node = hash_next (stream->object_table, node))
+      for (node = objc_hash_next (stream->object_table, NULL); node;
+          node = objc_hash_next (stream->object_table, node))
        {
          id object = node->value;
          if (__objc_responds_to (object, awake_sel))
@@ -1531,10 +1540,10 @@ static void __objc_finish_read_root_object(struct objc_typed_stream *stream)
     }
 
   /* empty object table */
-  hash_delete (stream->object_table);
-  stream->object_table = hash_new(64,
-                                 (hash_func_type)hash_ptr,
-                                 (compare_func_type)compare_ptrs);
+  objc_hash_delete (stream->object_table);
+  stream->object_table = objc_hash_new(64,
+                                      (hash_func_type)objc_hash_ptr,
+                                      (compare_func_type)objc_compare_ptrs);
 }
 
 /*
@@ -1548,21 +1557,22 @@ objc_open_typed_stream (FILE *physical, int mode)
 
   s->mode = mode;
   s->physical = physical;
-  s->stream_table = hash_new (64,
-                             (hash_func_type) hash_ptr,
-                             (compare_func_type) compare_ptrs);
-  s->object_table = hash_new (64,
-                             (hash_func_type) hash_ptr,
-                             (compare_func_type) compare_ptrs);
+  s->stream_table = objc_hash_new (64,
+                                  (hash_func_type) objc_hash_ptr,
+                                  (compare_func_type) objc_compare_ptrs);
+  s->object_table = objc_hash_new (64,
+                                  (hash_func_type) objc_hash_ptr,
+                                  (compare_func_type) objc_compare_ptrs);
   s->eof = (objc_typed_eof_func) __objc_feof;
   s->flush = (objc_typed_flush_func) fflush;
   s->writing_root_p = 0;
   if (mode == OBJC_READONLY)
     {
-      s->class_table = hash_new (8, (hash_func_type) hash_string,
-                                (compare_func_type) compare_strings);
-      s->object_refs = hash_new (8, (hash_func_type) hash_ptr,
-                                (compare_func_type) compare_ptrs);
+      s->class_table 
+       = objc_hash_new (8, (hash_func_type) objc_hash_string,
+                        (compare_func_type) objc_compare_strings);
+      s->object_refs = objc_hash_new (8, (hash_func_type) objc_hash_ptr,
+                                     (compare_func_type) objc_compare_ptrs);
       s->read = (objc_typed_read_func) __objc_fread;
       s->write = (objc_typed_write_func) __objc_no_write;
       __objc_read_typed_stream_signature (s);
@@ -1621,12 +1631,12 @@ objc_close_typed_stream (TypedStream *stream)
   if (stream->mode == OBJC_READONLY)
     {
       __objc_finish_read_root_object (stream); /* Just in case... */
-      hash_delete (stream->class_table);
-      hash_delete (stream->object_refs);
+      objc_hash_delete (stream->class_table);
+      objc_hash_delete (stream->object_refs);
     }
 
-  hash_delete (stream->stream_table);
-  hash_delete (stream->object_table);
+  objc_hash_delete (stream->stream_table);
+  objc_hash_delete (stream->object_table);
 
   if (stream->type == (OBJC_MANAGED_STREAM | OBJC_FILE_STREAM))
     fclose ((FILE *)stream->physical);
@@ -1650,7 +1660,8 @@ long
 objc_get_stream_class_version (TypedStream *stream, Class class)
 {
   if (stream->class_table)
-    return PTR2LONG(hash_value_for_key (stream->class_table, class->name));
+    return PTR2LONG(objc_hash_value_for_key (stream->class_table,
+                                            class->name));
   else
     return class_get_version (class);
 }
index cbea81a..e2072b6 100644 (file)
@@ -40,8 +40,8 @@ Boston, MA 02111-1307, USA.  */
   ((cache)->size * 2)
 
 cache_ptr
-hash_new (unsigned int size, hash_func_type hash_func,
-         compare_func_type compare_func)
+objc_hash_new (unsigned int size, hash_func_type hash_func,
+              compare_func_type compare_func)
 {
   cache_ptr cache;
 
@@ -77,7 +77,7 @@ hash_new (unsigned int size, hash_func_type hash_func,
 
 
 void
-hash_delete (cache_ptr cache)
+objc_hash_delete (cache_ptr cache)
 {
   node_ptr node;
   node_ptr next_node;
@@ -85,17 +85,17 @@ hash_delete (cache_ptr cache)
 
   /* Purge all key/value pairs from the table.  */
   /* Step through the nodes one by one and remove every node WITHOUT
-     using hash_next. this makes hash_delete much more efficient. */
+     using objc_hash_next. this makes objc_hash_delete much more efficient. */
   for (i = 0;i < cache->size;i++) {
     if ((node = cache->node_table[i])) {
       /* an entry in the hash table has been found, now step through the
         nodes next in the list and free them. */
       while ((next_node = node->next)) {
-       hash_remove (cache,node->key);
+       objc_hash_remove (cache,node->key);
        node = next_node;
       }
 
-      hash_remove (cache,node->key);
+      objc_hash_remove (cache,node->key);
     }
   }
 
@@ -106,7 +106,7 @@ hash_delete (cache_ptr cache)
 
 
 void
-hash_add (cache_ptr *cachep, const void *key, void *value)
+objc_hash_add (cache_ptr *cachep, const void *key, void *value)
 {
   size_t indx = (*(*cachep)->hash_func)(*cachep, key);
   node_ptr node = (node_ptr) objc_calloc (1, sizeof (struct cache_node));
@@ -149,19 +149,19 @@ hash_add (cache_ptr *cachep, const void *key, void *value)
        primitive functions thereby increasing its
        correctness.  */
     node_ptr node1 = NULL;
-    cache_ptr new = hash_new (EXPANSION (*cachep),
-                             (*cachep)->hash_func,
-                             (*cachep)->compare_func);
+    cache_ptr new = objc_hash_new (EXPANSION (*cachep),
+                                  (*cachep)->hash_func,
+                                  (*cachep)->compare_func);
 
     DEBUG_PRINTF ("Expanding cache %#x from %d to %d\n",
                  (int) *cachep, (*cachep)->size, new->size);
 
     /* Copy the nodes from the first hash table to the new one.  */
-    while ((node1 = hash_next (*cachep, node1)))
-      hash_add (&new, node1->key, node1->value);
+    while ((node1 = objc_hash_next (*cachep, node1)))
+      objc_hash_add (&new, node1->key, node1->value);
 
     /* Trash the old cache.  */
-    hash_delete (*cachep);
+    objc_hash_delete (*cachep);
 
     /* Return a pointer to the new hash table.  */
     *cachep = new;
@@ -170,7 +170,7 @@ hash_add (cache_ptr *cachep, const void *key, void *value)
 
 
 void
-hash_remove (cache_ptr cache, const void *key)
+objc_hash_remove (cache_ptr cache, const void *key)
 {
   size_t indx = (*cache->hash_func)(cache, key);
   node_ptr node = cache->node_table[indx];
@@ -206,7 +206,7 @@ hash_remove (cache_ptr cache, const void *key)
 
 
 node_ptr
-hash_next (cache_ptr cache, node_ptr node)
+objc_hash_next (cache_ptr cache, node_ptr node)
 {
   /* If the scan is being started then reset the last node
      visitied pointer and bucket index.  */
@@ -246,7 +246,7 @@ hash_next (cache_ptr cache, node_ptr node)
    Return NULL if the KEY is not recorded.  */
 
 void *
-hash_value_for_key (cache_ptr cache, const void *key)
+objc_hash_value_for_key (cache_ptr cache, const void *key)
 {
   node_ptr node = cache->node_table[(*cache->hash_func)(cache, key)];
   void *retval = NULL;
@@ -267,7 +267,7 @@ hash_value_for_key (cache_ptr cache, const void *key)
    Return NO if it does not */
 
 BOOL
-hash_is_key_in_hash (cache_ptr cache, const void *key)
+objc_hash_is_key_in_hash (cache_ptr cache, const void *key)
 {
   node_ptr node = cache->node_table[(*cache->hash_func)(cache, key)];
 
diff --git a/libobjc/hash_compat.c b/libobjc/hash_compat.c
new file mode 100644 (file)
index 0000000..46c2738
--- /dev/null
@@ -0,0 +1,97 @@
+/* Binary compatibility hash implementations for Objective C.
+   Copyright (C) 2005 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, if you link this library with files
+   compiled with GCC to produce an executable, this does not cause
+   the resulting executable to be covered by the GNU General Public License.
+   This exception does not however invalidate any other reasons why
+   the executable file might be covered by the GNU General Public License.  */
+
+#define OBJC_IGNORE_DEPRECATED_API 1
+#include "hash.h"
+
+cache_ptr
+hash_new (unsigned int size,
+         hash_func_type hash_func,
+         compare_func_type compare_func)
+{
+  return objc_hash_new(size, hash_func, compare_func);
+}
+
+void
+hash_delete(cache_ptr cache)
+{
+  objc_hash_delete(cache);
+}
+
+void
+hash_add (cache_ptr *cachep, const void *key, void *value)
+{
+  objc_hash_add(cachep, key, value);
+}
+
+void
+hash_remove (cache_ptr cache, const void *key)
+{
+  objc_hash_remove (cache, key);
+}
+
+node_ptr
+hash_next (cache_ptr cache, node_ptr node)
+{
+  return objc_hash_next (cache, node);
+}
+
+void *
+hash_value_for_key (cache_ptr cache, const void *key)
+{
+  return objc_hash_value_for_key (cache, key);
+}
+
+BOOL
+hash_is_key_in_hash (cache_ptr cache, const void *key)
+{
+  return objc_hash_is_key_in_hash (cache, key);
+}
+
+unsigned int
+hash_ptr (cache_ptr cache, const void *key)
+{
+  return objc_hash_ptr (cache, key);
+}
+
+unsigned int 
+hash_string (cache_ptr cache, const void *key)
+{
+  return objc_hash_string (cache, key);
+}
+
+int 
+compare_ptrs (const void *k1, const void *k2)
+{
+  return objc_compare_ptrs (k1, k2);
+}
+
+int 
+compare_strings (const void *k1, const void *k2)
+{
+  return objc_compare_strings (k1, k2);
+}
+
index 33a9338..3eb5386 100644 (file)
@@ -363,10 +363,12 @@ __objc_send_message_in_list (MethodList_t method_list, Class class, SEL op)
       Method_t mth = &method_list->method_list[i];
 
       if (mth->method_name && sel_eq (mth->method_name, op)
-         && ! hash_is_key_in_hash (__objc_load_methods, mth->method_imp))
+         && ! objc_hash_is_key_in_hash (__objc_load_methods, mth->method_imp))
        {
          /* Add this method into the +load hash table */
-         hash_add (&__objc_load_methods, mth->method_imp, mth->method_imp);
+         objc_hash_add (&__objc_load_methods,
+                        mth->method_imp,
+                        mth->method_imp);
 
          DEBUG_PRINTF ("sending +load in class: %s\n", class->name);
 
@@ -538,8 +540,9 @@ __objc_exec_class (Module_t module)
       __objc_init_class_tables ();
       __objc_init_dispatch_tables ();
       __objc_class_tree_list = list_cons (NULL, __objc_class_tree_list);
-      __objc_load_methods
-         = hash_new (128, (hash_func_type)hash_ptr, compare_ptrs);
+      __objc_load_methods = objc_hash_new (128, 
+                                          (hash_func_type)objc_hash_ptr,
+                                          objc_compare_ptrs);
       previous_constructors = 1;
     }
 
index 2443d4c..bd50959 100644 (file)
@@ -22,6 +22,7 @@ LIBRARY libobjc
 EXPORTS
 search_for_method_in_list
 objc_get_uninstalled_dtable
+objc_hash_is_key_in_hash
 hash_is_key_in_hash
 objc_verror
 _objc_load_callback
@@ -155,9 +156,15 @@ sarray_lazy_copy
 sarray_new
 sarray_realloc
 sarray_remove_garbage
+objc_hash_add
 hash_add
+objc_hash_delete
 hash_delete
+objc_hash_new
 hash_new
+objc_hash_next
 hash_next
+objc_hash_remove
 hash_remove
+objc_hash_value_for_key
 hash_value_for_key
index f56e0c0..48e33d3 100644 (file)
@@ -62,7 +62,7 @@ typedef struct cache_node
  *
  * Unfortunately there is a mutual data structure reference problem with this
  * typedef.  Therefore, to remove compiler warnings the functions passed to
- * hash_new will have to be casted to this type. 
+ * objc_hash_new will have to be casted to this type. 
  */
 typedef unsigned int (*hash_func_type) (void *, const void *);
 
@@ -111,25 +111,25 @@ extern cache_ptr module_hash_table, class_hash_table;
 
 /* Allocate and initialize a hash table.  */ 
 
-cache_ptr hash_new (unsigned int size,
-                   hash_func_type hash_func,
-                   compare_func_type compare_func);
+cache_ptr objc_hash_new (unsigned int size,
+                        hash_func_type hash_func,
+                        compare_func_type compare_func);
                        
 /* Deallocate all of the hash nodes and the cache itself.  */
 
-void hash_delete (cache_ptr cache);
+void objc_hash_delete (cache_ptr cache);
 
 /* Add the key/value pair to the hash table.  If the
    hash table reaches a level of fullness then it will be resized. 
                                                    
    assert if the key is already in the hash.  */
 
-void hash_add (cache_ptr *cachep, const void *key, void *value);
+void objc_hash_add (cache_ptr *cachep, const void *key, void *value);
      
 /* Remove the key/value pair from the hash table.  
    assert if the key isn't in the table.  */
 
-void hash_remove (cache_ptr cache, const void *key);
+void objc_hash_remove (cache_ptr cache, const void *key);
 
 /* Used to index through the hash table.  Start with NULL
    to get the first entry.
@@ -140,15 +140,15 @@ void hash_remove (cache_ptr cache, const void *key);
    Cache nodes are returned such that key or value can
    be extracted.  */
 
-node_ptr hash_next (cache_ptr cache, node_ptr node);
+node_ptr objc_hash_next (cache_ptr cache, node_ptr node);
 
 /* Used to return a value from a hash table using a given key.  */
 
-void *hash_value_for_key (cache_ptr cache, const void *key);
+void *objc_hash_value_for_key (cache_ptr cache, const void *key);
 
 /* Used to determine if the given key exists in the hash table */
 
-BOOL hash_is_key_in_hash (cache_ptr cache, const void *key);
+BOOL objc_hash_is_key_in_hash (cache_ptr cache, const void *key);
 
 /************************************************
 
@@ -163,7 +163,7 @@ BOOL hash_is_key_in_hash (cache_ptr cache, const void *key);
    except for those likely to be 0 due to alignment.)  */
 
 static inline unsigned int
-hash_ptr (cache_ptr cache, const void *key)
+objc_hash_ptr (cache_ptr cache, const void *key)
 {
   return ((size_t)key / sizeof (void *)) & cache->mask;
 }
@@ -172,7 +172,7 @@ hash_ptr (cache_ptr cache, const void *key)
 /* Calculate a hash code by iterating over a NULL 
    terminate string.  */
 static inline unsigned int 
-hash_string (cache_ptr cache, const void *key)
+objc_hash_string (cache_ptr cache, const void *key)
 {
   unsigned int ret = 0;
   unsigned int ctr = 0;
@@ -189,7 +189,7 @@ hash_string (cache_ptr cache, const void *key)
 
 /* Compare two pointers for equality.  */
 static inline int 
-compare_ptrs (const void *k1, const void *k2)
+objc_compare_ptrs (const void *k1, const void *k2)
 {
   return (k1 == k2);
 }
@@ -197,7 +197,7 @@ compare_ptrs (const void *k1, const void *k2)
 
 /* Compare two strings.  */
 static inline int 
-compare_strings (const void *k1, const void *k2)
+objc_compare_strings (const void *k1, const void *k2)
 {
   if (k1 == k2)
     return 1;
@@ -207,6 +207,107 @@ compare_strings (const void *k1, const void *k2)
     return ! strcmp ((const char *) k1, (const char *) k2);
 }
 
+#ifndef OBJC_IGNORE_DEPRECATED_API
+/* Deprecated as of 4.1 */
+
+static inline cache_ptr
+hash_new (unsigned int size,
+         hash_func_type hash_func,
+         compare_func_type compare_func) __attribute__ ((deprecated));
+static inline cache_ptr
+hash_new (unsigned int size,
+         hash_func_type hash_func,
+         compare_func_type compare_func)
+{
+  return objc_hash_new(size, hash_func, compare_func);
+}
+
+static inline void
+hash_delete(cache_ptr cache) __attribute__ ((deprecated));
+static inline void
+hash_delete(cache_ptr cache)
+{
+  objc_hash_delete(cache);
+}
+
+static inline void
+hash_add (cache_ptr *cachep,
+         const void *key,
+         void *value) __attribute__ ((deprecated));
+static inline void
+hash_add (cache_ptr *cachep, const void *key, void *value)
+{
+  objc_hash_add(cachep, key, value);
+}
+
+static inline void
+hash_remove (cache_ptr cache, const void *key) __attribute__ ((deprecated));
+static inline void
+hash_remove (cache_ptr cache, const void *key)
+{
+  objc_hash_remove (cache, key);
+}
+
+static inline node_ptr
+hash_next (cache_ptr cache, node_ptr node) __attribute__ ((deprecated));
+static inline node_ptr
+hash_next (cache_ptr cache, node_ptr node)
+{
+  return objc_hash_next (cache, node);
+}
+
+static inline void *
+hash_value_for_key (cache_ptr cache,
+                   const void *key) __attribute__ ((deprecated));
+static inline void *
+hash_value_for_key (cache_ptr cache, const void *key)
+{
+  return objc_hash_value_for_key (cache, key);
+}
+
+static inline BOOL
+hash_is_key_in_hash (cache_ptr cache,
+                    const void *key) __attribute__ ((deprecated));
+static inline BOOL
+hash_is_key_in_hash (cache_ptr cache, const void *key)
+{
+  return objc_hash_is_key_in_hash (cache, key);
+}
+
+static inline unsigned int
+hash_ptr (cache_ptr cache, const void *key) __attribute__ ((deprecated));
+static inline unsigned int
+hash_ptr (cache_ptr cache, const void *key)
+{
+  return objc_hash_ptr (cache, key);
+}
+
+static inline unsigned int 
+hash_string (cache_ptr cache, const void *key) __attribute__ ((deprecated));
+static inline unsigned int 
+hash_string (cache_ptr cache, const void *key)
+{
+  return objc_hash_string (cache, key);
+}
+
+static inline int 
+compare_ptrs (const void *k1, const void *k2) __attribute__ ((deprecated));
+static inline int 
+compare_ptrs (const void *k1, const void *k2)
+{
+  return objc_compare_ptrs (k1, k2);
+}
+
+static inline int 
+compare_strings (const void *k1, const void *k2) __attribute__ ((deprecated));
+static inline int 
+compare_strings (const void *k1, const void *k2)
+{
+  return objc_compare_strings (k1, k2);
+}
+#endif /* IGNORE_DEPRECATED_API */
+
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index edaef2d..ce8acf7 100644 (file)
@@ -43,9 +43,9 @@ void __objc_init_selector_tables (void)
   __objc_selector_array = sarray_new (SELECTOR_HASH_SIZE, 0);
   __objc_selector_names = sarray_new (SELECTOR_HASH_SIZE, 0);
   __objc_selector_hash
-    = hash_new (SELECTOR_HASH_SIZE,
-               (hash_func_type) hash_string,
-               (compare_func_type) compare_strings);
+    = objc_hash_new (SELECTOR_HASH_SIZE,
+                    (hash_func_type) objc_hash_string,
+                    (compare_func_type) objc_compare_strings);
 }  
 
 /* This routine is given a class and records all of the methods in its class
@@ -195,7 +195,7 @@ sel_get_typed_uid (const char *name, const char *types)
 
   objc_mutex_lock (__objc_runtime_mutex);
 
-  i = (sidx) hash_value_for_key (__objc_selector_hash, name);
+  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);
   if (i == 0)
     {
       objc_mutex_unlock (__objc_runtime_mutex);
@@ -235,7 +235,7 @@ sel_get_any_typed_uid (const char *name)
 
   objc_mutex_lock (__objc_runtime_mutex);
 
-  i = (sidx) hash_value_for_key (__objc_selector_hash, name);
+  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);
   if (i == 0)
     {
       objc_mutex_unlock (__objc_runtime_mutex);
@@ -266,7 +266,7 @@ sel_get_any_uid (const char *name)
 
   objc_mutex_lock (__objc_runtime_mutex);
 
-  i = (sidx) hash_value_for_key (__objc_selector_hash, name);
+  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);
   if (soffset_decode (i) == 0)
     {
       objc_mutex_unlock (__objc_runtime_mutex);
@@ -368,7 +368,7 @@ __sel_register_typed_name (const char *name, const char *types,
   sidx i;
   struct objc_list *l;
 
-  i = (sidx) hash_value_for_key (__objc_selector_hash, name);
+  i = (sidx) objc_hash_value_for_key (__objc_selector_hash, name);
   if (soffset_decode (i) != 0)
     {
       for (l = (struct objc_list *) sarray_get_safe (__objc_selector_array, i);
@@ -453,7 +453,7 @@ __sel_register_typed_name (const char *name, const char *types,
     sarray_at_put_safe (__objc_selector_names, i, (void *) new_name);
     sarray_at_put_safe (__objc_selector_array, i, (void *) l);
     if (is_new)
-      hash_add (&__objc_selector_hash, (void *) new_name, (void *) i);
+      objc_hash_add (&__objc_selector_hash, (void *) new_name, (void *) i);
   }
 
   sarray_realloc (__objc_uninstalled_dtable, __objc_selector_max_index + 1);