diff dmd2/mem.c @ 758:f04dde6e882c

Added initial D2 support, D2 frontend and changes to codegen to make things compile.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 11 Nov 2008 01:38:48 +0100
parents
children 638d16625da2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dmd2/mem.c	Tue Nov 11 01:38:48 2008 +0100
@@ -0,0 +1,265 @@
+
+/* Copyright (c) 2000 Digital Mars	*/
+/* All Rights Reserved 			*/
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cassert>
+
+#include "mem.h"
+
+#if USE_BOEHM_GC
+    // I needed to perfix the dir after upgrading to gc 7.0
+    #include "gc/gc.h"
+#endif
+
+/* This implementation of the storage allocator uses the standard C allocation package.
+ */
+
+Mem mem;
+
+#if USE_BOEHM_GC
+
+static bool gc_was_init = false;
+
+void Mem::init()
+{
+    GC_init();
+    gc_was_init = true;
+}
+
+char *Mem::strdup(const char *s)
+{
+    char *p;
+
+    if (s)
+    {
+	p = GC_strdup(s);
+	if (p)
+	    return p;
+	error();
+    }
+    return NULL;
+}
+
+void *Mem::malloc(size_t size)
+{   void *p;
+
+    if (!size)
+	p = NULL;
+    else
+    {
+	p = GC_malloc(size);
+	if (!p)
+	    error();
+    }
+    return p;
+}
+
+void *Mem::calloc(size_t size, size_t n)
+{   void *p;
+
+    if (!size || !n)
+	p = NULL;
+    else
+    {
+	p = GC_malloc(size * n);
+	if (!p)
+	    error();
+        memset(p, 0, size * n);
+    }
+    return p;
+}
+
+void *Mem::realloc(void *p, size_t size)
+{
+    if (!size)
+    {	if (p)
+	{   GC_free(p);
+	    p = NULL;
+	}
+    }
+    else if (!p)
+    {
+	p = GC_malloc(size);
+	if (!p)
+	    error();
+    }
+    else
+    {
+	p = GC_realloc(p, size);
+	if (!p)
+	    error();
+    }
+    return p;
+}
+
+void Mem::free(void *p)
+{
+    if (p)
+	GC_free(p);
+}
+
+void *Mem::mallocdup(void *o, size_t size)
+{   void *p;
+
+    if (!size)
+	p = NULL;
+    else
+    {
+	p = GC_malloc(size);
+	if (!p)
+	    error();
+	else
+	    memcpy(p,o,size);
+    }
+    return p;
+}
+
+void Mem::error()
+{
+    printf("Error: out of memory\n");
+    exit(EXIT_FAILURE);
+}
+
+void Mem::fullcollect()
+{
+    GC_gcollect();
+}
+
+void Mem::mark(void *pointer)
+{
+    (void) pointer;		// necessary for VC /W4
+}
+
+/* =================================================== */
+
+void * operator new(size_t m_size)
+{
+    // without this we segfault with gc 7.0
+    if (!gc_was_init) {
+        mem.init();
+    }
+    void *p = GC_malloc(m_size);
+    if (p)
+	return p;
+    printf("Error: out of memory\n");
+    exit(EXIT_FAILURE);
+    return p;
+}
+
+void operator delete(void *p)
+{
+    GC_free(p);
+}
+
+#elif !USE_BOEHM_GC
+
+void Mem::init()
+{
+}
+
+char *Mem::strdup(const char *s)
+{
+    char *p;
+
+    if (s)
+    {
+    p = ::strdup(s);
+    if (p)
+        return p;
+    error();
+    }
+    return NULL;
+}
+
+void *Mem::malloc(size_t size)
+{   void *p;
+
+    if (!size)
+    p = NULL;
+    else
+    {
+    p = ::malloc(size);
+    if (!p)
+        error();
+    }
+    return p;
+}
+
+void *Mem::calloc(size_t size, size_t n)
+{   void *p;
+
+    if (!size || !n)
+    p = NULL;
+    else
+    {
+    p = ::malloc(size * n);
+    if (!p)
+        error();
+        memset(p, 0, size * n);
+    }
+    return p;
+}
+
+void *Mem::realloc(void *p, size_t size)
+{
+    if (!size)
+    {   if (p)
+    {   ::free(p);
+        p = NULL;
+    }
+    }
+    else if (!p)
+    {
+    p = ::malloc(size);
+    if (!p)
+        error();
+    }
+    else
+    {
+    p = ::realloc(p, size);
+    if (!p)
+        error();
+    }
+    return p;
+}
+
+void Mem::free(void *p)
+{
+    if (p)
+        ::free(p);
+}
+
+void *Mem::mallocdup(void *o, size_t size)
+{   void *p;
+
+    if (!size)
+        p = NULL;
+    else
+    {
+        p = ::malloc(size);
+        if (!p)
+            error();
+        else
+            memcpy(p,o,size);
+    }
+    return p;
+}
+
+void Mem::error()
+{
+    printf("Error: out of memory\n");
+    exit(EXIT_FAILURE);
+}
+
+void Mem::fullcollect()
+{
+}
+
+void Mem::mark(void *pointer)
+{
+}
+
+#endif // USE_BOEHM_GC