Răsfoiți Sursa

better separation between debug code and regular code

Roberto Ierusalimschy 25 ani în urmă
părinte
comite
ea45f3eb28
1 a modificat fișierele cu 61 adăugiri și 53 ștergeri
  1. 61 53
      lmem.c

+ 61 - 53
lmem.c

@@ -1,5 +1,5 @@
 /*
-** $Id: lmem.c,v 1.22 1999/12/14 18:31:20 roberto Exp roberto $
+** $Id: lmem.c,v 1.23 1999/12/27 17:33:22 roberto Exp roberto $
 ** Interface to Memory Manager
 ** See Copyright Notice in lua.h
 */
@@ -26,56 +26,32 @@
 
 
 
-
-void *luaM_growaux (lua_State *L, void *block, unsigned long nelems,
-               int inc, int size, const char *errormsg, unsigned long limit) {
-  unsigned long newn = nelems+inc;
-  if (newn >= limit) lua_error(L, errormsg);
-  if ((newn ^ nelems) <= nelems ||  /* still the same power-of-2 limit? */
-       (nelems > 0 && newn < MINPOWER2))  /* or block already is MINPOWER2? */
-      return block;  /* do not need to reallocate */
-  else  /* it crossed a power-of-2 boundary; grow to next power */
-    return luaM_realloc(L, block, luaO_power2(newn)*size);
-}
-
-
-#ifndef DEBUG
-
+#ifdef DEBUG
 /*
-** generic allocation routine.
+** {======================================================================
+** Controled version for realloc.
+** =======================================================================
 */
-void *luaM_realloc (lua_State *L, void *block, unsigned long size) {
-  size_t s = (size_t)size;
-  if (s != size)
-    lua_error(L, "memory allocation error: block too big");
-  if (size == 0) {
-    free(block);  /* block may be NULL; that is OK for free */
-    return NULL;
-  }
-  block = realloc(block, s);
-  if (block == NULL)
-    lua_error(L, memEM);
-  return block;
-}
 
 
+#include <assert.h>
+#include <string.h>
 
-#else
-/* DEBUG */
 
-#include <string.h>
+#define realloc(b, s)	debug_realloc(b, s)
+#define malloc(b)	debug_realloc(NULL, 0)
+#define free(b)		debug_realloc(b, 0)
 
 
-#define HEADER	(sizeof(double))
+#define HEADER		(sizeof(double))  /* maximum alignment */
 #define MARKSIZE	16
-
-#define MARK    55
+#define MARK		0x55  /* 01010101 (a nice pattern) */
 
 
 #define blocksize(b)	((unsigned long *)((char *)(b) - HEADER))
 
-unsigned long numblocks = 0;
-unsigned long totalmem = 0;
+unsigned long memdebug_numblocks = 0;
+unsigned long memdebug_total = 0;
 
 
 static void *checkblock (void *block) {
@@ -83,43 +59,41 @@ static void *checkblock (void *block) {
   unsigned long size = *b;
   int i;
   for (i=0;i<MARKSIZE;i++)
-    LUA_ASSERT(L, *(((char *)b)+HEADER+size+i) == MARK+i, "corrupted block");
-  numblocks--;
-  totalmem -= size;
+    assert(*(((char *)b)+HEADER+size+i) == MARK+i);  /* corrupted block? */
+  memdebug_numblocks--;
+  memdebug_total -= size;
   return b;
 }
 
 
 static void freeblock (void *block) {
   if (block) {
-    memset(block, -1, *blocksize(block));  /* erase block */
+    size_t size = *blocksize(block);
     block = checkblock(block);
-    free(block);
+    memset(block, -1, size+HEADER+MARKSIZE);  /* erase block */
+    (free)(block);  /* free original block */
   }
 }
 
 
-void *luaM_realloc (lua_State *L, void *block, unsigned long size) {
-  unsigned long realsize = HEADER+size+MARKSIZE;
-  if (realsize != (size_t)realsize)
-    lua_error(L, "memory allocation error: block too big");
+static void *debug_realloc (void *block, size_t size) {
+  size_t realsize = HEADER+size+MARKSIZE;
   if (size == 0) {
     freeblock(block);
     return NULL;
   }
   else {
-    char *newblock = malloc(realsize);
+    char *newblock = (malloc)(realsize);  /* alloc a new block */
     int i;
     if (block) {
-      unsigned long oldsize = *blocksize(block);
+      size_t oldsize = *blocksize(block);
       if (oldsize > size) oldsize = size;
       memcpy(newblock+HEADER, block, oldsize);
       freeblock(block);  /* erase (and check) old copy */
     }
-    if (newblock == NULL)
-      lua_error(L, memEM);
-    totalmem += size;
-    numblocks++;
+    if (newblock == NULL) return NULL;
+    memdebug_total += size;
+    memdebug_numblocks++;
     *(unsigned long *)newblock = size;
     for (i=0;i<MARKSIZE;i++)
       *(newblock+HEADER+size+i) = (char)(MARK+i);
@@ -128,4 +102,38 @@ void *luaM_realloc (lua_State *L, void *block, unsigned long size) {
 }
 
 
+/* }====================================================================== */
 #endif
+
+
+
+void *luaM_growaux (lua_State *L, void *block, unsigned long nelems,
+               int inc, int size, const char *errormsg, unsigned long limit) {
+  unsigned long newn = nelems+inc;
+  if (newn >= limit) lua_error(L, errormsg);
+  if ((newn ^ nelems) <= nelems ||  /* still the same power-of-2 limit? */
+       (nelems > 0 && newn < MINPOWER2))  /* or block already is MINPOWER2? */
+      return block;  /* do not need to reallocate */
+  else  /* it crossed a power-of-2 boundary; grow to next power */
+    return luaM_realloc(L, block, luaO_power2(newn)*size);
+}
+
+
+/*
+** generic allocation routine.
+*/
+void *luaM_realloc (lua_State *L, void *block, unsigned long size) {
+  size_t s = (size_t)size;
+  if (s != size)
+    lua_error(L, "memory allocation error: block too big");
+  if (size == 0) {
+    free(block);  /* block may be NULL; that is OK for free */
+    return NULL;
+  }
+  block = realloc(block, s);
+  if (block == NULL)
+    lua_error(L, memEM);
+  return block;
+}
+
+