dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Reflection/Emit Assemb


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Reflection/Emit AssemblyBuilder.cs,1.5,1.6 ConstructorBuilder.cs,1.4,1.5 EventBuilder.cs,1.4,1.5 FieldBuilder.cs,1.5,1.6 ILGenerator.cs,1.7,1.8 MethodBuilder.cs,1.4,1.5 ModuleBuilder.cs,1.6,1.7 PropertyBuilder.cs,1.5,1.6 SignatureHelper.cs,1.2,1.3 TypeBuilder.cs,1.6,1.7
Date: Sat, 22 Mar 2003 00:55:16 -0500

Update of /cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit
In directory subversions:/tmp/cvs-serv9126/runtime/System/Reflection/Emit

Modified Files:
        AssemblyBuilder.cs ConstructorBuilder.cs EventBuilder.cs 
        FieldBuilder.cs ILGenerator.cs MethodBuilder.cs 
        ModuleBuilder.cs PropertyBuilder.cs SignatureHelper.cs 
        TypeBuilder.cs 
Log Message:


Harden and secure the Reflection.Emit API against multi-threaded access.


Index: AssemblyBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/AssemblyBuilder.cs,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -r1.5 -r1.6
*** AssemblyBuilder.cs  22 Mar 2003 01:33:16 -0000      1.5
--- AssemblyBuilder.cs  22 Mar 2003 05:55:13 -0000      1.6
***************
*** 27,30 ****
--- 27,31 ----
  using System;
  using System.IO;
+ using System.Collections;
  using System.Reflection;
  using System.Security;
***************
*** 44,47 ****
--- 45,49 ----
        private IntPtr writer;
        private ModuleBuilder module;
+       private ArrayList detachList;
  
        // Constructor.  Called from AppDomain.DefineDynamicAssembly.
***************
*** 54,69 ****
                                this.saved = false;
                                this.entryPoint = null;
                                Version version = name.Version;
!                               if(version != null)
                                {
!                                       this.privateData = ClrAssemblyCreate
!                                               (name.Name, version.Major, 
version.Minor,
!                                                version.Build, 
version.Revision,
!                                                access, out writer);
!                               }
!                               else
!                               {
!                                       this.privateData = ClrAssemblyCreate
!                                               (name.Name, 0, 0, 0, 0, access, 
out writer);
                                }
                                if(this.privateData == IntPtr.Zero)
--- 56,75 ----
                                this.saved = false;
                                this.entryPoint = null;
+                               this.detachList = new ArrayList();
                                Version version = name.Version;
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       if(version != null)
!                                       {
!                                               this.privateData = 
ClrAssemblyCreate
!                                                       (name.Name, 
version.Major, version.Minor,
!                                                        version.Build, 
version.Revision,
!                                                        access, out writer);
!                                       }
!                                       else
!                                       {
!                                               this.privateData = 
ClrAssemblyCreate
!                                                       (name.Name, 0, 0, 0, 0, 
access, out writer);
!                                       }
                                }
                                if(this.privateData == IntPtr.Zero)
***************
*** 336,343 ****
                                                
(_("Invalid_EntryNotInAssembly"));
                                }
!                       /* TODO
!                               
ClrSetEntryPoint(((MethodBuilder)entryMethod).ClrHandle,
                                                                 fileKind);
!                       */
                                entryPoint = entryMethod;
                        }
--- 342,352 ----
                                                
(_("Invalid_EntryNotInAssembly"));
                                }
!                               lock(typeof(AssemblyBuilder))
!                               {
!                               /*      TODO
!                                       
ClrSetEntryPoint(((MethodBuilder)entryMethod).ClrHandle,
                                                                 fileKind);
!                               */
!                               }
                                entryPoint = entryMethod;
                        }
***************
*** 365,368 ****
--- 374,400 ----
                        {
                                throw new 
NotImplementedException("AddDeclarativeSecurity");
+                       }
+ 
+       // Add an item to this assembly's detach list.
+       internal void AddDetach(IDetachItem item)
+                       {
+                               lock(typeof(AssemblyBuilder))
+                               {
+                                       detachList.Add(item);
+                               }
+                       }
+ 
+       // Detach everything used by this assembly, which ensures that
+       // all pointers to native structures are invalidated.
+       private void Detach()
+                       {
+                               lock(typeof(AssemblyBuilder))
+                               {
+                                       foreach(IDetachItem item in detachList)
+                                       {
+                                               item.Detach();
+                                       }
+                                       privateData = IntPtr.Zero;
+                               }
                        }
  

Index: ConstructorBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/ConstructorBuilder.cs,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -r1.4 -r1.5
*** ConstructorBuilder.cs       22 Mar 2003 05:12:30 -0000      1.4
--- ConstructorBuilder.cs       22 Mar 2003 05:55:13 -0000      1.5
***************
*** 33,37 ****
  using System.Runtime.CompilerServices;
  
