[svn] r6439: nemerle/trunk/ncc: external/LibrariesLoader.n generation/ILEmitter.n generation/Typer4.n hier...

nazgul svnadmin at nemerle.org
Sun Jul 9 02:10:29 CEST 2006


Log:
Changes needed to make initonly flag not cause verification errors

Author: nazgul
Date: Sun Jul  9 02:10:25 2006
New Revision: 6439

Modified:
   nemerle/trunk/ncc/external/LibrariesLoader.n
   nemerle/trunk/ncc/generation/ILEmitter.n
   nemerle/trunk/ncc/generation/Typer4.n
   nemerle/trunk/ncc/hierarchy/ClassMembers.n
   nemerle/trunk/ncc/hierarchy/TypeBuilder.n
   nemerle/trunk/ncc/hierarchy/TypeInfo.n
   nemerle/trunk/ncc/parsing/Lexer.n
   nemerle/trunk/ncc/typing/TypedTree.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/external/LibrariesLoader.n
==============================================================================
--- nemerle/trunk/ncc/external/LibrariesLoader.n	(original)
+++ nemerle/trunk/ncc/external/LibrariesLoader.n	Sun Jul  9 02:10:25 2006
@@ -681,7 +681,7 @@
 
       public this (lib : LibraryReference, h : System.Type, ns_node : NamespaceTree.Node)
       {
-        base (ns_node, lib.Manager);
+        base (ns_node, lib.Manager, Util.StripGenericMark (h.FullName.Replace ('+', '.')));
         
         // first cache ourself to avoid loops
         LibraryReferenceManager.CacheTypeInfo (h, this, ns_node);
@@ -703,8 +703,6 @@
         foreach (t in supertypes)
           supertype_map = supertype_map.Add (t.tycon, t);
 
-        fullname = Util.StripGenericMark (system_type.FullName.Replace ('+', '.'));
-          
         def parms = List.Map (typarms, fun (x) { MType.TyVarRef (x) });
         self_type = MType.Class (this, parms);
         

Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n	Sun Jul  9 02:10:25 2006
@@ -1244,8 +1244,8 @@
 
         | TupleIndexer (obj, pos, len) =>
           def tt = InternalType.GetTupleType (len);
-          when (tt.TyCon.IsValueType && !obj.NeedAddress)
-            obj.NeedAddress = true;
+          //when (tt.TyCon.IsValueType && !obj.NeedAddress)
+          //  obj.NeedAddress = true;
           emit (obj);
           _ilg.Emit (OpCodes.Ldfld, GetFieldInfo (obj.SystemType, tt.GetField (pos + 1)));
 

Modified: nemerle/trunk/ncc/generation/Typer4.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer4.n	(original)
+++ nemerle/trunk/ncc/generation/Typer4.n	Sun Jul  9 02:10:25 2006
@@ -50,7 +50,7 @@
     current_type : TypeBuilder;
     messenger : Messenger;
     the_method : MethodBuilder;
-
+    is_instance_ctor : bool;
 
     #region Entry points
     public this (meth : MethodBuilder)
@@ -60,6 +60,7 @@
       the_method = meth;
       messenger = Manager.Solver.CurrentMessenger;
       current_type = meth.DeclaringType;
+      is_instance_ctor = the_method.GetFunKind () is FunKind.Constructor;
     }
 
 
@@ -474,8 +475,9 @@
             def obj = Walk (obj);
               
             // use address here for better performance
-            when (! obj.NeedAddress && fld.DeclaringType.IsValueType)
-              obj.NeedAddress = true;
+            when (! obj.NeedAddress && fld.DeclaringType.IsValueType && fld.IsMutable) {
+              obj.setNeedAddress (is_instance_ctor);
+            }
               
             TExpr.FieldMember (obj, fld)
 
