File: libobjc-update.dpatch

package info (click to toggle)
gcc-3.3 1%3A3.3.6ds1-28
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 25,812 kB
  • ctags: 262
  • sloc: sh: 10,321; makefile: 1,050; perl: 155; awk: 23; cpp: 14
file content (484 lines) | stat: -rw-r--r-- 16,307 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
#! /bin/sh -e

# DP: libobjc update taken from the 3.4.1 release.

dir=
if [ $# -eq 3 -a "$2" = '-d' ]; then
    pdir="-d $3"
    dir="$3/"
elif [ $# -ne 1 ]; then
    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
    exit 1
fi
case "$1" in
    -patch)
        patch $pdir -f --no-backup-if-mismatch -p1 < $0
        ;;
    -unpatch)
        patch $pdir -f --no-backup-if-mismatch -R -p1 < $0
        ;;
    *)
        echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
        exit 1
esac
exit 0

libobjc:
2004-03-01  Michael Matz  <matz@suse.de>

	* Makefile.in (ALL_CFLAGS): Add -fno-strict-aliasing.

2004-01-14  Adam Fedor  <fedor@gnu.org>

	PR libobjc/12155
	* selector.c (__objc_register_instance_methods_to_class): Free
	new_list if not used.

2004-01-09  Andrew Ruder  <aeruder@ksu.edu>

	PR libobjc/11904
	* sarray.c (sarray_free): Free array->is_copy_of latter.
 
2003-10-24  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
 
	* Makefile.in (runtime-info.h): Remove -Wp.
 
2003-10-21  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>
 
	* Makefile.in (CC1OBJ): Remove.
	(runtime-info.h): Invoke $(CC) so all MULTIFLAGS are handled
	correctly.
	Use .m extension for temporary file.
	Remove assembler temp file.

2003-10-20  Joseph S. Myers  <jsm@polyomino.org.uk>

	* objc/hash.h (hash_string): Don't use a cast as an lvalue.
 
2003-10-17  Rainer Orth  <ro@TechFak.Uni-Bielefeld.DE>

	* Makefile.in (runtime-info.h): Use MULTIFLAGS.

Thu Jul 10 10:27:43 2003  Nicola Pero  <n.pero@mi.flashnet.it>

	libobjc/9969
	* sendmsg.c (get_imp): Fixed rare threading problem.
	(__objc_responds_to): Similar fixes.
	(objc_msg_lookup): Similar fixes.
	(__objc_init_install_dtable): Lock the runtime before checking if the
	table is installed.

Tue May 13 14:56:03 2003  Richard Frith-Macdonald <rfm@gnu.org>
			  Nicola Pero  <n.pero@mi.flashnet.it>

	libobjc/10742
	* init.c (class_superclass_of_class): New function.
	(create_tree_of_subclasses_inherited_from): Use it.
	(__objc_tree_insert_class): Likewise.
	(class_is_subclass_of_class): Likewise.

2003-04-11  David Chad  <davidc@freebsd.org>
	    Loren J. Rittle  <ljrittle@acm.org>

	libobjc/8562
	* objc/hash.h (hash_string): Constify correctly.
	(compare_ptrs): Use direct compare.
	* objc/objc-list.h (list_nth): Rename index to indx to avoid shadow.
	* objc/sarray.h: Global rename index to indx to avoid shadow.
 

diff -ur --exclude=CVS gcc-3.3/libobjc/Makefile.in gcc-3.4/libobjc/Makefile.in
--- gcc-3.3/libobjc/Makefile.in	2003-01-26 12:29:56.000000000 +0100
+++ gcc-3.4/libobjc/Makefile.in	2004-03-02 00:28:01.000000000 +0100
@@ -70,7 +71,7 @@
 WARN_CFLAGS = -W -Wall -Wwrite-strings -Wstrict-prototypes
 GTHREAD_FLAGS=@GTHREAD_FLAGS@
 ALL_CFLAGS = -I. -I$(srcdir) $(CPPFLAGS) $(DEFS) $(CFLAGS) $(WARN_CFLAGS) \