! public sealed class ConstructorBuilder : ConstructorInfo, IClrProgramItem
  {
        // Internal state.
--- 33,38 ----
  using System.Runtime.CompilerServices;
  
! public sealed class ConstructorBuilder
!               : ConstructorInfo, IClrProgramItem, IDetachItem
  {
        // Internal state.
***************
*** 56,59 ****
--- 57,63 ----
                                this.initLocals = true;
  
+                               // Register this item to be detached later.
+                               type.module.assembly.AddDetach(this);
+ 
                                // Create the signature.
                                helper = SignatureHelper.GetMethodSigHelper
***************
*** 63,69 ****
  
                                // Create the constructor method.
!                               this.privateData = MethodBuilder.ClrMethodCreate
!                                       (((IClrProgramItem)type).ClrHandle, 
name,
!                                        attributes, helper.sig);
  
                                // Add the constructor to the type for 
post-processing.
--- 67,76 ----
  
                                // Create the constructor method.
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       this.privateData = 
MethodBuilder.ClrMethodCreate
!                                               
(((IClrProgramItem)type).ClrHandle, name,
!                                                attributes, helper.sig);
!                               }
  
                                // Add the constructor to the type for 
post-processing.
***************
*** 133,137 ****
        public override MethodImplAttributes GetMethodImplementationFlags()
                        {
!                               return ClrHelpers.GetImplAttrs(privateData);
                        }
  
--- 140,147 ----
        public override MethodImplAttributes GetMethodImplementationFlags()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return 
ClrHelpers.GetImplAttrs(privateData);
!                               }
                        }
  
***************
*** 145,156 ****
        public override ParameterInfo[] GetParameters()
                        {
!                               int param;
!                               ParameterInfo[] parameters = new ParameterInfo 
[numParams];
!                               for(param = 0; param < numParams; ++param)
                                {
!                                       parameters[param] =
!                                               
ClrHelpers.GetParameterInfo(this, this, param + 1);
                                }
-                               return parameters;
                        }
  
--- 155,169 ----
        public override ParameterInfo[] GetParameters()
                        {
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       int param;
!                                       ParameterInfo[] parameters = new 
ParameterInfo [numParams];
!                                       for(param = 0; param < numParams; 
++param)
!                                       {
!                                               parameters[param] =
!                                                       
ClrHelpers.GetParameterInfo(this, this, param + 1);
!                                       }
!                                       return parameters;
                                }
                        }
  
***************
*** 158,163 ****
        public MethodToken GetToken()
                        {
!                               return new MethodToken
!                                       
(AssemblyBuilder.ClrGetItemToken(privateData));
                        }
  
--- 171,179 ----
        public MethodToken GetToken()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return new MethodToken
!                                               
(AssemblyBuilder.ClrGetItemToken(privateData));
!                               }
                        }
  
***************
*** 216,221 ****
                                {
                                        type.StartSync();
!                                       MethodBuilder.ClrMethodSetImplAttrs
!                                               (privateData, attributes);
                                }
                                finally
--- 232,240 ----
                                {
                                        type.StartSync();
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               
MethodBuilder.ClrMethodSetImplAttrs
!                                                       (privateData, 
attributes);
!                                       }
                                }
                                finally
***************
*** 244,249 ****
                                get
                                {
!                                       return (MethodAttributes)
!                                               
ClrHelpers.GetMemberAttrs(privateData);
                                }
                        }
--- 263,271 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return (MethodAttributes)
!                                                       
ClrHelpers.GetMemberAttrs(privateData);
!                                       }
                                }
                        }
***************
*** 285,289 ****
                                get
                                {
!                                       return ClrHelpers.GetName(this);
                                }
                        }
--- 307,314 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return ClrHelpers.GetName(this);
!                                       }
                                }
                        }
***************
*** 329,332 ****
--- 354,363 ----
                        {
                                // TODO
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               privateData = IntPtr.Zero;
                        }
  

Index: EventBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/EventBuilder.cs,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -r1.4 -r1.5
*** EventBuilder.cs     22 Mar 2003 05:12:30 -0000      1.4
--- EventBuilder.cs     22 Mar 2003 05:55:13 -0000      1.5
***************
*** 30,34 ****
  using System.Runtime.CompilerServices;
  
! public sealed class EventBuilder : IClrProgramItem
  {
        // Internal state.
--- 30,34 ----
  using System.Runtime.CompilerServices;
  
! public sealed class EventBuilder : IClrProgramItem, IDetachItem
  {
        // Internal state.
***************
*** 50,59 ****
                                }
  
                                // Create the event.
!                               this.type = type;
!                               this.privateData = ClrEventCreate
!                                       (((IClrProgramItem)type).ClrHandle, 
name,
!                                        
SignatureHelper.CSToILType(type.module, eventType),
!                                        attributes);
                        }
  
--- 50,65 ----
                                }
  
+                               // Register this item to be detached later.
+                               type.module.assembly.AddDetach(this);
+ 
                                // Create the event.
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       this.type = type;
!                                       this.privateData = ClrEventCreate
!                                               
(((IClrProgramItem)type).ClrHandle, name,
!                                               
SignatureHelper.CSToILType(type.module, eventType),
!                                               attributes);
!                               }
                        }
  
***************
*** 69,75 ****
                                                throw new 
ArgumentNullException("mdBuilder");
                                        }
!                                       ClrEventAddSemantics
!                                               (privateData, attr,
!                                                
type.module.GetMethodToken(mdBuilder));
                                }
                                finally
--- 75,84 ----
                                                throw new 
ArgumentNullException("mdBuilder");
                                        }
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               ClrEventAddSemantics
!                                                       (privateData, attr,
!                                                       
type.module.GetMethodToken(mdBuilder));
!                                       }
                                }
                                finally
***************
*** 88,93 ****
        public EventToken GetEventToken()
                        {
!                               return new EventToken
!                                       
(AssemblyBuilder.ClrGetItemToken(privateData));
                        }
  
--- 97,105 ----
        public EventToken GetEventToken()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return new EventToken
!                                               
(AssemblyBuilder.ClrGetItemToken(privateData));
!                               }
                        }
  
***************
*** 145,148 ****
--- 157,166 ----
                                        return privateData;
                                }
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               privateData = IntPtr.Zero;
                        }
  

