public sealed override bool Resolve (EmitContext ec) { if (!DoResolve (ec)) return false; unwind_protect = ec.CurrentBranching.AddReturnOrigin (ec.CurrentBranching.CurrentUsageVector, this); if (unwind_protect) ec.NeedReturnLabel (); ec.CurrentBranching.CurrentUsageVector.Goto (); return true; }
protected void ResolveReachability (EmitContext ec) { // System.Reflection.Emit automatically emits a 'leave' at the end of a try clause // So, ensure there's some IL code after this statement. if (!code_follows && resume_points == null && ec.CurrentBranching.CurrentUsageVector.IsUnreachable) ec.NeedReturnLabel (); }
public override bool Resolve (EmitContext ec) { bool ok = true; ec.StartFlowBranching (this); if (!Block.Resolve (ec)) ok = false; Type[] prev_catches = new Type [Specific.Count]; int last_index = 0; foreach (Catch c in Specific){ ec.CurrentBranching.CreateSibling (c.Block, FlowBranching.SiblingType.Catch); if (c.Name != null) { LocalInfo vi = c.Block.GetLocalInfo (c.Name); if (vi == null) throw new Exception (); vi.VariableInfo = null; } if (!c.Resolve (ec)) ok = false; Type resolved_type = c.CatchType; for (int ii = 0; ii < last_index; ++ii) { if (resolved_type == prev_catches [ii] || TypeManager.IsSubclassOf (resolved_type, prev_catches [ii])) { Report.Error (160, c.loc, "A previous catch clause already catches all exceptions of this or a super type `{0}'", prev_catches [ii].FullName); ok = false; } } prev_catches [last_index++] = resolved_type; } if (General != null) { if (CodeGen.Assembly.WrapNonExceptionThrows) { foreach (Catch c in Specific){ if (c.CatchType == TypeManager.exception_type) { Report.Warning (1058, 1, c.loc, "A previous catch clause already catches all exceptions. All non-exceptions thrown will be wrapped in a `System.Runtime.CompilerServices.RuntimeWrappedException'"); } } } ec.CurrentBranching.CreateSibling (General.Block, FlowBranching.SiblingType.Catch); if (!General.Resolve (ec)) ok = false; } ec.EndFlowBranching (); // System.Reflection.Emit automatically emits a 'leave' at the end of a try/catch clause // So, ensure there's some IL code after this statement if (!inside_try_finally && !code_follows && ec.CurrentBranching.CurrentUsageVector.IsUnreachable) ec.NeedReturnLabel (); return ok; }
public override Expression DoResolve (EmitContext ec) { if (!ec.IsAnonymousMethodAllowed) { Report.Error (1706, loc, "Anonymous methods and lambda expressions cannot be used in the current context"); return null; } // // Set class type, set type // eclass = ExprClass.Value; // // This hack means `The type is not accessible // anywhere', we depend on special conversion // rules. // type = TypeManager.anonymous_method_type; if ((Parameters != null) && !Parameters.Resolve (ec)) return null; // FIXME: The emitted code isn't very careful about reachability // so, ensure we have a 'ret' at the end if (ec.CurrentBranching != null && ec.CurrentBranching.CurrentUsageVector.IsUnreachable) ec.NeedReturnLabel (); return this; }