@@ -493,7 +495,7 @@
                   // (like when the field had to be closurised inside the constructor)
                   unless (fld.IsMutable ||
                           fld.Attributes %&& NemerleAttributes.CompilerMutable ||
-                          obj is TExpr.This && the_method.GetFunKind () is FunKind.Constructor)
+                          obj is TExpr.This && is_instance_ctor)
                     Message.Error ("assignment to immutable field is allowed only inside code,"
                                    " which is executed inside constructor, but this field access"
                                    " is done through closure");
@@ -508,8 +510,7 @@
               Message.Error ("this expression is not a proper lvalue: "
                              "cannot load value type address");
             else
-              e1.NeedAddress = true;
-
+              e1.setNeedAddress (is_instance_ctor);
           
             if (NeedBoxing (real_type, e2))
               TExpr.Assign (InternalType.Void, e1, Box (real_type, e2))
@@ -520,7 +521,7 @@
             def e1 = Walk (e1);
             def e2 = Walk (e2);
             if (decl.IsCache && decl.Type.Fix ().IsValueType) {
-              e1.NeedAddress = true;
+              e1.setNeedAddress (is_instance_ctor);
               decl.IsManagedPtr = true;
               TExpr.DefValIn (decl, e1, e2)
             } else if (NeedBoxing (decl.Type.Fix (), e1))