Index: FieldBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/FieldBuilder.cs,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -r1.5 -r1.6
*** FieldBuilder.cs     22 Mar 2003 05:12:30 -0000      1.5
--- FieldBuilder.cs     22 Mar 2003 05:55:13 -0000      1.6
***************
*** 30,34 ****
  using System.Runtime.CompilerServices;
  
! public sealed class FieldBuilder : FieldInfo, IClrProgramItem
  {
        // Internal state.
--- 30,34 ----
  using System.Runtime.CompilerServices;
  
! public sealed class FieldBuilder : FieldInfo, IClrProgramItem, IDetachItem
  {
        // Internal state.
***************
*** 40,48 ****
                                                  FieldAttributes attributes)
                        {
!                               this.type = type;
!                               this.privateData = ClrFieldCreate
!                                       (((IClrProgramItem)type).ClrHandle, 
name,
!                                        
SignatureHelper.CSToILType(type.module, fieldType),
!                                        attributes);
                        }
  
--- 40,55 ----
                                                  FieldAttributes attributes)
                        {
!                               // Register this item to be detached later.
!                               type.module.assembly.AddDetach(this);
! 
!                               // Create the field.
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       this.type = type;
!                                       this.privateData = ClrFieldCreate
!                                               
(((IClrProgramItem)type).ClrHandle, name,
!                                               
SignatureHelper.CSToILType(type.module, fieldType),
!                                               attributes);
!                               }
                        }
  
***************
*** 61,66 ****
        public FieldToken GetToken()
                        {
!                               return new FieldToken
!                                       
(AssemblyBuilder.ClrGetItemToken(privateData));
                        }
  
--- 68,76 ----
        public FieldToken GetToken()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return new FieldToken
!                                               
(AssemblyBuilder.ClrGetItemToken(privateData));
!                               }
                        }
  
***************
*** 84,88 ****
                                        type.StartSync();
                                        ValidateConstant(FieldType, 
defaultValue);
!                                       ClrFieldSetConstant(privateData, 
defaultValue);
                                }
                                finally
--- 94,101 ----
                                        type.StartSync();
                                        ValidateConstant(FieldType, 
defaultValue);
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               
ClrFieldSetConstant(privateData, defaultValue);
!                                       }
                                }
                                finally
***************
*** 130,134 ****
                                                throw new 
ArgumentNullException("unmanagedMarshal");
                                        }
!                                       ClrFieldSetMarshal(privateData, 
unmanagedMarshal.ToBytes());
                                }
                                finally
--- 143,151 ----
                                                throw new 
ArgumentNullException("unmanagedMarshal");
                                        }
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               ClrFieldSetMarshal
!                                                       (privateData, 
unmanagedMarshal.ToBytes());
!                                       }
                                }
                                finally
***************
*** 144,148 ****
                                {
                                        type.StartSync();
!                                       ClrFieldSetOffset(privateData, iOffset);
                                }
                                finally
--- 161,168 ----
                                {
                                        type.StartSync();
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               ClrFieldSetOffset(privateData, 
iOffset);
!                                       }
                                }
                                finally
***************
*** 166,171 ****
                                get
                                {
!                                       return (FieldAttributes)
!                                               
ClrHelpers.GetMemberAttrs(privateData);
                                }
                        }
--- 186,194 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return (FieldAttributes)
!                                                       
ClrHelpers.GetMemberAttrs(privateData);
!                                       }
                                }
                        }
***************
*** 194,198 ****
                                get
                                {
!                                       return 
ClrField.GetFieldType(privateData);
                                }
                        }
--- 217,224 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return 
ClrField.GetFieldType(privateData);
!                                       }
                                }
                        }
***************
*** 203,207 ****
                                get
                                {
!                                       return ClrHelpers.GetName(this);
                                }
                        }
--- 229,236 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return ClrHelpers.GetName(this);
!                                       }
                                }
                        }
***************
*** 266,269 ****
--- 295,304 ----
                                        throw new 
ArgumentException(_("Emit_InvalidConstant"));
                                }
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               privateData = IntPtr.Zero;
                        }
  

Index: ILGenerator.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/ILGenerator.cs,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -r1.7 -r1.8
*** ILGenerator.cs      22 Mar 2003 05:12:30 -0000      1.7
--- ILGenerator.cs      22 Mar 2003 05:55:13 -0000      1.8
***************
*** 32,36 ****
  using System.Runtime.InteropServices;
  
! public class ILGenerator
  {
        // Internal state.
--- 32,36 ----
  using System.Runtime.InteropServices;
  
! public class ILGenerator : IDetachItem
  {
        // Internal state.
***************
*** 124,127 ****
--- 124,128 ----
                                exceptionListEnd = null;
                                tokenFixups = null;
+                               module.assembly.AddDetach(this);
                        }
  
***************
*** 1216,1219 ****
--- 1217,1226 ----
                                        throw new 
ArgumentException(_("Emit_NameEmpty"));
                                }
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               tokenFixups = null;
                        }
  

Index: MethodBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/MethodBuilder.cs,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -r1.4 -r1.5
*** MethodBuilder.cs    22 Mar 2003 05:12:30 -0000      1.4
--- MethodBuilder.cs    22 Mar 2003 05:55:13 -0000      1.5
***************
*** 33,37 ****
  using System.Runtime.CompilerServices;
  