-	$(GTHREAD_FLAGS) -DIN_GCC -DIN_TARGET_LIBS
+	$(GTHREAD_FLAGS) -DIN_GCC -DIN_TARGET_LIBS -fno-strict-aliasing
 
 # Libtool
 # The following strings describe the version of the obj-C library 
@@ -87,14 +88,6 @@
 LIBTOOL_CLEAN   = $(LIBTOOL) --mode=clean
 #LIBTOOL_UNINSTALL = $(LIBTOOL) --mode=uninstall
 
-#
-# Define the cc1obj in terms of the CC that is passed on from higher
-# level make. This is needed to make sure we can create runtime-info.h
-# when doing canadian cross builds where running ../../gcc/cc1obj 
-# does not make any sense.
-#
-CC1OBJ = `$(CC) -print-prog-name=cc1obj`
-
 INCLUDES = -I$(srcdir)/objc  -I$(srcdir)/$(MULTISRCTOP)../gcc \
   -I$(srcdir)/$(MULTISRCTOP)../gcc/config -I$(MULTIBUILDTOP)../../gcc \
   -I$(srcdir)/$(MULTISRCTOP)../include
@@ -160,10 +153,10 @@
 	  $(OBJC_THREAD_FILE)_gc.lo
 
 runtime-info.h: 
-	echo "" > tmp-runtime
+	echo "" > tmp-runtime.m
 	echo "/* This file is automatically generated */" > $@
-	$(CC1OBJ) -print-objc-runtime-info tmp-runtime >> $@
-	rm -f tmp-runtime
+	$(CC) $(MULTIFLAGS) -print-objc-runtime-info -S tmp-runtime.m >> $@
+	rm -f tmp-runtime.m tmp-runtime.s
 
 archive_gc.lo: archive.c
 	$(LIBTOOL_COMPILE) $(CC) -c  -o $@ $(ALL_CFLAGS) $(OBJC_GCFLAGS) \
diff -ur --exclude=CVS gcc-3.3/libobjc/init.c gcc-3.4/libobjc/init.c
--- gcc-3.3/libobjc/init.c	2002-07-02 21:42:27.000000000 +0200
+++ gcc-3.4/libobjc/init.c	2003-05-24 09:47:56.000000000 +0200
@@ -99,6 +99,50 @@
    should not be destroyed during the execution of the program.  */
 static cache_ptr __objc_load_methods = NULL;
 
