[svn] r7764: nemerle/trunk/ncc/generation/ILEmitter.n
nemerle/trunk/ncc/generation/Typer3.n nemerle/trunk/...
IT
svnadmin at nemerle.org
Wed Aug 15 04:18:25 CEST 2007
Log:
Working on debugging again.
Author: IT
Date: Wed Aug 15 04:18:16 2007
New Revision: 7764
Modified:
nemerle/trunk/ncc/generation/ILEmitter.n
nemerle/trunk/ncc/generation/Typer3.n
nemerle/trunk/ncc/generation/Typer4.n
nemerle/trunk/ncc/misc/ExprWalker.n
nemerle/trunk/ncc/parsing/MainParser.n
nemerle/trunk/ncc/typing/TypedTree.n
nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
nemerle/trunk/ncc/typing/Typer-PatternTyper.n
nemerle/trunk/ncc/typing/Typer.n
nemerle/trunk/ncc/typing/Typer2.n
vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/ExprFinder.n
vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n
Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n (original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n Wed Aug 15 04:18:16 2007
@@ -402,7 +402,8 @@
| TExpr.Goto
| TExpr.Literal (Literal.Void)
| TExpr.Label (_, Literal (Void))
- | TExpr.DebugInfo (Literal (Void), null) => ()
+ | TExpr.DebugInfo (Literal (Void), null)
+ | TExpr.DebugInfo (null, _) => ()
| _ =>
Message.Warning (expr.Location,
"this expression has been skipped in code "
@@ -599,7 +600,7 @@
emit (val);
need_reference (val.SystemType);
_ilg.Emit (OpCodes.Isinst, ty.SystemType);
- _ilg.Emit (OpCodes.Brfalse, else_label);
+ emit_br (OpCodes.Brfalse, OpCodes.Brtrue);
| If (new_cond, new_then, new_else, _, _) =>
def my_label_else = _ilg.DefineLabel ();
@@ -1492,7 +1493,7 @@
| _ => emit_debug (l.Line, l.Column, l.EndLine, l.EndColumn);
}
- when (di.expr != null)
+ unless (di.expr == null)
emit (di.expr);
match (di.pexpr)
@@ -2166,6 +2167,10 @@
public MarkLabel (loc : Label ) : void
{
+ _throw = false;
+
+ _ilg.MarkLabel(loc);
+
when (_marked)
{
_marked = false;
@@ -2175,10 +2180,6 @@
_ilg.MarkSequencePoint (_document, 0xFeeFee, 0, 0xFeeFee, 0);
_ilg.Emit (OpCodes.Nop);
}
-
- _throw = false;
-
- _ilg.MarkLabel(loc);
}
private mutable _throw : bool;
Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n (original)
+++ nemerle/trunk/ncc/generation/Typer3.n Wed Aug 15 04:18:16 2007
@@ -1033,7 +1033,7 @@
| TExpr.MacroEnvelope (_, _, e)
| TExpr.TypeConversion (e, _, _, _)
| TExpr.Label (_, e)
- | TExpr.DebugInfo (e, _)
+ | TExpr.DebugInfo (e, _) when e != null
=> SimpleFlow (e)
| TExpr.Call (e, p, _)
@@ -1086,6 +1086,7 @@
| TExpr.TypeOf
| TExpr.OpCode
| TExpr.Goto
+ | TExpr.DebugInfo
=> default;
//invalid things
@@ -1308,6 +1309,8 @@
)
)
+ | TExpr.DebugInfo (null, _) => e
+
| TExpr.DebugInfo (e, pe) =>
def e = inject(e);
TExpr.DebugInfo (o.Location, e.ty, e, pe);
Modified: nemerle/trunk/ncc/generation/Typer4.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer4.n (original)
+++ nemerle/trunk/ncc/generation/Typer4.n Wed Aug 15 04:18:16 2007
@@ -264,6 +264,9 @@
$ "non local goto (block return?) detected (l$id)");
true
+ | Sequence (e1, DebugInfo (null, _)) =>
+ Throws (e1, allow_try, is_top)
+
| Sequence (e1, e2)
| DefValIn (_, e1, e2) =>
if (Throws (e1, allow_try)) {
Modified: nemerle/trunk/ncc/misc/ExprWalker.n
==============================================================================
--- nemerle/trunk/ncc/misc/ExprWalker.n (original)
+++ nemerle/trunk/ncc/misc/ExprWalker.n Wed Aug 15 04:18:16 2007
@@ -568,7 +568,7 @@
| PropertyMember(e, _) // { obj : TExpr; prop : IProperty; }
| FieldMember (e, _) // { obj : TExpr; fld : IField; }
| EventMember (e, _) // { obj : TExpr; ev : IEvent; }
- | DebugInfo (e, _) // { expr : TExpr; pe : PExpr; }
+ | DebugInfo (e, _) when e != null // { expr : TExpr; pe : PExpr; }
| TypeConversion(e, _, _, _) // { mutable expr : TExpr; target_type : TyVar; kind : ConversionKind; target_type_location : Location; }
| MacroEnvelope (_, _, e) // { original : Parsetree.PExpr; the_macro : IMacro; expanded : TExpr; }
| MethodRef (e, _, _, _) => Go(e); // { obj : TExpr; meth : IMethod; type_parms : list [TyVar]; notvirtual : bool; }
@@ -621,6 +621,7 @@
| Goto // { target : int; mutable try_block : int; }
| DefaultValue
| Error
+ | DebugInfo
| This => ()
}
Modified: nemerle/trunk/ncc/parsing/MainParser.n
==============================================================================
--- nemerle/trunk/ncc/parsing/MainParser.n (original)
+++ nemerle/trunk/ncc/parsing/MainParser.n Wed Aug 15 04:18:16 2007
@@ -2307,9 +2307,7 @@
[], mktry);
when (cases is [])
Error (x, "catch body must have at least one handler");
- def l = loc.Combine(body.Location);
- def l = cases.FoldLeft(l, (e, l) => l.Combine(e.Location));
- body = PExpr.Try (l, body, cases.Rev ());
+ body = PExpr.Try (loc + x.Location, body, cases.Rev ());
| x => Error (x, "expecting handlers of exceptions")
}
Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n (original)
+++ nemerle/trunk/ncc/typing/TypedTree.n Wed Aug 15 04:18:16 2007
@@ -823,7 +823,7 @@
get {
match (this)
{
- | DebugInfo (e, _) => ty = e.Type
+ | DebugInfo (e, _) when e != null => ty = e.Type
| _ =>
when (ty == null) {
def InternalType = ManagerClass.Instance.InternalType;
@@ -864,7 +864,7 @@
{
match (this)
{
- | DebugInfo (e, _) => e.ty = value;
+ | DebugInfo (e, _) when e != null => e.ty = value;
| _ => ()
}
@@ -1165,6 +1165,9 @@
TypeConversion (expr, t, kind, tl)
+ | DebugInfo (null, _) => null
+
+
| DebugInfo (e, pe) =>
def e' = walk (f, e);
if (e' : object == e)
Modified: nemerle/trunk/ncc/typing/Typer-DelayedTyping.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-DelayedTyping.n (original)
+++ nemerle/trunk/ncc/typing/Typer-DelayedTyping.n Wed Aug 15 04:18:16 2007
@@ -99,8 +99,9 @@
public mutable filtering_expression : TExpr.Call;
public mutable need_ref : bool;
public mutable need_write : bool;
+ public mutable pexpr : object;
- public this () {}
+ public this (pexpr : object) { this.pexpr = pexpr}
}
@@ -141,15 +142,15 @@
match (meth.BuiltinKind) {
| BuiltinMethodKind.OpCode (ch, unch) =>
def opcode = if (local_context.IsChecked) ch else unch;
- Kind.Resolved (TExpr.OpCode (expr.Location, expr.ty, opcode))
+ Kind.Resolved (k.pexpr, TExpr.OpCode (expr.Location, expr.ty, opcode))
| _ => k
}
| Kind.Overloaded (lst) =>
when (expected.Hint.IsNone && List.ForAll (lst, x => x.Type is MType.Fun))
_ = expected.Unify (MType.Fun (typer.FreshTyVar (), typer.FreshTyVar ()));
- Kind.Overloaded (OverloadPossibility.Unique (lst))
+ Kind.Overloaded (k.pexpr, OverloadPossibility.Unique (lst))
| Kind.OverloadedOperator (lst, t1, t2, n, e, s) =>
- Kind.OverloadedOperator (OverloadPossibility.Unique (lst), t1, t2, n, e, s)
+ Kind.OverloadedOperator (k.pexpr, OverloadPossibility.Unique (lst), t1, t2, n, e, s)
| _ => k
}
@@ -259,7 +260,7 @@
})) {
| [] => false
| newlst =>
- SetKind (Kind.Overloaded (newlst));
+ SetKind (Kind.Overloaded (kind.pexpr, newlst));
true
}
@@ -296,7 +297,7 @@
});
if (newlst is []) {}
- else SetKind (Kind.OverloadedOperator (newlst, t1, t2, n, e, s));
+ else SetKind (Kind.OverloadedOperator (DtKind.pexpr, newlst, t1, t2, n, e, s));
}
| Kind.Overloaded (lst) =>
@@ -310,7 +311,7 @@
});
if (newlst is []) {}
- else SetKind (Kind.Overloaded (newlst));
+ else SetKind (Kind.Overloaded (DtKind.pexpr, newlst));
}
| _ => {}
@@ -661,10 +662,10 @@
ReportError (messenger,
$ "there is no member named `$(name)' "
"in $(TypeOf (e)) with type $expected");
- SetKind (Kind.Error ())
+ SetKind (Kind.Error (DtKind.pexpr))
| Some (lst) =>
- SetKind (Kind.Overloaded (lst));
+ SetKind (Kind.Overloaded (DtKind.pexpr, lst));
when (DtKind.need_write && !ExpectLValue (false))
ReportError (messenger, $"needed writable value, got $lst");
@@ -690,13 +691,13 @@
when (o'.Length != overloads.Length || o'.Length == 1)
match (o') {
| [] =>
- SetKind (Kind.Error ())
+ SetKind (Kind.Error (DtKind.pexpr))
| [one] =>
- SetKind (Kind.Resolved (one.Compile ()))
+ SetKind (Kind.Resolved (DtKind.pexpr, one.Compile ()))
| lst =>
- SetKind (Kind.Overloaded (lst))
+ SetKind (Kind.Overloaded (DtKind.pexpr, lst))
}
| Kind.OverloadedOperator (overloads, t1, t2, name, env, seen) =>
def not_seen (l) {
@@ -714,7 +715,7 @@
false
else
{
- SetKind (Kind.OverloadedOperator (lst, t1, t2, name, env, seen));
+ SetKind (Kind.OverloadedOperator (DtKind.pexpr, lst, t1, t2, name, env, seen));
Resolve ();
true
}
@@ -748,10 +749,10 @@
|| typer.BadnessAllowed > 1 =>
when (expr != null) //ResolveOverload maybe wasn't called, but it should be to set stuff in expr
_ = ResolveOverload (overloads, expr.parms, expr.Type);
- SetKind (Kind.Resolved (one.Compile ()))
+ SetKind (Kind.Resolved (DtKind.pexpr, one.Compile ()))
| lst =>
- SetKind (Kind.OverloadedOperator (lst, t1, t2, name, env, seen));
+ SetKind (Kind.OverloadedOperator (DtKind.pexpr, lst, t1, t2, name, env, seen));
}
}
@@ -769,21 +770,21 @@
res = OverloadPossibility.Unique (res);
res
}
- SetKind (Kind.OverloadedOperator (operators, t1, t2, name, env, operators));
+ SetKind (Kind.OverloadedOperator (DtKind.pexpr, operators, t1, t2, name, env, operators));
Resolve ()
| Kind.Resolved (expr) =>
unless (typer.Expect (expected, expr.Type, "already resolved overload"))
- SetKind (Kind.Error ())
+ SetKind (Kind.Error (DtKind.pexpr))
| Kind.Macro (action) =>
Util.locate (Location,
match (action.Resolve (false)) {
| Some (expr) =>
if (typer.Expect (expected, expr.Type, $ "result of $action execution"))
- SetKind (Kind.Resolved (expr))
+ SetKind (Kind.Resolved (DtKind.pexpr, expr))
else
- SetKind (Kind.Error ())
+ SetKind (Kind.Error (DtKind.pexpr))
| None => {}
})
Modified: nemerle/trunk/ncc/typing/Typer-PatternTyper.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer-PatternTyper.n (original)
+++ nemerle/trunk/ncc/typing/Typer-PatternTyper.n Wed Aug 15 04:18:16 2007
@@ -393,7 +393,7 @@
match (pattern) {
| PT.PExpr.Wildcard =>
TypePattern (matched_value_type,
- PT.PExpr.As (PT.PExpr.Wildcard (), PT.Splicable.Name (name)))
+ PT.PExpr.As (nameloc, PT.PExpr.Wildcard (), PT.Splicable.Name (nameloc, name)))
| _ =>
ReportError (messenger, $ "`$(name)' cannot be variant option, "
"since it starts with lowercase letter");
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Wed Aug 15 04:18:16 2007
@@ -591,7 +591,7 @@
internal DelayAction (expected : TyVar, action : DelayedAction) : TExpr
{
- def kind = DelayedTyping.Kind.Macro (action);
+ def kind = DelayedTyping.Kind.Macro (null, action);
def dt = DelayedTyping (this, kind, expected);
dt.Resolve ();
TExpr.Delayed (expected, dt)
@@ -616,7 +616,7 @@
(expr, o.Member)
| lst =>
- (Delay (DelayedTyping.Kind.Overloaded (lst), expected), null)
+ (Delay (DelayedTyping.Kind.Overloaded (null, lst), expected), null)
}
}
@@ -1382,7 +1382,7 @@
def decl = DefineLocal (exn, BindType (y.exn_ty),
LocalValue.Kind.ExceptionValue (), false);
PushLocals ();
- def handler =
+ mutable handler =
try {
AddLocal (exn, decl);
TypeExpr (y.handler);
@@ -1390,6 +1390,21 @@
PopLocals ();
}
+ when (Manager.Options.EmitDebug) {
+ // This code adds break point at the end of the catch expr.
+ when (!x.Location.IsGeneratedOrEmpty) {
+ def l = x.Location;
+ def dl = Location (l.FileIndex, l.EndLine, l.EndColumn - 1, l.EndLine, l.EndColumn);
+ def di = TExpr.DebugInfo (dl, handler.Type, null, null);
+
+ handler = TExpr.Sequence (l, handler.Type, handler, di);
+ }
+
+ // This code adds break point at the case.
+ when (!y.exn.Location.IsGeneratedOrEmpty)
+ handler = TExpr.DebugInfo (y.exn.Location, handler.Type, handler, null);
+ }
+
_ = ExpectSubtyping (expected, handler.Type, "catch body");
type_trycases (cases,
Try_case.Catch (decl, ImplicitCast (handler, expected)) :: acc)
@@ -1489,7 +1504,7 @@
}
- | PT.PExpr.Member (obj, PT.Splicable.Name as name) =>
+ | PT.PExpr.Member (obj, PT.Splicable.Name as name) as mem =>
def mem_name = name.body.Id;
if (CanBeTypeName (obj))
match (TryTyping (fun () { TypeName (expression, expected) })) {
@@ -1509,20 +1524,20 @@
TypeName (expression, expected)
else
if (messenger.InErrorMode) {
- def e = TryTyping (fun () { TypeMemberExpr (obj, name, expected) });
+ def e = TryTyping (fun () { TypeMemberExpr (mem, obj, name, expected) });
if (IsError (e))
TypeName (expression, expected)
else
- TypeMemberExpr (obj, name, expected)
+ TypeMemberExpr (mem, obj, name, expected)
} else
- TypeMemberExpr (obj, name, expected)
+ TypeMemberExpr (mem, obj, name, expected)
} else
- TypeMemberExpr (obj, name, expected)
+ TypeMemberExpr (mem, obj, name, expected)
| e => e
}
else
- TypeMemberExpr (TypeExpr (obj), name, expected)
+ TypeMemberExpr (mem, TypeExpr (obj), name, expected)
| PT.PExpr.Member (_, null) =>
ReportError (messenger, "expected member");
@@ -1558,14 +1573,14 @@
e.SkipWriteCheck = true;
e
- | PT.PExpr.Call (fnc, parms) =>
+ | PT.PExpr.Call (fnc, parms) as call =>
if (parms.Exists (fun (_) {
| <[ _ ]> => true
| _ => false
}) || fnc is <[ _ . $_ ]>)
TypeExpr (PartialApplication (expression), expected)
else
- TypeCall (fnc, parms, expected, is_property = false);
+ TypeCall (call, fnc, parms, expected, is_property = false);
| PT.PExpr.Assign (PT.PExpr.Tuple (vars), e2) =>
@@ -2205,7 +2220,8 @@
#region Indexers
TypeIndexer (obj : PT.PExpr, args : list [PT.PExpr], expected : TyVar) : TExpr
{
- def obj = TypeExpr (obj);
+ def pexpr = obj;
+ def obj = TypeExpr (pexpr);
DelayAction (expected,
DelayedLambdaAction (desc = "", fn = fun (fail_loudly) {
@@ -2213,7 +2229,7 @@
| TExpr.PropertyMember (_, prop) when prop.IsIndexer
| TExpr.StaticPropertyRef (_, prop) when prop.IsIndexer
| TExpr.Delayed (DelayedTyping where (DtKind = Overloaded)) =>
- Some (TypeCall (<[ $(obj : typed) ]>, args, expected, is_property = true))
+ Some (TypeCall (pexpr, <[ $(obj : typed) ]>, args, expected, is_property = true))
| _ =>
match (obj.Type.Hint) {
@@ -2575,7 +2591,7 @@
}
- TypeMemberExpr (obj : TExpr, name : PT.Splicable.Name, expected : TyVar) : TExpr
+ TypeMemberExpr (pexpr : PT.PExpr, obj : TExpr, name : PT.Splicable.Name, expected : TyVar) : TExpr
{
def mem_name = name.body;
@@ -2596,7 +2612,7 @@
name.typed_object = mem;
expr;
| None =>
- Delay (DelayedTyping.Kind.MemberAccess (obj, mem_name), expected)
+ Delay (DelayedTyping.Kind.MemberAccess (pexpr, obj, mem_name), expected)
}
}
@@ -2947,7 +2963,7 @@
| TExpr.Delayed (susp) =>
susp.ApplyGenericSpecifier (gen_parms);
- | TExpr.DebugInfo (e, _) =>
+ | TExpr.DebugInfo (e, _) when e != null =>
ApplyGenericSpecifier (e, gen_parms);
| _ =>
@@ -3068,7 +3084,8 @@
}
- TypeCall (pfnc : PT.PExpr,
+ TypeCall (pexpr : PT.PExpr,
+ pfnc : PT.PExpr,
parms : list [PT.PExpr],
expected : TyVar,
is_property : bool) : TExpr
@@ -3114,7 +3131,8 @@
else name.Id;
def kind =
- DelayedTyping.Kind.Operator (TypeOf (parm1.expr),
+ DelayedTyping.Kind.Operator (pexpr,
+ TypeOf (parm1.expr),
TypeOf (parm2.expr),
operator_name,
name.GetEnv (env));
@@ -3140,7 +3158,7 @@
else name.Id;
def kind =
- DelayedTyping.Kind.Operator (TypeOf (parm1.expr), null,
+ DelayedTyping.Kind.Operator (pexpr, TypeOf (parm1.expr), null,
operator_name,
name.GetEnv (env));
when (parm1.kind != ParmKind.Normal)
@@ -3183,7 +3201,7 @@
| (PT.PExpr.Ref (PT.Name where (Id = "_N_op_Decrement") as name), [parm1]) =>
def operator_name = name.Id.Substring (3);
def kind =
- DelayedTyping.Kind.Operator (TypeOf (parm1.expr), null,
+ DelayedTyping.Kind.Operator (pexpr, TypeOf (parm1.expr), null,
operator_name,
name.GetEnv (env));
when (parm1.kind != ParmKind.Normal)
Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n (original)
+++ nemerle/trunk/ncc/typing/Typer2.n Wed Aug 15 04:18:16 2007
@@ -1320,6 +1320,9 @@
BuildConversion (Walk (expr), t, kind)
+ | TExpr.Sequence (e1, DebugInfo (null, _) as e2) =>
+ TExpr.Sequence (Walk (ctx, e1), e2);
+
| TExpr.Sequence (e1, e2) =>
def e1 = IgnoreExpr (Walk (ctx & Context.AllowGotoAndAllThrows, e1));
TExpr.Sequence (e1, Walk (ctx & ~Context.IsCalledValue, e2))
@@ -1351,6 +1354,8 @@
| TExpr.Error => null
+ | TExpr.DebugInfo (null, _) => null
+
| TExpr.DebugInfo (e, pe) =>
def e = Walk (ctx, e);
TExpr.DebugInfo (expr.Location, e.ty, e, pe);
Modified: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/ExprFinder.n
==============================================================================
--- vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/ExprFinder.n (original)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/CodeModel/ExprFinder.n Wed Aug 15 04:18:16 2007
@@ -66,8 +66,7 @@
| TExpr.Delayed(susp) when !susp.IsResolved =>
susp.Resolve();
if (susp.IsResolved) susp.ResolutionResult else null
- | _ is TExpr => obj;
- | _ => null;
+ | _ => obj;
}
PFinder(info : ExprWalkInfo) : void
@@ -273,7 +272,8 @@
Trace.WriteLine($"$_texprObject");
Trace.WriteLine("");
- ExprWalker().Walk(_tRoot, (info : ExprWalkInfo) =>
+ _walkedNodes = [];
+ ExprWalker(this).Walk(_tRoot, (info : ExprWalkInfo) =>
{
match (info.Node)
{
Modified: vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n
==============================================================================
--- vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n (original)
+++ vs-plugin/trunk/Nemerle.Compiler.Utils/Nemerle.Completion2/Tests/Tests.n Wed Aug 15 04:18:16 2007
@@ -38,6 +38,7 @@
Assert.AreEqual(len, result.ColEnd - result.ColStart);
}
+ test("008", 3, "arr");
test("038", 6, "StrExt");
test("037", 3, "Int32");
test("036", 7, "foreach");
@@ -68,7 +69,6 @@
test("011", 2, "ch");
test("010", 3, "iii");
test("009", 3, "Int32");
- test("008", 3, "arr");
test("007", 0, "_iii");
test("006", 9, "WriteLine");
test("005", 0, "bar");
More information about the svn
mailing list