! public sealed class MethodBuilder : MethodInfo, IClrProgramItem
  {
        // Internal state.
--- 33,37 ----
  using System.Runtime.CompilerServices;
  
! public sealed class MethodBuilder : MethodInfo, IClrProgramItem, IDetachItem
  {
        // Internal state.
***************
*** 79,82 ****
--- 79,85 ----
                                                                        ? 
parameterTypes.Length : 0);
  
+                               // Register this item to be detached later.
+                               type.module.assembly.AddDetach(this);
+ 
                                // Create the method signature.
                                helper = SignatureHelper.GetMethodSigHelper
***************
*** 86,92 ****
  
                                // Create the method.
!                               this.privateData = ClrMethodCreate
!                                       (((IClrProgramItem)type).ClrHandle, 
name,
!                                        attributes, helper.sig);
  
                                // Add the method to the type for 
post-processing.
--- 89,98 ----
  
                                // Create the method.
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       this.privateData = ClrMethodCreate
!                                               
(((IClrProgramItem)type).ClrHandle, name,
!                                                attributes, helper.sig);
!                               }
  
                                // Add the method to the type for 
post-processing.
***************
*** 209,213 ****
        public override MethodImplAttributes GetMethodImplementationFlags()
                        {
!                               return ClrHelpers.GetImplAttrs(privateData);
                        }
  
--- 215,222 ----
        public override MethodImplAttributes GetMethodImplementationFlags()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return 
ClrHelpers.GetImplAttrs(privateData);
!                               }
                        }
  
***************
*** 221,232 ****
        public override ParameterInfo[] GetParameters()
                        {
!                               int param;
!                               ParameterInfo[] parameters = new ParameterInfo 
[numParams];
!                               for(param = 0; param < numParams; ++param)
                                {
!                                       parameters[param] =
!                                               
ClrHelpers.GetParameterInfo(this, this, param + 1);
                                }
-                               return parameters;
                        }
  
--- 230,244 ----
        public override ParameterInfo[] GetParameters()
                        {
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       int param;
!                                       ParameterInfo[] parameters = new 
ParameterInfo [numParams];
!                                       for(param = 0; param < numParams; 
++param)
!                                       {
!                                               parameters[param] =
!                                                       
ClrHelpers.GetParameterInfo(this, this, param + 1);
!                                       }
!                                       return parameters;
                                }
                        }
  
***************
*** 234,239 ****
        public MethodToken GetToken()
                        {
!                               return new MethodToken
!                                       
(AssemblyBuilder.ClrGetItemToken(privateData));
                        }
  
--- 246,254 ----
        public MethodToken GetToken()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return new MethodToken
!                                               
(AssemblyBuilder.ClrGetItemToken(privateData));
!                               }
                        }
  
***************
*** 286,290 ****
                                {
                                        type.StartSync();
!                                       ClrMethodSetImplAttrs(privateData, 
attributes);
                                }
                                finally
--- 301,308 ----
                                {
                                        type.StartSync();
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               
ClrMethodSetImplAttrs(privateData, attributes);
!                                       }
                                }
                                finally
***************
*** 378,383 ****
                                get
                                {
!                                       return (MethodAttributes)
!                                               
ClrHelpers.GetMemberAttrs(privateData);
                                }
                        }
--- 396,404 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return (MethodAttributes)
!                                                       
ClrHelpers.GetMemberAttrs(privateData);
!                                       }
                                }
                        }
***************
*** 388,392 ****
                                get
                                {
!                                       return 
ClrHelpers.GetCallConv(privateData);
                                }
                        }
--- 409,416 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return 
ClrHelpers.GetCallConv(privateData);
!                                       }
                                }
                        }
***************
*** 428,432 ****
                                get
                                {
!                                       return ClrHelpers.GetName(this);
                                }
                        }
--- 452,459 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return ClrHelpers.GetName(this);
!                                       }
                                }
                        }
***************
*** 482,485 ****
--- 509,518 ----
                        {
                                // TODO
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               privateData = IntPtr.Zero;
                        }
  

Index: ModuleBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/ModuleBuilder.cs,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** ModuleBuilder.cs    22 Mar 2003 01:33:16 -0000      1.6
--- ModuleBuilder.cs    22 Mar 2003 05:55:13 -0000      1.7
***************
*** 34,38 ****
  using System.Runtime.CompilerServices;
  
! public class ModuleBuilder : Module
  {
        // Internal state.
--- 34,38 ----
  using System.Runtime.CompilerServices;
  
! public class ModuleBuilder : Module, IDetachItem
  {
        // Internal state.
***************
*** 53,58 ****
                                this.emitSymbolInfo = emitSymbolInfo;
  
                                // Create a new module within the assembly.
!                               privateData = 
ClrModuleCreate(assembly.privateData, name);
  
                                // Create the module type for this module.
--- 53,64 ----
                                this.emitSymbolInfo = emitSymbolInfo;
  
+                               // Register this object for detaching.
+                               assembly.AddDetach(this);
+ 
                                // Create a new module within the assembly.
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       privateData = 
ClrModuleCreate(assembly.privateData, name);
!                               }
  
                                // Create the module type for this module.
***************
*** 398,404 ****
                                else if(con is ClrConstructor)
                                {
!                                       return new MethodToken
!                                               (TypeBuilder.ClrTypeImportMember
!                                                       (privateData, 
((ClrConstructor)con).ClrHandle));
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
--- 404,413 ----
                                else if(con is ClrConstructor)
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return new MethodToken
!                                                       
(TypeBuilder.ClrTypeImportMember
!                                                               (privateData, 
((ClrConstructor)con).ClrHandle));
!                                       }
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
***************
*** 423,429 ****
                                else if(field is ClrField)
                                {
!                                       return new FieldToken
!                                               (TypeBuilder.ClrTypeImportMember
!                                                       (privateData, 
((ClrField)field).ClrHandle));
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
--- 432,441 ----
                                else if(field is ClrField)
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return new FieldToken
!                                                       
(TypeBuilder.ClrTypeImportMember
!                                                               (privateData, 
((ClrField)field).ClrHandle));
!                                       }
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
***************
*** 448,454 ****
                                else if(method is ClrMethod)
                                {
!                                       return new MethodToken
!                                               (TypeBuilder.ClrTypeImportMember
!                                                       (privateData, 
((ClrMethod)method).ClrHandle));
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
--- 460,469 ----
                                else if(method is ClrMethod)
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return new MethodToken
!                                                       
(TypeBuilder.ClrTypeImportMember
!                                                               (privateData, 
((ClrMethod)method).ClrHandle));
!                                       }
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
***************
*** 476,481 ****
                                        throw new ArgumentNullException("str");
                                }
