[svn] r6010: nemerle/trunk/ncc: generation/ILEmitter.n
generation/Typer3.n hierarchy/ClassMembers.n typing...
malekith
svnadmin at nemerle.org
Thu Dec 15 22:35:31 CET 2005
Log:
Clean some yield stuff up. Make it work more.
Author: malekith
Date: Thu Dec 15 22:35:29 2005
New Revision: 6010
Modified:
nemerle/trunk/ncc/generation/ILEmitter.n
nemerle/trunk/ncc/generation/Typer3.n
nemerle/trunk/ncc/hierarchy/ClassMembers.n
nemerle/trunk/ncc/typing/TypedTree.n
nemerle/trunk/ncc/typing/Typer.n
nemerle/trunk/ncc/typing/Typer2.n
Modified: nemerle/trunk/ncc/generation/ILEmitter.n
==============================================================================
--- nemerle/trunk/ncc/generation/ILEmitter.n (original)
+++ nemerle/trunk/ncc/generation/ILEmitter.n Thu Dec 15 22:35:29 2005
@@ -80,6 +80,7 @@
when (type_.TyparmsCount > 0)
match (type_.GetMembers ().Find (is_proper_method)) {
| Some (m) =>
+ //Message.Debug ($ "tot=$type_of_this m=$m");
_ = TypeBuilder.GetMethod (type_of_this,
m.GetHandle () :> Emit.MethodBuilder);
| None => {}
Modified: nemerle/trunk/ncc/generation/Typer3.n
==============================================================================
--- nemerle/trunk/ncc/generation/Typer3.n (original)
+++ nemerle/trunk/ncc/generation/Typer3.n Thu Dec 15 22:35:29 2005
@@ -428,14 +428,15 @@
/** Return code referencing closure of [hd]. */
ClosureRef (hd : Fun_header) : TExpr
{
- if (current_method.name == "_N_yielding_function") {
+ if (hd.usage == FunctionUsage.UsedJustOnce) {
+ ClosureRef (hd.decl.DefinedIn)
+ } else if (current_method.name == "_N_yielding_function") {
+ // Message.Debug ($ "lookup $(hd.name) from $(current_method.name)");
Util.cassert (hd.id == current_method.id ||
current_method.decl.DefinedIn.id == hd.id);
TExpr.This (local_function_type.GetMemType ())
} else if (hd.id == current_method.id) {
PlainRef (current_closure)
- } else if (hd.usage == FunctionUsage.UsedJustOnce) {
- ClosureRef (hd.decl.DefinedIn)
} else if (closure_fields == null) {
Util.cassert (closure_parms != null);
Util.cassert (closure_parms.Contains (hd.id), $ "no clo parm for $(hd.name)");
@@ -659,16 +660,14 @@
}
- PrepareEnumeratorObject () : Parsetree.ClassMember
+ static PrepareEnumeratorObject (yield_type : TyVar) : Parsetree.ClassMember
{
- def yield_type = Option.UnSome (the_method.yield_stuff) [0];
-
<[ decl:
class $(Macros.NewSymbol ("Enumerator") : name) :
System.Collections.IEnumerator,
- System.Collections.Generic.IEnumerator [$yield_type]
+ System.Collections.Generic.IEnumerator [$(yield_type : typed)]
{
- public Current : $yield_type
+ public Current : $(yield_type : typed)
{
get { this._N_current }
}
@@ -726,15 +725,17 @@
subst.Apply (t.DeepFix ())
}
+ def uses_yield = current_local_fun.yield_type != null;
+
def clo_decl =
- if (the_method.yield_stuff.IsNone)
+ if (!uses_yield)
<[ decl:
private sealed class $(Macros.NewSymbol ("closure") : name)
{
internal this () {}
}
]>
- else PrepareEnumeratorObject ();
+ else PrepareEnumeratorObject (fix_type (current_local_fun.yield_type));
def clo_type = CurrentType.DefineNestedType (clo_decl, do_fixup = false);
clo_type.forced_typarms = new_tp;
@@ -785,7 +786,7 @@
clo_type.HasBeenUsed = true;
clo_type.Compile ();
- when (the_method.yield_stuff.IsSome)
+ when (uses_yield)
SetEnumeratorBody (clo_type, subst);
[TExpr.DefValIn (InternalType.Void, closure_val, ctor_call, null)]
Modified: nemerle/trunk/ncc/hierarchy/ClassMembers.n
==============================================================================
--- nemerle/trunk/ncc/hierarchy/ClassMembers.n (original)
+++ nemerle/trunk/ncc/hierarchy/ClassMembers.n Thu Dec 15 22:35:29 2005
@@ -598,8 +598,6 @@
internal mutable overridden_method : IMethod;
- internal mutable yield_stuff : option [PT.PExpr * list [PT.Fun_parm]] = None ();
-
is_var_args : bool;
public GetMethodBase () : MethodBase
@@ -848,21 +846,8 @@
| (x, _) => x
};
- def ret_type = bind (f.header.ret_type);
- match (ret_type.Fix ()) {
- | Class (tc, [_])
- when tc.Equals (InternalType.Generic_IEnumerator_tc) =>
- match (f.header.ret_type) {
- | <[ $_ [ $t ] ]> =>
- // we need it at the parsetree level
- yield_stuff = Some ((t, f.header.parms));
- | _ => {}
- }
- | _ => {}
- }
-
fun_header = Fun_header (
- ret_type = ret_type,
+ ret_type = bind (f.header.ret_type),
typarms = typarms,
name = this.name,
parms = parms,
Modified: nemerle/trunk/ncc/typing/TypedTree.n
==============================================================================
--- nemerle/trunk/ncc/typing/TypedTree.n (original)
+++ nemerle/trunk/ncc/typing/TypedTree.n Thu Dec 15 22:35:29 2005
@@ -222,6 +222,7 @@
public mutable all_locals : list [LocalValue] = [];
internal mutable children_funs : list [Fun_header] = [];
internal mutable uses_try_block : bool;
+ internal mutable yield_type : TyVar;
// FIXME: move to hashtables in t3
internal mutable used_closures : list [Fun_header];
Modified: nemerle/trunk/ncc/typing/Typer.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer.n (original)
+++ nemerle/trunk/ncc/typing/Typer.n Thu Dec 15 22:35:29 2005
@@ -67,7 +67,6 @@
mutable skip_n_return : bool;
mutable inside_yielding_function : bool;
- yield_stuff : option [PT.PExpr * list [PT.Fun_parm]];
mutable yield_labels : list [int];
#region Toplevel typing
@@ -79,8 +78,6 @@
{
solver = Passes.Solver;
current_type = m.DeclaringType;
- yield_stuff = m.yield_stuff;
- m.yield_stuff = None ();
parent_typer = None ();
env = current_type.GlobalEnv;
current_fun = m.GetHeader ();
@@ -148,11 +145,11 @@
| _ is SwitchToYielding =>
log (TYPING, "got STY, trying again");
- m.yield_stuff = yield_stuff;
+ current_fun.yield_type = GetYieldType ();
def errcnt = Message.ErrorCount;
// just in case
put_in_error_mode ();
- m.Body = MakeEnumeratorClass (m.Body);
+ m.Body = WrapYieldingFunction (m.Body);
inside_yielding_function = true;
when (errcnt == Message.ErrorCount)
RunTyper ();
@@ -3035,7 +3032,7 @@
}
} else if (ns.Equals (yield_macro)) {
when (! inside_yielding_function) {
- _ = GetYieldStuff ();
+ _ = GetYieldType ();
log (TYPING, "throwing STY");
throw SwitchToYielding ();
}
@@ -3050,13 +3047,13 @@
#region yield handling
- MakeEnumeratorClass (body : PT.PExpr) : PT.PExpr
+ WrapYieldingFunction (body : PT.PExpr) : PT.PExpr
{
- def (yield_type, _) = GetYieldStuff ();
+ def yield_type = GetYieldType ();
def new_body =
<[
- mutable _N_current = Nemerle.Extensions.DefaultValue ($yield_type);
+ mutable _N_current = $(TExpr.DefaultValue (yield_type) : typed);
mutable _N_state = 0;
def _N_yielding_function () : bool
@@ -3082,20 +3079,20 @@
}
- GetYieldStuff () : PT.PExpr * list [PT.Fun_parm]
+ GetYieldType () : TyVar
{
match (parent_typer) {
- | Some (t) => t.GetYieldStuff ()
- | None =>
- match (yield_stuff) {
- | Some (x) => x
+ | Some (t) => t.GetYieldType ()
| None =>
+ match (current_fun.ret_type.Fix ()) {
+ | Class (tc, [t])
+ when tc.Equals (InternalType.Generic_IEnumerator_tc) => t
+ | t =>
ReportError (messenger,
$ "yield used in a function returning "
- "$(current_fun.ret_type) (it "
- "should be System.Collections.Generic."
+ "$t (it should be System.Collections.Generic."
"IEnumerator[T])");
- (<[ object ]>, [])
+ InternalType.Object
}
}
}
Modified: nemerle/trunk/ncc/typing/Typer2.n
==============================================================================
--- nemerle/trunk/ncc/typing/Typer2.n (original)
+++ nemerle/trunk/ncc/typing/Typer2.n Thu Dec 15 22:35:29 2005
@@ -72,7 +72,7 @@
messenger = Passes.Solver.CurrentMessenger;
- inside_yielding_function = fn.yield_stuff.IsSome;
+ inside_yielding_function = current_fun.yield_type != null;
}
More information about the svn
mailing list