Mercurial > projects > ldc
diff dmd/mem.c @ 1:c53b6e3fe49a trunk
[svn r5] Initial commit. Most things are very rough.
author | lindquist |
---|---|
date | Sat, 01 Sep 2007 21:43:27 +0200 |
parents | |
children | 35d93ce68cf4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmd/mem.c Sat Sep 01 21:43:27 2007 +0200 @@ -0,0 +1,144 @@ + +/* Copyright (c) 2000 Digital Mars */ +/* All Rights Reserved */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "gc.h" + +#include "mem.h" + +/* This implementation of the storage allocator uses the standard C allocation package. + */ + +Mem mem; + +void Mem::init() +{ + GC_init(); +} + +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) +{ + 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); +} + +