!                               return new StringToken
!                                       (ClrModuleCreateString(privateData, 
str));
                        }
  
--- 491,499 ----
                                        throw new ArgumentNullException("str");
                                }
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return new StringToken
!                                               
(ClrModuleCreateString(privateData, str));
!                               }
                        }
  
***************
*** 584,590 ****
                                                        
(_("Emit_CannotImportRefType"));
                                        }
!                                       return new TypeToken
!                                               (TypeBuilder.ClrTypeImport
!                                                       (privateData, 
((ClrType)type).ClrHandle));
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
--- 602,611 ----
                                                        
(_("Emit_CannotImportRefType"));
                                        }
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return new TypeToken
!                                                       
(TypeBuilder.ClrTypeImport
!                                                               (privateData, 
((ClrType)type).ClrHandle));
!                                       }
                                }
                                throw new 
InvalidOperationException(_("Emit_CannotImportItem"));
***************
*** 654,657 ****
--- 675,684 ----
                                        EndSync();
                                }
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               privateData = IntPtr.Zero;
                        }
  

Index: PropertyBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/PropertyBuilder.cs,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -r1.5 -r1.6
*** PropertyBuilder.cs  22 Mar 2003 05:12:30 -0000      1.5
--- PropertyBuilder.cs  22 Mar 2003 05:55:13 -0000      1.6
***************
*** 30,34 ****
  using System.Runtime.CompilerServices;
  
! public sealed class PropertyBuilder : PropertyInfo, IClrProgramItem
  {
        // Internal state.
--- 30,35 ----
  using System.Runtime.CompilerServices;
  
! public sealed class PropertyBuilder
!       : PropertyInfo, IClrProgramItem, IDetachItem
  {
        // Internal state.
***************
*** 60,63 ****
--- 61,67 ----
                                this.setMethod = null;
  
+                               // Register this item to be detached later.
+                               type.module.assembly.AddDetach(this);
+ 
                                // Create the property signature.
                                SignatureHelper helper =
***************
*** 66,72 ****
  
                                // Create the property.
!                               this.privateData = ClrPropertyCreate
!                                       (((IClrProgramItem)type).ClrHandle, 
name,
!                                        attributes, helper.sig);
                        }
  
--- 70,79 ----
  
                                // Create the property.
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       this.privateData = ClrPropertyCreate
!                                               
(((IClrProgramItem)type).ClrHandle, name,
!                                                attributes, helper.sig);
!                               }
                        }
  
***************
*** 81,87 ****
                                                throw new 
ArgumentNullException("mdBuilder");
                                        }
!                                       ClrPropertyAddSemantics
!                                               (privateData, 
MethodSemanticsAttributes.Other,
!                                                
type.module.GetMethodToken(mdBuilder));
                                }
                                finally
--- 88,97 ----
                                                throw new 
ArgumentNullException("mdBuilder");
                                        }
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               ClrPropertyAddSemantics
!                                                       (privateData, 
MethodSemanticsAttributes.Other,
!                                                       
type.module.GetMethodToken(mdBuilder));
!                                       }
                                }
                                finally
***************
*** 177,181 ****
                                        type.StartSync();
                                        
FieldBuilder.ValidateConstant(returnType, defaultValue);
!                                       ClrPropertySetConstant(privateData, 
defaultValue);
                                }
                                finally
--- 187,194 ----
                                        type.StartSync();
                                        
FieldBuilder.ValidateConstant(returnType, defaultValue);
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               
ClrPropertySetConstant(privateData, defaultValue);
!                                       }
                                }
                                finally
***************
*** 228,234 ****
                                                        
(_("Emit_GetAlreadyDefined"));
                                        }
!                                       ClrPropertyAddSemantics
!                                               (privateData, 
MethodSemanticsAttributes.Getter,
!                                                
type.module.GetMethodToken(mdBuilder));
                                        getMethod = mdBuilder;
                                }
--- 241,250 ----
                                                        
(_("Emit_GetAlreadyDefined"));
                                        }
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               ClrPropertyAddSemantics
!                                                       (privateData, 
MethodSemanticsAttributes.Getter,
!                                                       
type.module.GetMethodToken(mdBuilder));
!                                       }
                                        getMethod = mdBuilder;
                                }
***************
*** 254,260 ****
                                                        
(_("Emit_SetAlreadyDefined"));
                                        }
!                                       ClrPropertyAddSemantics
!                                               (privateData, 
MethodSemanticsAttributes.Setter,
!                                                
type.module.GetMethodToken(mdBuilder));
                                        setMethod = mdBuilder;
                                }
--- 270,279 ----
                                                        
(_("Emit_SetAlreadyDefined"));
                                        }
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               ClrPropertyAddSemantics
!                                                       (privateData, 
MethodSemanticsAttributes.Setter,
!                                                       
type.module.GetMethodToken(mdBuilder));
!                                       }
                                        setMethod = mdBuilder;
                                }
