diff dmd/Util.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 1475fd394c9e
children cd48cb899aee
line wrap: on
line diff
--- a/dmd/Util.d	Sun Oct 10 10:38:55 2010 +0400
+++ b/dmd/Util.d	Sun Oct 17 07:42:00 2010 +0400
@@ -32,7 +32,7 @@
 version (Bug4054) import core.memory;
 
 extern(C) int putenv(char*);
-/+version (LOG) 
+/+version (LOG)
 {
 	static if( !is(typeof(printf)) )
 		extern (C) int printf(const char*,...);
@@ -104,19 +104,21 @@
 
 T cloneThis(T)(T ptr)
 {
-	// similar code is used in Type.clone()
-	// TODO: move to Util or something...
-	size_t size = __traits(classInstanceSize, T);
+	size_t size = ptr.classinfo.init.length;
 	void* mem = GC.malloc(size);
 	memcpy(mem, cast(void*)ptr, size);
-	
-	return cast(T)mem;
+
+	auto result = cast(T)mem;
+
+	result.forceRegister();
+
+	return result;
 }
 
 char* strupr(char* s)
 {
     char* t = s;
-    
+
     while (*s)
     {
 		*s = cast(char)toupper(*s);
@@ -133,7 +135,7 @@
 			return p[i..$];
 		}
 	}
-	
+
 	return null;
 }
 
@@ -141,7 +143,7 @@
 {
     while (isspace(*p))
 		p++;
-		
+
 	return p;
 }
 
@@ -218,7 +220,7 @@
 						if (!filename) {
 							goto Letc;		// argv0 not found on path
 						}
-						
+
 						filename = FileName.replaceName(filename, inifile);
 						if (FileName.exists(filename)) {
 							goto Ldone;
@@ -235,7 +237,7 @@
 			}
 		}
     }
-	
+
     path = cast(char*)toStringz(FileName.path(filename));
 
 version (LOG) {
@@ -247,7 +249,7 @@
     if (file.read()) {
 		return;			// error reading file
 	}
-	
+
 	scope OutBuffer buf = new OutBuffer();
 
     // Parse into lines
@@ -365,7 +367,7 @@
 					for (pn = pp.ptr; isalnum(*pn); pn++) {
 						;
 					}
-					
+
 					if (pn - pp.ptr == 11 &&
 						memicmp(pp.ptr, "Environment", 11) == 0 &&
 						*skipspace(pn) == ']'
@@ -463,7 +465,7 @@
 			slash = 0;
 			instring = 0;
 			c = 0;
-			
+
 			char* ecopy = e;
 
 			while (1)
@@ -641,7 +643,7 @@
     precedence[TOK.TOKdiv] = PREC.PREC_mul;
     precedence[TOK.TOKmod] = PREC.PREC_mul;
     precedence[TOKpow]     = PREC.PREC_mul;
-	
+
     precedence[TOK.TOKadd] = PREC.PREC_add;
     precedence[TOK.TOKmin] = PREC.PREC_add;
     precedence[TOK.TOKcat] = PREC.PREC_add;
@@ -739,7 +741,7 @@
     if (global.params.exefile)
 		writeFilename(cmdbuf, global.params.exefile);
     else
-    {	
+    {
 		/* Generate exe file name from first obj name.
 		 * No need to add it to cmdbuf because the linker will default to it.
 		 */
@@ -750,7 +752,7 @@
     }
 
     // Make sure path to exe file exists
-    {	
+    {
 		string pp = FileName.path(global.params.exefile);
 		FileName.ensurePathExists(pp);
     }
@@ -778,7 +780,7 @@
 
     /* Eliminate unnecessary trailing commas	*/
     while (1)
-    {   
+    {
 		i = cmdbuf.offset;
 		if (!i || cmdbuf.data[i - 1] != ',')
 			break;
@@ -855,7 +857,7 @@
     argv.push(cast(void *)cc);
     Array objfiles = new Array;
     for( i = 0; i < global.params.objfiles.dim; i++ )
-    {   string str = (cast(String)global.params.objfiles.data[i]).str; 
+    {   string str = (cast(String)global.params.objfiles.data[i]).str;
     	objfiles.push(cast(void*)toStringz(str));
     }
     argv.insert(1, objfiles);
@@ -976,7 +978,7 @@
     if (status)
 	printf("--- errorlevel %d\n", status);
     return status;
-	
+
 } else {
     writef ("Linking is not yet supported for this version of DMD.\n");
     return -1;
@@ -1003,7 +1005,7 @@
     /* Loop and see if we need to quote
      */
     for (size_t i = 0; i < len; i++)
-    {	
+    {
 		char c = filename[i];
 
 		if (isalnum(c) || c == '_')
@@ -1042,13 +1044,13 @@
     }
 
     if (len > 255)
-    {   
+    {
 		char* q;
 		char[9] envname = "@_CMDLINE";
 
 		envname[0] = '@';
 		switch (useenv)
-		{   
+		{
 			case 0:	goto L1;
 			case 2: envname[0] = '%';	break;
 			default: break;	///
@@ -1139,42 +1141,43 @@
 }
 }
 }
-/*
+
 extern(C++) void util_assert(char* file,int line)
 {
     fflush(stdout);
     printf("Internal error: %s %d\n",file,line);
     throw new Exception("Internal error");
 }
-
+/*
 extern (C++) {
 	void* mem_malloc(uint size)
 	{
 		return GC.malloc(size);
 	}
-	
+
 	void* mem_calloc(uint size)
 	{
 		return GC.calloc(size);
 	}
-	
+
 	void* mem_realloc(void* ptr, uint size)
 	{
 		return GC.realloc(ptr, size);
 	}
-	
+
 	void mem_free(void* ptr)
 	{
 		GC.free(ptr);
 	}
-	
+
 	void* mem_fmalloc(uint size)
 	{
 		return mem_malloc(size);
 	}
-	
+
 	void* mem_fcalloc(uint size)
 	{
 		return mem_calloc(size);
 	}
-}*/
\ No newline at end of file
+}
+*/
\ No newline at end of file