summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libobjc/ChangeLog14
-rw-r--r--libobjc/Makefile.in2
-rw-r--r--libobjc/memory.c121
-rw-r--r--libobjc/objc/deprecated/objc_malloc.h17
-rw-r--r--libobjc/objc/deprecated/objc_valloc.h2
-rw-r--r--libobjc/objc/objc-api.h33
6 files changed, 117 insertions, 72 deletions
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index 0d46882a8ea..4abad0a88b9 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,4 +1,18 @@
2010-09-12 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * objc/deprecated/objc_malloc.h: New file.
+ * objc/deprecated/objc_valloc.h: New file.
+ * objc/objc-api.h: Include the files instead of defining
+ objc_valloc, _objc_malloc() and similar.
+ * Makefile.in (OBJC_DEPRECATED_H): Added objc_valloc.h and
+ objc_malloc.h.
+ * memory.c: Removed the extra layer of indirection of _objc_malloc
+ and similar.
+ (objc_calloc): Use GC_malloc in the garbage-collected
+ implementation as GC_malloc returns memory that is already freed.
+ (objc_valloc): Deprecated.
+
+2010-09-12 Nicola Pero <nicola.pero@meta-innovation.com>
* objc/deprecated/objc_error.h: New file.
* objc/objc-api.h: Include deprecated/objc_error.h instead of
diff --git a/libobjc/Makefile.in b/libobjc/Makefile.in
index ac042accf96..f4a6de19f9a 100644
--- a/libobjc/Makefile.in
+++ b/libobjc/Makefile.in
@@ -168,7 +168,9 @@ OBJC_DEPRECATED_H = \
Object.h \
STR.h \
objc_error.h \
+ objc_malloc.h \
objc_unexpected_exception.h \
+ objc_valloc.h \
struct_objc_class.h \
struct_objc_protocol.h \
struct_objc_selector.h \
diff --git a/libobjc/memory.c b/libobjc/memory.c
index 2cb4dd360d0..2a6dec0de7d 100644
--- a/libobjc/memory.c
+++ b/libobjc/memory.c
@@ -24,6 +24,12 @@ a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
+/*
+ This file includes the standard functions for memory allocation and
+ disposal. Users should use these functions in their ObjC programs
+ so that they work properly with garbage collectors.
+*/
+
#include "objc-private/common.h"
#include "objc-private/error.h"
@@ -38,17 +44,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "objc/objc-api.h"
#include "objc-private/runtime.h"
-/*
- Standard functions for memory allocation and disposal. Users should
- use these functions in their ObjC programs so that they work
- properly with garbage collectors as well as can take advantage of
- the exception/error handling available.
-*/
+#if OBJC_WITH_GC
+#include <gc.h>
void *
objc_malloc (size_t size)
{
- void *res = (void *) (*_objc_malloc) (size);
+ void *res = (void *)(GC_malloc (size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -57,16 +59,53 @@ objc_malloc (size_t size)
void *
objc_atomic_malloc (size_t size)
{
- void *res = (void *) (*_objc_atomic_malloc) (size);
+ void *res = (void *)(GC_malloc_atomic (size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
}
void *
-objc_valloc (size_t size)
+objc_realloc (void *mem, size_t size)
+{
+ void *res = (void *)(GC_realloc (mem, size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
+}
+
+void *
+objc_calloc (size_t nelem, size_t size)
+{
+ /* Note that GC_malloc returns cleared memory (see documentation) so
+ there is no need to clear it. */
+ void *res = (void *)(GC_malloc (nelem, size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
+}
+
+void
+objc_free (void *mem)
+{
+ return;
+}
+
+#else
+
+void *
+objc_malloc (size_t size)
{
- void *res = (void *) (*_objc_valloc) (size);
+ void *res = (void *)(malloc (size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
+}
+
+void *
+objc_atomic_malloc (size_t size)
+{
+ void *res = (void *)(malloc (size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -75,7 +114,7 @@ objc_valloc (size_t size)
void *
objc_realloc (void *mem, size_t size)
{
- void *res = (void *) (*_objc_realloc) (mem, size);
+ void *res = (void *)(realloc (mem, size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -84,7 +123,7 @@ objc_realloc (void *mem, size_t size)
void *
objc_calloc (size_t nelem, size_t size)
{
- void *res = (void *) (*_objc_calloc) (nelem, size);
+ void *res = (void *)(calloc (nelem, size));
if (! res)
_objc_abort ("Virtual memory exhausted\n");
return res;
@@ -93,50 +132,41 @@ objc_calloc (size_t nelem, size_t size)
void
objc_free (void *mem)
{
- (*_objc_free) (mem);
+ free (mem);
}
-/*
- Hook functions for memory allocation and disposal. This makes it
- easy to substitute garbage collection systems such as Boehm's GC by
- assigning these function pointers to the GC's allocation routines.
- By default these point to the ANSI standard malloc, realloc, free,
- etc.
-
- Users should call the normal objc routines above for memory
- allocation and disposal within their programs.
-*/
+#endif /* !OBJC_WITH_GC */
+
+/* The rest of the file contains deprecated code. */
#if OBJC_WITH_GC
-#include <gc.h>
-/* FIXME: The following sounds pointless because the GC_malloc
- documentation says that it returns memory that is already zeroed!
-*/
-static void *
-GC_calloc (size_t nelem, size_t size)
+void *
+objc_valloc (size_t size)
{
- void *p = GC_malloc (nelem * size);
- if (! p)
- _objc_abort ("Virtual memory exhausted!\n");
-
- memset (p, 0, nelem * size);
- return p;
+ void *res = (void *)(GC_malloc (size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
}
-static void
-noFree (void *p)
+#else
+
+void *
+objc_valloc (size_t size)
{
+ void *res = (void *)(malloc (size));
+ if (! res)
+ _objc_abort ("Virtual memory exhausted\n");
+ return res;
}
-void *(*_objc_malloc) (size_t) = GC_malloc;
-void *(*_objc_atomic_malloc) (size_t) = GC_malloc_atomic;
-void *(*_objc_valloc) (size_t) = GC_malloc;
-void *(*_objc_realloc) (void *, size_t) = GC_realloc;
-void *(*_objc_calloc) (size_t, size_t) = GC_calloc;
-void (*_objc_free) (void *) = noFree;
+#endif /* !OBJC_WITH_GC */
-#else /* !OBJC_WITH_GC */
+/*
+ Hook functions for memory allocation and disposal. Deprecated
+ and currently unused.
+*/
void *(*_objc_malloc) (size_t) = malloc;
void *(*_objc_atomic_malloc) (size_t) = malloc;
@@ -144,6 +174,3 @@ void *(*_objc_valloc) (size_t) = malloc;
void *(*_objc_realloc) (void *, size_t) = realloc;
void *(*_objc_calloc) (size_t, size_t) = calloc;
void (*_objc_free) (void *) = free;
-
-
-#endif /* !OBJC_WITH_GC */
diff --git a/libobjc/objc/deprecated/objc_malloc.h b/libobjc/objc/deprecated/objc_malloc.h
new file mode 100644
index 00000000000..cf6c6e9d092
--- /dev/null
+++ b/libobjc/objc/deprecated/objc_malloc.h
@@ -0,0 +1,17 @@
+/*
+** Hook functions for memory allocation and disposal.
+** This makes it easy to substitute garbage collection systems
+** such as Boehm's GC by assigning these function pointers
+** to the GC's allocation routines. By default these point
+** to the ANSI standard malloc, realloc, free, etc.
+**
+** Users should call the normal objc routines above for
+** memory allocation and disposal within their programs.
+*/
+objc_EXPORT void *(*_objc_malloc)(size_t);
+objc_EXPORT void *(*_objc_atomic_malloc)(size_t);
+objc_EXPORT void *(*_objc_valloc)(size_t);
+objc_EXPORT void *(*_objc_realloc)(void *, size_t);
+objc_EXPORT void *(*_objc_calloc)(size_t, size_t);
+objc_EXPORT void (*_objc_free)(void *);
+
diff --git a/libobjc/objc/deprecated/objc_valloc.h b/libobjc/objc/deprecated/objc_valloc.h
new file mode 100644
index 00000000000..a715f1a7330
--- /dev/null
+++ b/libobjc/objc/deprecated/objc_valloc.h
@@ -0,0 +1,2 @@
+void *
+objc_valloc(size_t size);
diff --git a/libobjc/objc/objc-api.h b/libobjc/objc/objc-api.h
index 89c5fcd9f3b..9fff9e1d155 100644
--- a/libobjc/objc/objc-api.h
+++ b/libobjc/objc/objc-api.h
@@ -82,10 +82,8 @@ struct objc_method_description
#define _C_VECTOR '!'
#define _C_COMPLEX 'j'
-
#include "deprecated/objc_error.h"
-
/* For every class which happens to have statically allocated instances in
this module, one OBJC_STATIC_INSTANCES is allocated by the compiler.
INSTANCES is NULL terminated and points to all statically allocated
@@ -328,21 +326,20 @@ objc_EXPORT id (*_objc_object_copy)(id object);
objc_EXPORT id (*_objc_object_dispose)(id object);
/*
-** Standard functions for memory allocation and disposal.
-** Users should use these functions in their ObjC programs so
-** that they work properly with garbage collectors as well as
-** can take advantage of the exception/error handling available.
+ Standard functions for memory allocation and disposal. Users should
+ use these functions in their ObjC programs so that they work so that
+ they work properly with garbage collectors.
*/
void *
objc_malloc(size_t size);
+/* FIXME: Shouldn't the following be called objc_malloc_atomic ? The
+ GC function is GC_malloc_atomic() which makes sense.
+ */
void *
objc_atomic_malloc(size_t size);
void *
-objc_valloc(size_t size);
-
-void *
objc_realloc(void *mem, size_t size);
void *
@@ -351,22 +348,8 @@ objc_calloc(size_t nelem, size_t size);
void
objc_free(void *mem);
-/*
-** Hook functions for memory allocation and disposal.
-** This makes it easy to substitute garbage collection systems
-** such as Boehm's GC by assigning these function pointers
-** to the GC's allocation routines. By default these point
-** to the ANSI standard malloc, realloc, free, etc.
-**
-** Users should call the normal objc routines above for
-** memory allocation and disposal within their programs.
-*/
-objc_EXPORT void *(*_objc_malloc)(size_t);
-objc_EXPORT void *(*_objc_atomic_malloc)(size_t);
-objc_EXPORT void *(*_objc_valloc)(size_t);
-objc_EXPORT void *(*_objc_realloc)(void *, size_t);
-objc_EXPORT void *(*_objc_calloc)(size_t, size_t);
-objc_EXPORT void (*_objc_free)(void *);
+#include "deprecated/objc_valloc.h"
+#include "deprecated/objc_malloc.h"
/*
** Hooks for method forwarding. This makes it easy to substitute a
OpenPOWER on IntegriCloud