***************
*** 283,288 ****
                                get
                                {
!                                       return (PropertyAttributes)
!                                               
ClrHelpers.GetMemberAttrs(privateData);
                                }
                        }
--- 302,310 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return (PropertyAttributes)
!                                                       
ClrHelpers.GetMemberAttrs(privateData);
!                                       }
                                }
                        }
***************
*** 320,324 ****
                                get
                                {
!                                       return ClrHelpers.GetName(this);
                                }
                        }
--- 342,349 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return ClrHelpers.GetName(this);
!                                       }
                                }
                        }
***************
*** 329,334 ****
                                get
                                {
!                                       return new PropertyToken
!                                               
(AssemblyBuilder.ClrGetItemToken(privateData));
                                }
                        }
--- 354,362 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return new PropertyToken
!                                                       
(AssemblyBuilder.ClrGetItemToken(privateData));
!                                       }
                                }
                        }
***************
*** 359,362 ****
--- 387,396 ----
                                        return privateData;
                                }
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               privateData = IntPtr.Zero;
                        }
  

Index: SignatureHelper.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/SignatureHelper.cs,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -r1.2 -r1.3
*** SignatureHelper.cs  22 Mar 2003 05:12:30 -0000      1.2
--- SignatureHelper.cs  22 Mar 2003 05:55:13 -0000      1.3
***************
*** 32,36 ****
  using System.Runtime.CompilerServices;
  
! public sealed class SignatureHelper
  {
        // Internal state.
--- 32,36 ----
  using System.Runtime.CompilerServices;
  
! public sealed class SignatureHelper : IDetachItem
  {
        // Internal state.
***************
*** 49,52 ****
--- 49,54 ----
                                this.numArgs = 0;
                                this.callConv = (CallingConvention)0;
+                               ((ModuleBuilder)mod).assembly.AddDetach(this);
+ 
                        }
        private SignatureHelper(Module mod, IntPtr context, IntPtr sig,
***************
*** 58,61 ****
--- 60,64 ----
                                this.numArgs = 0;
                                this.callConv = callConv;
+                               ((ModuleBuilder)mod).assembly.AddDetach(this);
                        }
  
***************
*** 124,128 ****
        internal static IntPtr CSToILType(Module mod, Type type)
                        {
!                               return CSToILType(mod, ModuleToContext(mod), 
type);
                        }
  
--- 127,134 ----
        internal static IntPtr CSToILType(Module mod, Type type)
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return CSToILType(mod, 
ModuleToContext(mod), type);
!                               }
                        }
  
***************
*** 130,136 ****
        public static SignatureHelper GetFieldSigHelper(Module mod)
                        {
!                               IntPtr context = ModuleToContext(mod);
!                               return new SignatureHelper
!                                       (mod, context, 
ClrSigCreateField(context));
                        }
  
--- 136,145 ----
        public static SignatureHelper GetFieldSigHelper(Module mod)
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       IntPtr context = ModuleToContext(mod);
!                                       return new SignatureHelper
!                                               (mod, context, 
ClrSigCreateField(context));
!                               }
                        }
  
***************
*** 138,144 ****
        public static SignatureHelper GetLocalVarSigHelper(Module mod)
                        {
!                               IntPtr context = ModuleToContext(mod);
!                               return new SignatureHelper
!                                       (mod, context, 
ClrSigCreateLocal(context));
                        }
  
--- 147,156 ----
        public static SignatureHelper GetLocalVarSigHelper(Module mod)
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       IntPtr context = ModuleToContext(mod);
!                                       return new SignatureHelper
!                                               (mod, context, 
ClrSigCreateLocal(context));
!                               }
                        }
  
***************
*** 149,185 ****
                                 Type[] parameterTypes)
                        {
!                               // Convert the module into a signature create 
context.
!                               IntPtr context = ModuleToContext(mod);
! 
!                               // Determine the calling convention flags to 
use.
!                               int conv = 0;           /* default */
!                               if((callConv & CallingConventions.VarArgs) != 0)
!                               {
!                                       conv = 0x05;    /* vararg */
!                               }
!                               if((callConv & CallingConventions.HasThis) != 0)
!                               {
!                                       conv |= 0x20;   /* hasthis */
!                               }
!                               if((callConv & CallingConventions.ExplicitThis) 
!= 0)
                                {
!                                       conv |= 0x40;   /* explicitthis */
!                               }
  
!                               // Create the basic signature helper.
!                               IntPtr sig = ClrSigCreateMethod
!                                       (context, conv, CSToILType(mod, 
context, returnType));
!                               SignatureHelper helper = new SignatureHelper
!                                       (mod, context, sig, unmanagedCallConv);
  
!                               // Add the parameters to the helper.
!                               if(parameterTypes != null)
!                               {
!                                       foreach(Type type in parameterTypes)
                                        {
!                                               helper.AddArgument(type);
                                        }
                                }
-                               return helper;
                        }
        public static SignatureHelper GetMethodSigHelper
--- 161,200 ----
                                 Type[] parameterTypes)
                        {
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       // Convert the module into a signature 
create context.
!                                       IntPtr context = ModuleToContext(mod);
! 
!                                       // Determine the calling convention 
flags to use.
!                                       int conv = 0;           /* default */
!                                       if((callConv & 
CallingConventions.VarArgs) != 0)
!                                       {
!                                               conv = 0x05;    /* vararg */
!                                       }
!                                       if((callConv & 
CallingConventions.HasThis) != 0)
!                                       {
!                                               conv |= 0x20;   /* hasthis */
!                                       }
!                                       if((callConv & 
CallingConventions.ExplicitThis) != 0)
!                                       {
!                                               conv |= 0x40;   /* explicitthis 
*/
!                                       }
  
!                                       // Create the basic signature helper.
!                                       IntPtr sig = ClrSigCreateMethod
!                                               (context, conv, CSToILType(mod, 
context, returnType));
!                                       SignatureHelper helper = new 
SignatureHelper
!                                               (mod, context, sig, 
unmanagedCallConv);
  
!                                       // Add the parameters to the helper.
!                                       if(parameterTypes != null)
                                        {
!                                               foreach(Type type in 
parameterTypes)
!                                               {
!                                                       
helper.AddArgument(type);
!                                               }
                                        }
+                                       return helper;
                                }
                        }
        public static SignatureHelper GetMethodSigHelper
