[svn] r5805: nemerle/trunk: ncc/generation/HierarchyEmitter.n ncc/passes.n tools/nant-task/example.build

malekith svnadmin at nemerle.org
Wed Oct 5 21:50:42 CEST 2005


Log:
Clean resolve_event handlers to avoid memory leak.

Author: malekith
Date: Wed Oct  5 21:50:41 2005
New Revision: 5805

Modified:
   nemerle/trunk/ncc/generation/HierarchyEmitter.n
   nemerle/trunk/ncc/passes.n
   nemerle/trunk/tools/nant-task/example.build

Modified: nemerle/trunk/ncc/generation/HierarchyEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/HierarchyEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/HierarchyEmitter.n	Wed Oct  5 21:50:41 2005
@@ -77,7 +77,12 @@
           Emit.AssemblyBuilderAccess.Save;
  
       // workaround MS.NET bugs with some specific value / generic types hierarchy     
-      System.AppDomain.CurrentDomain.TypeResolve += resolve_hack;
+      def delegate_ = resolve_hack : System.ResolveEventHandler;
+      System.AppDomain.CurrentDomain.TypeResolve += delegate_;
+      // we need to later remove it to avoid garbage
+      Passes.CleanupOnce.Push (fun () { 
+        System.AppDomain.CurrentDomain.TypeResolve -= delegate_;
+      });
 
       def dir = Path.GetDirectoryName(Path.GetFullPath (_OutputFileName));
       unless (Directory.Exists (dir))

Modified: nemerle/trunk/ncc/passes.n
==============================================================================
--- nemerle/trunk/ncc/passes.n	(original)
+++ nemerle/trunk/ncc/passes.n	Wed Oct  5 21:50:41 2005
@@ -72,6 +72,9 @@
     public delegate InitDelegate () : void;
     public event OnInit : InitDelegate;
     
+    /** Each function put here is executed once, after the compiler has finished. */
+    public CleanupOnce : Queue [void -> void] = Queue ();
+    
     /// initialize pipelines with default values
     this () {
       LexingPipeline = LexerFile;
@@ -130,6 +133,8 @@
       Passes.Solver = Solver ();
       Hierarchy = null;
       when (OnInit != null) OnInit ();
+      while (! CleanupOnce.IsEmpty)
+        (CleanupOnce.Take ()) ();
     }
 
     internal LoadExternalLibraries () : void {
@@ -221,6 +226,8 @@
 
       /// some cleanup
       WarningOptions.Clean ();
+      while (! CleanupOnce.IsEmpty)
+        (CleanupOnce.Take ()) ();
     }      
   }
 }

Modified: nemerle/trunk/tools/nant-task/example.build
==============================================================================
--- nemerle/trunk/tools/nant-task/example.build	(original)
+++ nemerle/trunk/tools/nant-task/example.build	Wed Oct  5 21:50:41 2005
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <project name="example" default="all" >
   <target name="all">
-    <ncc target="library" output="Nemerle.NAnt.Tasks.dll">
+    <ncc target="library" output="Nemerle.NAnt.Tasks.x.dll">
       <sources>
         <include name="*.n" />
       </sources>
@@ -11,6 +11,7 @@
         </lib>
         <include name="NAnt.DotNetTasks.dll" />
         <include name="NAnt.Core.dll" />
+        <include name="foo.dll" />
       </references>
     </ncc>
   </target>



More information about the svn mailing list