+/* This function is used when building the class tree used to send
+   ordinately the +load message to all classes needing it.  The tree
+   is really needed so that superclasses will get the message before
+   subclasses.
+
+   This tree will contain classes which are being loaded (or have just
+   being loaded), and whose super_class pointers have not yet been
+   resolved.  This implies that their super_class pointers point to a
+   string with the name of the superclass; when the first message is
+   sent to the class (/an object of that class) the class links will
+   be resolved, which will replace the super_class pointers with
+   pointers to the actual superclasses.
+
+   Unfortunately, the tree might also contain classes which had been
+   loaded previously, and whose class links have already been
+   resolved.
+
+   This function returns the superclass of a class in both cases, and
+   can be used to build the determine the class relationships while
+   building the tree.
+*/
+static Class  class_superclass_of_class (Class class)
+{
+  char *super_class_name;
+
+  /* If the class links have been resolved, use the resolved
+   * links.  */
+  if (CLS_ISRESOLV (class))
+    return class->super_class;
+  
+  /* Else, 'class' has not yet been resolved.  This means that its
+   * super_class pointer is really the name of the super class (rather
+   * than a pointer to the actual superclass).  */
+  super_class_name = (char *)class->super_class;
+
+  /* Return Nil for a root class.  */
+  if (super_class_name == NULL)
+    return Nil;
+
+  /* Lookup the superclass of non-root classes.  */
+  return objc_lookup_class (super_class_name);
+}
+
+
 /* Creates a tree of classes whose topmost class is directly inherited
    from `upper' and the bottom class in this tree is
    `bottom_class'. The classes in this tree are super classes of
@@ -127,9 +171,7 @@
       tree = objc_calloc (1, sizeof (objc_class_tree));
       tree->class = superclass;
       tree->subclasses = list_cons (prev, tree->subclasses);
-      superclass = (superclass->super_class ?
-			objc_lookup_class ((char *) superclass->super_class)
-		      : Nil);
+      superclass = class_superclass_of_class (superclass);
       prev = tree;
     }
 
@@ -157,10 +199,7 @@
       DEBUG_PRINTF ("1. class %s was previously inserted\n", class->name);
       return tree;
     }
-  else if ((class->super_class ?
-		    objc_lookup_class ((char *) class->super_class)
-		  : Nil)
-	    == tree->class)
+  else if (class_superclass_of_class (class) == tree->class)
     {
       /* If class is a direct subclass of tree->class then add class to the
 	 list of subclasses. First check to see if it wasn't already
@@ -370,9 +409,7 @@
     {
       if (class == superclass)
 	return YES;
-      class = (class->super_class ?
-		  objc_lookup_class ((char *) class->super_class)
-		: Nil);
+      class = class_superclass_of_class (class);
     }
 
   return NO;
diff -ur --exclude=CVS gcc-3.3/libobjc/objc/hash.h gcc-3.4/libobjc/objc/hash.h
--- gcc-3.3/libobjc/objc/hash.h	2004-03-02 03:18:17.000000000 +0100
+++ gcc-3.4/libobjc/objc/hash.h	2003-10-20 23:53:26.000000000 +0200
@@ -187,7 +187,7 @@
 static inline int 
 compare_ptrs (const void *k1, const void *k2)
 {
-  return ! (k1 - k2);
+  return (k1 == k2);
 }
 
 
diff -ur --exclude=CVS gcc-3.3/libobjc/objc/objc-list.h gcc-3.4/libobjc/objc/objc-list.h
--- gcc-3.3/libobjc/objc/objc-list.h	2000-03-29 22:19:06.000000000 +0200
+++ gcc-3.4/libobjc/objc/objc-list.h	2003-05-24 09:47:56.000000000 +0200
@@ -64,9 +64,9 @@
    larger than the list length, NULL is returned  */
 
 static inline void*
