[svn] r7262: nemerle/trunk/ncc: generation/HierarchyEmitter.n generation/ILEmitter.n parsing/ParseTree.n t...

nazgul svnadmin at nemerle.org
Fri Jan 12 20:39:51 CET 2007


Log:
Fix the location problem introduced by return value debugging changes

Author: nazgul
Date: Fri Jan 12 20:39:17 2007
New Revision: 7262

Modified:
   nemerle/trunk/ncc/generation/HierarchyEmitter.n
   nemerle/trunk/ncc/generation/ILEmitter.n
   nemerle/trunk/ncc/parsing/ParseTree.n
   nemerle/trunk/ncc/typing/Typer.n

Modified: nemerle/trunk/ncc/generation/HierarchyEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/HierarchyEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/HierarchyEmitter.n	Fri Jan 12 20:39:17 2007
@@ -749,16 +749,7 @@
                   
                   declaring_type.DoBeforeFinalization2 (fun () {
                     // Message.Debug ($"making il generator for $meth");
-                    def gen =
-                      match (GetMethodBase ()) {
-                        | mb is Emit.MethodBuilder =>
-                          ILEmitter (mb, declaring_type, fun_header);
-
-                        | cb is Emit.ConstructorBuilder =>
-                          ILEmitter (cb, declaring_type, fun_header);
-
-                        | _ => Util.ice ()
-                      }
+                    def gen = ILEmitter (this);
 
                     when (Manager.Options.EmitDebug) gen.SetDocument (Location);
                     gen.Run ();

Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n	(original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n	Fri Jan 12 20:39:17 2007
@@ -60,8 +60,7 @@
     private _type_of_this : System.Type;
 
     private _method_name : string;
-    private _method_is_static : bool;
-    private _fun_header : Typedtree.Fun_header;
+    private _method_builder : Nemerle.Compiler.MethodBuilder;
     private mutable _method_start_label : Label;
     private mutable _debug_doc : ISymbolDocumentWriter;        
 
@@ -74,41 +73,19 @@
     /**
      * Creates and executes a code generator for a method
      */
-    internal this (method_builder : Emit.MethodBuilder, type_ : Nemerle.Compiler.TypeBuilder, 
-                   fun_header : Typedtree.Fun_header)
+    internal this (method_builder : Nemerle.Compiler.MethodBuilder)
     {
-      Manager = type_.Manager;
-      _fun_header = fun_header;
-
-      _ilg = method_builder.GetILGenerator ();
-      _module_builder = method_builder.Module :> ModuleBuilder;
-      _parent_type_builder = type_;
-
-      _method_name = method_builder.DeclaringType.FullName + "::" + method_builder.Name;
-      _method_is_static = method_builder.IsStatic;
-      _this_is_value_type = type_.IsValueType;
-      _type_of_this = type_.GetMemType ().SystemType;
-    }
-
-
-    /**
-     * Creates and executes a code generator for a method
-     */
-    internal this (constructor_builder : Emit.ConstructorBuilder,
-                   type_ : Nemerle.Compiler.TypeBuilder, fun_header : Typedtree.Fun_header)
-    {
-      Manager = type_.Manager;
-      _fun_header = fun_header;
-
-      _ilg = constructor_builder.GetILGenerator ();
-      _module_builder = constructor_builder.Module :> ModuleBuilder;
-      _parent_type_builder = type_;
-
-      _method_name = constructor_builder.DeclaringType.FullName + "::"
-                      + constructor_builder.Name;
-      _method_is_static = constructor_builder.IsStatic;
-      _this_is_value_type = type_.IsValueType;
-      _type_of_this = type_.GetMemType ().SystemType;
+      Manager = method_builder.Manager;
+      _method_builder = method_builder;
+      def mbase = _method_builder.GetMethodBase ();
+
+      _ilg = Late.late_macro (mbase.GetILGenerator () :> ILGenerator);
+      _module_builder = mbase.Module :> ModuleBuilder;
+      _parent_type_builder = _method_builder.DeclaringType;
+
+      _method_name = mbase.DeclaringType.FullName + "::" + mbase.Name;
+      _this_is_value_type = _parent_type_builder.IsValueType;
+      _type_of_this = _parent_type_builder.GetMemType ().SystemType;;
     }
 
     public Run () : void
@@ -116,21 +93,21 @@
       _method_start_label = _ilg.DefineLabel ();
       _ilg.MarkLabel (_method_start_label);
 
-      match (_fun_header.body) {
+      match (_method_builder.GetHeader ().body) {
         | FunBody.Typed (body) =>
           when (IsDebugEnabled) {
-            Mark (beginLocation (body.Location));
+            Mark (beginLocation (_method_builder.BodyLocation));
             _ilg.Emit (OpCodes.Nop);   
           }
           emit (body);
           
           when (IsDebugEnabled) {
-            Mark (endLocation (body.Location));
+            Mark (endLocation (_method_builder.BodyLocation));
           }
           unless (body.Throws)
             _ilg.Emit (OpCodes.Ret);
           // let GC take it
-          _fun_header.body = FunBody.ILed ();
+          _method_builder.GetHeader ().body = FunBody.ILed ();
         | _ => Util.ice ($"method $_method_name is already ILed")
       }
       
@@ -144,11 +121,11 @@
 
     private static beginLocation (mutable loc : Location) : Location {
       loc = loc.FromStart ();
-      Location (loc.FileIndex, loc.Line, loc.Column, loc.EndLine, loc.EndColumn + 1)
+      Location (loc.FileIndex, loc.Line, loc.Column - 1, loc.EndLine, loc.EndColumn)
     }
     private static endLocation (mutable loc : Location) : Location {
       loc = loc.FromEnd ();
-      Location (loc.FileIndex, loc.Line, loc.Column - 1, loc.EndLine, loc.EndColumn)
+      Location (loc.FileIndex, loc.Line, loc.Column, loc.EndLine, loc.EndColumn + 1)
     }
     
     private is_always_true (expr : TExpr) : bool
@@ -1388,7 +1365,7 @@
 
         /* loads the 'this' pointer on the evaluation stack */
         | This =>
-          Util.cassert (!_method_is_static, "This is a static method");
+          Util.cassert (!_method_builder.IsStatic, "This is a static method");
           _ilg.Emit (OpCodes.Ldarg_0);
           
           // when we are in value type, this contains address of current

Modified: nemerle/trunk/ncc/parsing/ParseTree.n
==============================================================================
--- nemerle/trunk/ncc/parsing/ParseTree.n	(original)
+++ nemerle/trunk/ncc/parsing/ParseTree.n	Fri Jan 12 20:39:17 2007
@@ -409,7 +409,7 @@
     
     public this (name : Splicable, ty : PExpr, modifiers : Modifiers) 
     {
-      base (Location.Default, name, modifiers);
+      base (Location_stack.top (), name, modifiers);
       this.ty = ty;
     }
     public this (loc : Location, name : Splicable, ty : PExpr,
@@ -476,7 +476,7 @@
     public this (typarms : Typarms, name : Splicable, ret_type : PExpr,
                  parms : list [Fun_parm]) 
     {
-      this (Location.Default, typarms, name, ret_type, parms)
+      this (Location_stack.top (), typarms, name, ret_type, parms)
     }
 
     public this (loc : Location, typarms : Typarms, 

Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n	(original)
+++ nemerle/trunk/ncc/typing/Typer.n	Fri Jan 12 20:39:17 2007
@@ -1647,7 +1647,6 @@
           //Message.Debug ("push seq");
           PushLocals ();
           def res = loop ([], l);
-          res.loc = expression.Location;
           //Message.Debug ("pop seq");
           PopLocals ();
           res
@@ -1897,7 +1896,6 @@
                   if (acc == null) case.body = VoidLiteral ();
                   else case.body = acc;
                   x.ty = case.body.Type;
-                  x.loc = acc.Location;                  
                   x
 
                 | TExpr.Cache as c when c.body == null =>



More information about the svn mailing list