***************
*** 209,216 ****
                                (Module mod, MethodToken token)
                        {
!                               IntPtr context = ModuleToContext(mod);
!                               IntPtr sig = ClrSigCreateMethodCopy
!                                       (context, mod.privateData, token.Token);
!                               return new SignatureHelper(mod, context, sig);
                        }
  
--- 224,234 ----
                                (Module mod, MethodToken token)
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       IntPtr context = ModuleToContext(mod);
!                                       IntPtr sig = ClrSigCreateMethodCopy
!                                               (context, mod.privateData, 
token.Token);
!                                       return new SignatureHelper(mod, 
context, sig);
!                               }
                        }
  
***************
*** 219,240 ****
                                (Module mod, Type returnType, Type[] 
parameterTypes)
                        {
!                               // Convert the module into a signature create 
context.
!                               IntPtr context = ModuleToContext(mod);
  
!                               // Create the basic signature helper.
!                               IntPtr sig = ClrSigCreateProperty
!                                       (context, CSToILType(mod, context, 
returnType));
!                               SignatureHelper helper = new SignatureHelper
!                                       (mod, context, sig);
  
!                               // Add the parameters to the helper.
!                               if(parameterTypes != null)
!                               {
!                                       foreach(Type type in parameterTypes)
                                        {
!                                               helper.AddArgument(type);
                                        }
                                }
-                               return helper;
                        }
  
--- 237,261 ----
                                (Module mod, Type returnType, Type[] 
parameterTypes)
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       // Convert the module into a signature 
create context.
!                                       IntPtr context = ModuleToContext(mod);
  
!                                       // Create the basic signature helper.
!                                       IntPtr sig = ClrSigCreateProperty
!                                               (context, CSToILType(mod, 
context, returnType));
!                                       SignatureHelper helper = new 
SignatureHelper
!                                               (mod, context, sig);
  
!                                       // Add the parameters to the helper.
!                                       if(parameterTypes != null)
                                        {
!                                               foreach(Type type in 
parameterTypes)
!                                               {
!                                                       
helper.AddArgument(type);
!                                               }
                                        }
+                                       return helper;
                                }
                        }
  
***************
*** 242,256 ****
        public void AddArgument(Type clsArgument)
                        {
!                               if(clsArgument == null)
!                               {
!                                       throw new 
ArgumentNullException("clsArgument");
!                               }
!                               IntPtr type = CSToILType(mod, context, 
clsArgument);
!                               if(!ClrSigAddArgument(context, sig, type))
                                {
!                                       throw new InvalidOperationException
!                                               (_("Emit_InvalidSigArgument"));
                                }
-                               ++numArgs;
                        }
  
--- 263,280 ----
        public void AddArgument(Type clsArgument)
                        {
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       if(clsArgument == null)
!                                       {
!                                               throw new 
ArgumentNullException("clsArgument");
!                                       }
!                                       IntPtr type = CSToILType(mod, context, 
clsArgument);
!                                       if(!ClrSigAddArgument(context, sig, 
type))
!                                       {
!                                               throw new 
InvalidOperationException
!                                                       
(_("Emit_InvalidSigArgument"));
!                                       }
!                                       ++numArgs;
                                }
                        }
  
***************
*** 258,265 ****
        public void AddSentinel()
                        {
!                               if(!ClrSigAddSentinel(context, sig))
                                {
!                                       throw new InvalidOperationException
!                                               (_("Emit_InvalidSigArgument"));
                                }
                        }
--- 282,292 ----
        public void AddSentinel()
                        {
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       if(!ClrSigAddSentinel(context, sig))
!                                       {
!                                               throw new 
InvalidOperationException
!                                                       
(_("Emit_InvalidSigArgument"));
!                                       }
                                }
                        }
***************
*** 268,279 ****
        public override bool Equals(Object obj)
                        {
!                               SignatureHelper helper = (obj as 
SignatureHelper);
!                               if(helper != null && helper.mod == mod)
!                               {
!                                       return ClrSigIdentical(sig, helper.sig);
!                               }
!                               else
                                {
!                                       return false;
                                }
                        }
--- 295,309 ----
        public override bool Equals(Object obj)
                        {
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       SignatureHelper helper = (obj as 
SignatureHelper);
!                                       if(helper != null && helper.mod == mod)
!                                       {
!                                               return ClrSigIdentical(sig, 
helper.sig);
!                                       }
!                                       else
!                                       {
!                                               return false;
!                                       }
                                }
                        }
***************
*** 282,286 ****
        public override int GetHashCode()
                        {
!                               return ClrSigGetHashCode(sig);
                        }
  
--- 312,319 ----
        public override int GetHashCode()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return ClrSigGetHashCode(sig);
!                               }
                        }
  
***************
*** 288,292 ****
        public byte[] GetSignature()
                        {
!                               return ClrSigGetBytes(mod.privateData, sig);
                        }
  