-list_nth(int index, struct objc_list* list)
+list_nth(int indx, struct objc_list* list)
 {
-  while(index-- != 0)
+  while(indx-- != 0)
     {
       if(list->tail)
 	list = list->tail;
diff -ur --exclude=CVS gcc-3.3/libobjc/objc/sarray.h gcc-3.4/libobjc/objc/sarray.h
--- gcc-3.3/libobjc/objc/sarray.h	1998-10-07 04:21:54.000000000 +0200
+++ gcc-3.4/libobjc/objc/sarray.h	2003-05-24 09:47:56.000000000 +0200
@@ -146,8 +146,8 @@
 void sarray_free(struct sarray*);
 struct sarray* sarray_lazy_copy(struct sarray*);
 void sarray_realloc(struct sarray*, int new_size);
-void sarray_at_put(struct sarray*, sidx index, void* elem);
-void sarray_at_put_safe(struct sarray*, sidx index, void* elem);
+void sarray_at_put(struct sarray*, sidx indx, void* elem);
+void sarray_at_put_safe(struct sarray*, sidx indx, void* elem);
 
 struct sarray* sarray_hard_copy(struct sarray*); /* ... like the name? */
 void sarray_remove_garbage(void);
@@ -156,10 +156,10 @@
 #ifdef PRECOMPUTE_SELECTORS
 /* Transform soffset values to ints and vica verca */
 static inline unsigned int
-soffset_decode(sidx index)
+soffset_decode(sidx indx)
 {
   union sofftype x;
-  x.idx = index;
+  x.idx = indx;
 #ifdef OBJC_SPARSE3
   return x.off.eoffset
     + (x.off.boffset*BUCKET_SIZE)
@@ -186,9 +186,9 @@
 #else /* not PRECOMPUTE_SELECTORS */
 
 static inline size_t
-soffset_decode(sidx index)
+soffset_decode(sidx indx)
 {
-  return index;
+  return indx;
 }
 
 static inline sidx
@@ -198,13 +198,13 @@
 }
 #endif /* not PRECOMPUTE_SELECTORS */
 
-/* Get element from the Sparse array `array' at offset `index' */
+/* Get element from the Sparse array `array' at offset `indx' */
 
-static inline void* sarray_get(struct sarray* array, sidx index)
+static inline void* sarray_get(struct sarray* array, sidx indx)
 {
 #ifdef PRECOMPUTE_SELECTORS
   union sofftype x;
-  x.idx = index;
+  x.idx = indx;
 #ifdef OBJC_SPARSE3
   return 
     array->
@@ -217,19 +217,19 @@
 #else /* not PRECOMPUTE_SELECTORS */
 #ifdef OBJC_SPARSE3
   return array->
-    indices[index/INDEX_CAPACITY]->
-      buckets[(index/BUCKET_SIZE)%INDEX_SIZE]->
-	elems[index%BUCKET_SIZE];
+    indices[indx/INDEX_CAPACITY]->
+      buckets[(indx/BUCKET_SIZE)%INDEX_SIZE]->
+	elems[indx%BUCKET_SIZE];
 #else /* OBJC_SPARSE2 */
-  return array->buckets[index/BUCKET_SIZE]->elems[index%BUCKET_SIZE];
+  return array->buckets[indx/BUCKET_SIZE]->elems[indx%BUCKET_SIZE];
 #endif /* not OBJC_SPARSE3 */
 #endif /* not PRECOMPUTE_SELECTORS */
 }
 
-static inline void* sarray_get_safe(struct sarray* array, sidx index)
+static inline void* sarray_get_safe(struct sarray* array, sidx indx)
 {
-  if(soffset_decode(index) < array->capacity)
-    return sarray_get(array, index);
+  if(soffset_decode(indx) < array->capacity)
+    return sarray_get(array, indx);
   else
     return (array->empty_bucket->elems[0]);
 }
diff -ur --exclude=CVS gcc-3.3/libobjc/sarray.c gcc-3.4/libobjc/sarray.c
--- gcc-3.3/libobjc/sarray.c	2002-07-02 21:42:44.000000000 +0200
+++ gcc-3.4/libobjc/sarray.c	2004-01-10 09:09:36.000000000 +0100
@@ -402,9 +402,6 @@
 #else
   old_buckets = array->buckets;
 #endif
-  
-  if ((array->is_copy_of) && ((array->is_copy_of->ref_count - 1) == 0))
-    sarray_free (array->is_copy_of);
 
   /* Free all entries that do not point to empty_bucket */
   for (counter = 0; counter <= old_max_index; counter++ ) {
@@ -462,6 +459,10 @@
 
 #endif
   
+  /* If this is a copy, go ahead and decrement/deallocate the original */
+  if (array->is_copy_of)
+    sarray_free (array->is_copy_of);
+
   /* free array */
   sarray_free_garbage (array);
 }
diff -ur --exclude=CVS gcc-3.3/libobjc/selector.c gcc-3.4/libobjc/selector.c
--- gcc-3.3/libobjc/selector.c	2002-07-02 21:42:44.000000000 +0200
+++ gcc-3.4/libobjc/selector.c	2004-01-15 17:22:01.000000000 +0100
@@ -148,6 +148,8 @@
       new_list->method_next = class->class_pointer->methods;
       class->class_pointer->methods = new_list;
     }
+  else
+    objc_free(new_list);
 
     __objc_update_dispatch_table_for_class (class->class_pointer);
 }