@@ -552,14 +553,14 @@
                 | MethodRef (obj, meth, type_parms, nonvirt) =>
                   if (obj.MType is MType.TyVarRef) {
                     obj.NeedsConstrained = true;
-                    obj.NeedAddress = true;
+                    obj.setNeedAddress (is_instance_ctor);
                   }
                   else
                   // we would kinda like address here
                   when (obj.Type.Fix ().IsValueType) {
                     def methty = meth.DeclaringType;
                     if (methty.IsValueType)
-                      obj.NeedAddress = true;
+                      obj.setNeedAddress (is_instance_ctor);
                     else {
                       // but maybe we should employ boxing
                       def obj = Box (methty.GetMemType (), obj);
@@ -605,7 +606,7 @@
                             parm.expr = Box (t, parm.expr);
                       } else {
                         if (parm.expr.IsAddressable)
-                          parm.expr.NeedAddress = true;
+                          parm.expr.setNeedAddress (is_instance_ctor);
                         else
                           Message.Error ($ "non-addressable expression passed "
                                            "as a ref/out parameter");

Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n	(original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n	Sun Jul  9 02:10:25 2006
@@ -41,8 +41,6 @@
 {
   protected loc : Location;
   [Accessor]
-  protected body_location : Location;
-  [Accessor]
   protected mutable name : string;
   protected accessibility : Accessibility;
   [Accessor]
@@ -50,7 +48,7 @@
   [Accessor]
   protected declaring_type : TypeBuilder;
   id : int;
-  protected kind : MemberKind;
+  protected mutable kind : MemberKind;
   internal mutable ty : MType;
   protected mutable handle : MemberInfo;
 
@@ -108,6 +106,11 @@
       name == "value__"
   }
 
+  public virtual BodyLocation : Location
+  {
+    get { loc } 
+  }
+  
   // does current member can be accessed from inside given type
   public CanAccess (source : TypeInfo) : bool
   {
@@ -642,6 +645,9 @@
 
   internal mutable overridden_method : IMethod;
 
+  [Accessor (flags = Override)]
+  protected body_location : Location;
+  
   is_var_args : bool;
 
   public GetMethodBase () : MethodBase

Modified: nemerle/trunk/ncc/hierarchy/TypeBuilder.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeBuilder.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeBuilder.n	Sun Jul  9 02:10:25 2006
@@ -98,7 +98,7 @@
   internal this (manager : TypesManager, par : TypeBuilder, td : PT.TopDeclaration, 
                  ns_node : NamespaceTree.Node)
   {
-    base (ns_node, manager.Manager);
+    base (ns_node, manager.Manager, ns_node.Name.ToString ("."));
 
     this.TyManager = manager;
 
@@ -110,7 +110,6 @@
     when (this.GlobalEnv == null)
       Util.ice ($ "env is null for $(ns_node.Name)");
 
-    fullname = ns_node.Name.ToString (".");
     this.enclosing_type = par;
     when (par != null)
       par.contained_types = this :: par.contained_types;

Modified: nemerle/trunk/ncc/hierarchy/TypeInfo.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/TypeInfo.n	(original)
+++ nemerle/trunk/ncc/hierarchy/TypeInfo.n	Sun Jul  9 02:10:25 2006
@@ -157,11 +157,12 @@
   
   protected namespace_nd : NamespaceTree.Node;
   
-  public this (ns_node : NamespaceTree.Node, man : ManagerClass)
+  public this (ns_node : NamespaceTree.Node, man : ManagerClass, fullname : string)
   {
     id = Util.next_id ();
     namespace_nd = ns_node;
     Manager = man;
+    this.fullname = fullname;
   }
 
   public NamespaceNode : NamespaceTree.Node

Modified: nemerle/trunk/ncc/parsing/Lexer.n
==============================================================================
--- nemerle/trunk/ncc/parsing/Lexer.n	(original)
+++ nemerle/trunk/ncc/parsing/Lexer.n	Sun Jul  9 02:10:25 2006
@@ -333,7 +333,7 @@
   {
   }
 
-  protected this (man : ManagerClass)
+  protected this (man : ManagerClass, fn : string)
   {
     Manager = man;
     line = 1;
@@ -346,6 +346,7 @@
     eating_stack = Stack ();
     eating_now = 0;
     line_stack = -1;
+    file_real = fn;
   }
 
   abstract protected read_from_input () : char;
@@ -1419,10 +1420,9 @@
   
   public this (man : ManagerClass, fn : string)
   {
-    base (man);
+    base (man, fn);
     comment_store = StringBuilder (300);
     file_idx = Location.AddFile (fn);
-    file_real = fn;
     try {
       def file = IO.FileStream (fn, IO.FileMode.Open, IO.FileAccess.Read);
       reader = IO.StreamReader (file, Text.Encoding.UTF8);
@@ -1537,11 +1537,10 @@
 
   public this (man : ManagerClass, fn : string, loc : Location)
   {
-    base (man);
+    base (man, fn);
     reader = fn;
     pos = 0;
     file_idx = loc.FileIndex;
-    file_real = fn;
     line = loc.Line;
     col = loc.Column;
   }

Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n	(original)
+++ nemerle/trunk/ncc/typing/TypedTree.n	Sun Jul  9 02:10:25 2006
@@ -607,9 +607,9 @@
     internal NeedAddress : bool
     {
       get { flags %&& TExprFlags.NeedAddress }
+    }
 
-      set {
-        Util.cassert (value == true);
+    internal setNeedAddress (from_ctor : bool) : void {
         Util.cassert (! NeedAddress);
 
         match (this) {
@@ -619,15 +619,18 @@
           | This =>
             flags |= TExprFlags.NeedAddress
             
-          | FieldMember (obj, fld) =>
+        | FieldMember (This as obj, fld) with is_mutable = from_ctor || fld.IsMutable
+        | FieldMember (obj, fld) with is_mutable = fld.IsMutable =>
+          when (is_mutable) {
+          //Message.Debug ($"am being assigned $this");              
             flags |= TExprFlags.NeedAddress;
             when (fld.DeclaringType.IsValueType && !obj.NeedAddress)
-              obj.NeedAddress = true;
+              obj.setNeedAddress (from_ctor);
+          }
               
           | _ => {}
         }
       }
-    }
     #endregion
 
     public Type : TyVar

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Sun Jul  9 02:10:25 2006
@@ -609,7 +609,7 @@
             | _ => false
           }
         | TExpr.StaticPropertyRef (_, p) when !need_ref => p.IsMutable
-        | TExpr.FieldMember (TExpr.This, _) when is_instance_ctor => true
+        | TExpr.FieldMember (TExpr.This, fld) when is_instance_ctor && fld.DeclaringType.Equals (current_type) => true
         | TExpr.FieldMember (_, mem) =>
           if (mem.IsMutable)
             true



More information about the svn mailing list