[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