diff -ur --exclude=CVS gcc-3.3/libobjc/sendmsg.c gcc-3.4/libobjc/sendmsg.c
--- gcc-3.3/libobjc/sendmsg.c	2002-09-12 19:29:58.000000000 +0200
+++ gcc-3.4/libobjc/sendmsg.c	2003-07-10 20:24:56.000000000 +0200
@@ -115,6 +119,14 @@
 IMP
 get_imp (Class class, SEL sel)
 {
+  /* In a vanilla implementation we would first check if the dispatch
+     table is installed.  Here instead, to get more speed in the
+     standard case (that the dispatch table is installed) we first try
+     to get the imp using brute force.  Only if that fails, we do what
+     we should have been doing from the very beginning, that is, check
+     if the dispatch table needs to be installed, install it if it's
+     not installed, and retrieve the imp from the table if it's
+     installed.  */
   void *res = sarray_get_safe (class->dtable, (size_t) sel->sel_id);
   if (res == 0)
     {
@@ -123,7 +135,16 @@
 	{
 	  /* The dispatch table needs to be installed. */
 	  objc_mutex_lock (__objc_runtime_mutex);
-	  __objc_install_dispatch_table_for_class (class);
+
+	   /* Double-checked locking pattern: Check
+	      __objc_uninstalled_dtable again in case another thread
+	      installed the dtable while we were waiting for the lock
+	      to be released.  */
+         if (class->dtable == __objc_uninstalled_dtable)
+           {
+             __objc_install_dispatch_table_for_class (class);
+           }
+
 	  objc_mutex_unlock (__objc_runtime_mutex);
 	  /* Call ourselves with the installed dispatch table
 	     and get the real method */
@@ -131,10 +152,22 @@
 	}
       else
 	{
-	  /* The dispatch table has been installed so the
-	     method just doesn't exist for the class.
-	     Return the forwarding implementation. */
-	  res = __objc_get_forward_imp (sel);
+	  /* The dispatch table has been installed.  */
+
+         /* Get the method from the dispatch table (we try to get it
+	    again in case another thread has installed the dtable just
+	    after we invoked sarray_get_safe, but before we checked
+	    class->dtable == __objc_uninstalled_dtable).
+         */
+	  res = sarray_get_safe (class->dtable, (size_t) sel->sel_id);
+	  if (res == 0)
+	    {
+	      /* The dispatch table has been installed, and the method
+		 is not in the dispatch table.  So the method just
+		 doesn't exist for the class.  Return the forwarding
+		 implementation. */
+	      res = __objc_get_forward_imp (sel);
+	    }
 	}
     }
   return res;
@@ -153,7 +186,10 @@
   if (object->class_pointer->dtable == __objc_uninstalled_dtable)
     {
       objc_mutex_lock (__objc_runtime_mutex);
-      __objc_install_dispatch_table_for_class (object->class_pointer);
+      if (object->class_pointer->dtable == __objc_uninstalled_dtable)
+	{
+	  __objc_install_dispatch_table_for_class (object->class_pointer);
+	}
       objc_mutex_unlock (__objc_runtime_mutex);
     }
 
@@ -188,10 +224,19 @@
 	    }
 	  else
 	    {
-	      /* The dispatch table has been installed so the
-		 method just doesn't exist for the class.
-		 Attempt to forward the method. */
-	      result = __objc_get_forward_imp (op);
+	      /* The dispatch table has been installed.  Check again
+		 if the method exists (just in case the dispatch table
+		 has been installed by another thread after we did the
+		 previous check that the method exists).
+	      */
+	      result = sarray_get_safe (receiver->class_pointer->dtable,
+					(sidx)op->sel_id);
+	      if (result == 0)
+		{
+		  /* If the method still just doesn't exist for the
+		     class, attempt to forward the method. */
+		  result = __objc_get_forward_imp (op);
+		}
 	    }
 	}
       return result;
@@ -235,13 +280,16 @@
 static void
 __objc_init_install_dtable (id receiver, SEL op __attribute__ ((__unused__)))
 {
+  objc_mutex_lock (__objc_runtime_mutex);
+  
   /* This may happen, if the programmer has taken the address of a 
      method before the dtable was initialized... too bad for him! */
   if (receiver->class_pointer->dtable != __objc_uninstalled_dtable)
-    return;
-
-  objc_mutex_lock (__objc_runtime_mutex);
-
+    {
+      objc_mutex_unlock (__objc_runtime_mutex);
+      return;
+    }
+  
   if (CLS_ISCLASS (receiver->class_pointer))
     {
       /* receiver is an ordinary object */