--- 321,328 ----
        public byte[] GetSignature()
                        {
!                               lock(typeof(AssemblyBuilder))
!                               {
!                                       return ClrSigGetBytes(mod.privateData, 
sig);
!                               }
                        }
  
***************
*** 314,317 ****
--- 350,360 ----
                                builder.Append(Environment.NewLine);
                                return builder.ToString();
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               context = IntPtr.Zero;
+                               sig = IntPtr.Zero;
                        }
  

Index: TypeBuilder.cs
===================================================================
RCS file: 
/cvsroot/dotgnu-pnet/pnetlib/runtime/System/Reflection/Emit/TypeBuilder.cs,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** TypeBuilder.cs      22 Mar 2003 05:12:30 -0000      1.6
--- TypeBuilder.cs      22 Mar 2003 05:55:13 -0000      1.7
***************
*** 34,38 ****
  using System.Security.Permissions;
  
! public sealed class TypeBuilder : Type, IClrProgramItem
  {
        // Internal state.
--- 34,38 ----
  using System.Security.Permissions;
  
! public sealed class TypeBuilder : Type, IClrProgramItem, IDetachItem
  {
        // Internal state.
***************
*** 90,106 ****
                                this.needsDefaultConstructor = true;
  
                                // Create the type.
!                               privateData = ClrTypeCreate
!                                       (((IClrProgramItem)module).ClrHandle, 
name,
!                                        (nspace == String.Empty ? null : 
nspace), attr,
!                                        (parent == null ? new 
System.Reflection.Emit.TypeToken(0)
!                                                                        : 
module.GetTypeToken(parent)));
!                               if(packingSize != PackingSize.Unspecified)
!                               {
!                                       ClrTypeSetPackingSize(privateData, 
(int)packingSize);
!                               }
!                               if(typeSize != UnspecifiedTypeSize)
                                {
!                                       ClrTypeSetClassSize(privateData, 
typeSize);
                                }
  
--- 90,113 ----
                                this.needsDefaultConstructor = true;
  
+                               // Register this item to be detached later.
+                               module.assembly.AddDetach(this);
+ 
                                // Create the type.
!                               lock(typeof(AssemblyBuilder))
                                {
!                                       privateData = ClrTypeCreate
!                                               
(((IClrProgramItem)module).ClrHandle, name,
!                                               (nspace == String.Empty ? null 
: nspace), attr,
!                                               (parent == null
!                                                       ? new 
System.Reflection.Emit.TypeToken(0)
!                                                       : 
module.GetTypeToken(parent)));
!                                       if(packingSize != 
PackingSize.Unspecified)
!                                       {
!                                               
ClrTypeSetPackingSize(privateData, (int)packingSize);
!                                       }
!                                       if(typeSize != UnspecifiedTypeSize)
!                                       {
!                                               
ClrTypeSetClassSize(privateData, typeSize);
!                                       }
                                }
  
***************
*** 219,223 ****
                                get
                                {
!                                       return 
(PackingSize)(ClrTypeGetPackingSize(privateData));
                                }
                        }
--- 226,234 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return (PackingSize)
!                                                       
(ClrTypeGetPackingSize(privateData));
!                                       }
                                }
                        }
***************
*** 237,241 ****
                                get
                                {
!                                       return ClrTypeGetClassSize(privateData);
                                }
                        }
--- 248,255 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return 
ClrTypeGetClassSize(privateData);
!                                       }
                                }
                        }
***************
*** 255,260 ****
                                get
                                {
!                                       return new 
System.Reflection.Emit.TypeToken
!                                               
(AssemblyBuilder.ClrGetItemToken(privateData));
                                }
                        }
--- 269,277 ----
                                get
                                {
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               return new 
System.Reflection.Emit.TypeToken
!                                                       
(AssemblyBuilder.ClrGetItemToken(privateData));
!                                       }
                                }
                        }
***************
*** 398,402 ****
  
                                        // Call the runtime engine to add the 
interface.
!                                       ClrTypeAddInterface(privateData, token);
                                }
                                finally
--- 415,422 ----
  
                                        // Call the runtime engine to add the 
interface.
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               
ClrTypeAddInterface(privateData, token);
!                                       }
                                }
                                finally
***************
*** 453,460 ****
  
                                        // Wrap "privateData" in a "ClrType" 
object and return it.
!                                       ClrType clrType = new ClrType();
!                                       clrType.privateData = privateData;
!                                       type = clrType;
!                                       return type;
                                }
                                finally
--- 473,488 ----
  
                                        // Wrap "privateData" in a "ClrType" 
object and return it.
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               if(privateData == IntPtr.Zero)
!                                               {
!                                                       throw new 
InvalidOperationException
!                                                               
(_("Emit_TypeInvalid"));
!                                               }
!                                               ClrType clrType = new ClrType();
!                                               clrType.privateData = 
privateData;
!                                               type = clrType;
!                                               return type;
!                                       }
                                }
                                finally
***************
*** 1088,1092 ****
                                {
                                        StartSync();
!                                       ClrTypeSetParent(privateData, 
module.GetTypeToken(parent));
                                        this.parent = parent;
                                }
--- 1116,1124 ----
                                {
                                        StartSync();
!                                       lock(typeof(AssemblyBuilder))
!                                       {
!                                               ClrTypeSetParent
!                                                       (privateData, 
module.GetTypeToken(parent));
!                                       }
                                        this.parent = parent;
                                }
***************
*** 1123,1126 ****
--- 1155,1164 ----
                        {
                                methods.Add(method);
+                       }
+ 
+       // Detach this item.
+       void IDetachItem.Detach()
+                       {
+                               privateData = IntPtr.Zero;
                        }
  





reply via email to

[Prev in Thread] Current Thread [Next in Thread]