Exemple #1
0
            //-----------------------------------------------------------------------------------------------------------------------------------------------------

            private static void EmitPropertyComparison(
                FunctionMethodWriter <int> m,
                PropertyInfo prop,
                Local <TypeTemplate.TPrimary> otherTuple,
                Local <int> compareResult)
            {
                var backingField = m.This <TypeTemplate.TPrimary>().BackingFieldOf <TypeTemplate.TProperty>(prop);
                var otherValue   = m.Local(initialValue: otherTuple.Prop <TypeTemplate.TProperty>(prop));

                if (backingField.OperandType.IsValueType)
                {
                    m.If(backingField > otherValue).Then(() => {
                        m.Return(1);
                    })
                    .ElseIf(backingField < otherValue).Then(() => {
                        m.Return(-1);
                    })
                    .ElseIf(backingField != otherValue).Then(() => {
                        m.Return(1);
                    });
                }
                else if (typeof(IComparable).IsAssignableFrom(backingField.OperandType))
                {
                    compareResult.Assign(backingField.CastTo <IComparable>().Func <object, int>(x => x.CompareTo, otherValue));
                    m.If(compareResult != 0).Then(() => m.Return(compareResult));
                }
                else
                {
                    throw new NotSupportedException("Cannot compare values of type: " + backingField.OperandType.FullName);
                }
            }
Exemple #2
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        public Local <T> Local <T>(IOperand <T> initialValue)
        {
            var local = new Local <T>(m_OwnerMethod);

            local.Assign(initialValue);
            return(local);
        }
Exemple #3
0
            //-------------------------------------------------------------------------------------------------------------------------------------------------

            protected override void OnEvent(EventMember member, Func <EventDecorationBuilder> decorate)
            {
                Local <EventInterceptorClosure <TypeTemplate.TEventArgs> > interceptorClosure = null;
                Argument <EventHandler <TypeTemplate.TEventArgs> >         value = null;

                decorate().OnAdd()
                .OnBefore(w => {
                    value = w.Arg1 <EventHandler <TypeTemplate.TEventArgs> >();
                    interceptorClosure = w.Local <EventInterceptorClosure <TypeTemplate.TEventArgs> >();

                    interceptorClosure.Assign(w.New <EventInterceptorClosure <TypeTemplate.TEventArgs> >());
                    interceptorClosure.Field(x => x.EventName).Assign(member.Name);
                    interceptorClosure.Field(x => x.Log).Assign(m_LogField);
                    interceptorClosure.Field(x => x.Handler).Assign(value);

                    value.Assign(
                        w.MakeDelegate <EventInterceptorClosure <TypeTemplate.TEventArgs>, EventHandler <TypeTemplate.TEventArgs>, TypeTemplate.TEventHandler>(
                            interceptorClosure,
                            x => x.HandleEvent
                            )
                        );
                })
                .OnSuccess(w =>
                           m_EventHandlerMapField.Add(interceptorClosure.Field(x => x.Handler), value)
                           );

                decorate().OnRemove()
                .OnBefore(w => {
                    value = w.Arg1 <EventHandler <TypeTemplate.TEventArgs> >();
                    var interceptingHandler = w.Local <EventHandler <TypeTemplate.TEventArgs> >();
                    w.If(m_EventHandlerMapField.TryGetValue(value, interceptingHandler) == w.Const(true)).Then(() =>
                                                                                                               value.Assign(interceptingHandler)
                                                                                                               );
                });
            }
Exemple #4
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        #region IHapilForeachDoSyntax<TItem> Members

        public void Do(Action <ILoopBody, Local <TElement> > body)
        {
            using (var scope = new StatementScope(m_BodyBlock, loopStatement: this))
            {
                var writer     = scope.Writer;
                var enumerator = writer.Local <IEnumerator <TElement> >();

                enumerator.Assign(m_Collection.CastTo <IEnumerable <TElement> >().Func <IEnumerator <TElement> >(x => x.GetEnumerator));

                writer.Using(enumerator).Do(() => {
                    m_InnerWhile = (WhileStatement)writer.While(enumerator.Func <bool>(e => e.MoveNext));
                    m_InnerWhile.Do(loop => {
                        m_Element.Assign(enumerator.Prop(e => e.Current));
                        body(this, m_Element);
                    });
                });
            }
        }