public SubjectMethodExistsForDuckProxySubjectCoder(IProxyCodeBuilder pcb, Type methodExistsSubjectType, Type realSubjectType)
 {
     _methodExistsSubjectType = methodExistsSubjectType;
     _realSubjectType = realSubjectType;
     var pcd = MethodIndexFactory.GetProxyClassDescriptorForSubjectType(methodExistsSubjectType);
     _methodIndexProxyType = pcb.ProxyCoderContext.ProxyModule.GetTypeFromProxyClassDescriptor(pcd);
     _ftb = pcb.SelfTypeBuilder;
     _smiMethod = GenerateStaticFromMethodIndex();
 }
        public SubjectMethodExistsForDuckProxySubjectCoder(IProxyCodeBuilder pcb, Type methodExistsSubjectType, Type realSubjectType)
        {
            _methodExistsSubjectType = methodExistsSubjectType;
            _realSubjectType         = realSubjectType;
            var pcd = MethodIndexFactory.GetProxyClassDescriptorForSubjectType(methodExistsSubjectType);

            _methodIndexProxyType = pcb.ProxyCoderContext.ProxyModule.GetTypeFromProxyClassDescriptor(pcd);
            _ftb       = pcb.SelfTypeBuilder;
            _smiMethod = GenerateStaticFromMethodIndex();
        }
Exemple #3
0
        public override void Start(IProxyCodeBuilder codeBuilder)
        {
            var baseClassType   = codeBuilder.ProxyCoderContext.Descriptor.BaseClassType;
            var targetProxyType = codeBuilder.ProxyCoderContext.ProxyModule.GetTypeFromProxyClassDescriptor(
                new ProxyClassDescriptor(
                    new RealSubjectMixin(baseClassType,
                                         _interceptorType.GetInterfaces().Select(i => (ISubjectDescriptor) new InterceptTargetSubject(i)).ToArray())));

            _targetProxyTypeCtor = targetProxyType.GetConstructor(new[] { baseClassType });
        }
 public virtual void Generate(IProxyCodeBuilder pcb)
 {
     _tb = (TypeBuilder)pcb.SelfType;
     if (_ctor==null)
     {
         _ctor = pcb.Ctor;
         _ctorArgTypes = pcb.CtorArgs.ToArray();
     }
     else
     {
         _ctorArgTypes = _ctor.GetParameters().Select(a => a.ParameterType).ToArray();
     }
     GenFactoryDelegateMethod();
     GenFactoryMethod();
 }
Exemple #5
0
 public override void Generate(IProxyCodeBuilder pcb)
 {
     _tb = (TypeBuilder)pcb.SelfType;
     if (_ctor == null)
     {
         _ctor         = pcb.Ctor;
         _ctorArgTypes = pcb.CtorArgs.ToArray();
     }
     else
     {
         _ctorArgTypes = _ctor.GetParameters().Select(a => a.ParameterType).ToArray();
     }
     GenFactoryDelegateMethod();
     GenFactoryMethod();
 }
Exemple #6
0
        public override void Generate(IProxyCodeBuilder pcb)
        {
            if (pcb.CtorArgs.Any())
            {
                throw new InvalidOperationException("Cannot use StaticInstanceMixin when there are constructor arguments");
            }

            var ftb = pcb.SelfTypeBuilder;

            var funcField = ftb.DefineField(
                StaticInstanceMixin.FuncInstanceFieldName,
                typeof(Func <object>),
                FieldAttributes.Static | FieldAttributes.Public);

            var field = ftb.DefineField(StaticInstanceMixin.InstanceFieldName, ftb.AsType(), FieldAttributes.Static | FieldAttributes.Private);

            if (_options.HasFlag(StaticInstanceOptions.ThreadStatic))
            {
                // ReSharper disable once AssignNullToNotNullAttribute
                field.SetCustomAttribute(new CustomAttributeBuilder(typeof(ThreadStaticAttribute).GetConstructor(Type.EmptyTypes), new object[] {}));
            }

            var property  = ftb.DefineProperty(StaticInstanceMixin.InstancePropertyName, PropertyAttributes.None, ftb.AsType(), Type.EmptyTypes);
            var getMethod = ftb.DefineMethod(
                StaticInstanceMixin.InstanceGetMethodName,
                MethodAttributes.Static | MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName,
                ftb.AsType(),
                Type.EmptyTypes);

            property.SetGetMethod(getMethod);

            // Generate get method body for property
            var gen       = getMethod.GetILGenerator();
            var doneLabel = gen.DefineLabel();

            gen.Emit(OpCodes.Ldsfld, field);       // push _i;
            gen.Emit(OpCodes.Dup);                 // push s0
            gen.Emit(OpCodes.Brtrue_S, doneLabel); // if [s0]!=null then goto doneLabel
            gen.Emit(OpCodes.Pop);
            gen.Emit(OpCodes.Newobj, pcb.Ctor);    // new proxy object
            gen.Emit(OpCodes.Dup);                 // push s0
            gen.Emit(OpCodes.Stsfld, field);       // _i = [s0]
            gen.MarkLabel(doneLabel);
            gen.Emit(OpCodes.Ret);

            GenerateStaticCtor(ftb, funcField, getMethod);
        }
        public void Generate(IProxyCodeBuilder pcb)
        {
            if (pcb.CtorArgs.Any())
                throw new InvalidOperationException("Cannot use StaticInstanceMixin when there are constructor arguments");

            var ftb = pcb.SelfTypeBuilder;

            var funcField = ftb.DefineField(
                StaticInstanceMixin.FuncInstanceFieldName,
                typeof(Func<object>),
                FieldAttributes.Static | FieldAttributes.Public);

            var field = ftb.DefineField(StaticInstanceMixin.InstanceFieldName, ftb.AsType(), FieldAttributes.Static | FieldAttributes.Private);
            if (_options.HasFlag(StaticInstanceOptions.ThreadStatic))
            {
                // ReSharper disable once AssignNullToNotNullAttribute
                field.SetCustomAttribute(new CustomAttributeBuilder(typeof(ThreadStaticAttribute).GetConstructor(Type.EmptyTypes), new object[] {}));
            }

            var property = ftb.DefineProperty(StaticInstanceMixin.InstancePropertyName, PropertyAttributes.None, ftb.AsType(), Type.EmptyTypes);
            var getMethod = ftb.DefineMethod(
                StaticInstanceMixin.InstanceGetMethodName,
                MethodAttributes.Static | MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName,
                ftb.AsType(),
                Type.EmptyTypes);
            property.SetGetMethod(getMethod);

            // Generate get method body for property
            var gen = getMethod.GetILGenerator();
            var doneLabel = gen.DefineLabel();
            gen.Emit(OpCodes.Ldsfld, field); // push _i;
            gen.Emit(OpCodes.Dup); // push s0
            gen.Emit(OpCodes.Brtrue_S, doneLabel); // if [s0]!=null then goto doneLabel
            gen.Emit(OpCodes.Pop);
            gen.Emit(OpCodes.Newobj, pcb.Ctor); // new proxy object
            gen.Emit(OpCodes.Dup); // push s0
            gen.Emit(OpCodes.Stsfld, field); // _i = [s0]
            gen.MarkLabel(doneLabel);
            gen.Emit(OpCodes.Ret);

            GenerateStaticCtor(ftb, funcField, getMethod);
        }
Exemple #8
0
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new DuckProxySubjectCoder(mc as IRealSubjectMixinCoder, pcb.ProxyCoderContext.ProxyModule, this));
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new SubjectMethodExistsForDuckProxySubjectCoder(pcb, _methodExistsSubjectType, _realSubjectType));
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return new SafeProxyMetaSubjectCoder(mc as IRealSubjectMixinCoder);
 }
Exemple #11
0
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new MethodExistsProxyMetaSubjectCoder(pcb));
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return new SubjectMethodExistsForDuckProxySubjectCoder(pcb, _methodExistsSubjectType, _realSubjectType);
 }
Exemple #13
0
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new SafeDirectProxySubjectCoder(mc as IRealSubjectMixinCoder, pcb.ProxyCoderContext.ProxyModule, Type));
 }
Exemple #14
0
 public virtual void Generate(IProxyCodeBuilder pcb)
 {
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new DynamicPropertySourceSubjectCoder(mc as IDynamicPropertySourceMixinCoder, pcb.ProxyCoderContext.ModuleBuilder));
 }
Exemple #16
0
 public abstract ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb);
Exemple #17
0
 public virtual void Start(IProxyCodeBuilder pcb)
 {
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new PropertyStoreSubjectCoder(pcb));
 }
 public PropertyStoreSubjectCoder(IProxyCodeBuilder pcb)
 {
     _pcb = pcb;
 }
Exemple #20
0
 public MethodExistsProxyMetaSubjectCoder(IProxyCodeBuilder pcb)
 {
     _pcb = pcb;
 }
Exemple #21
0
 public abstract ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb);
 public virtual void Generate(IProxyCodeBuilder pcb)
 {
 }
 public MethodExistsProxyMetaSubjectCoder(IProxyCodeBuilder pcb)
 {
     _pcb = pcb;
 }
 public ISubjectMethodExistsPerSubjectCoder CreateCoder(IProxyCodeBuilder pcb)
 {
     return(new AlwaysTrueSubjectMethodExistsPerSubjectCoder(Type));
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return new MethodExistsProxyMetaSubjectCoder(pcb);
 }
Exemple #26
0
 public ISubjectMethodExistsPerSubjectCoder CreateCoder(IProxyCodeBuilder pcb)
 {
     return(new DuckProxySubjectMethodExistsCoder(pcb.ProxyCoderContext.ProxyModule, Type, RealSubjectType));
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new InterceptorSubjectCoder(mc as IInterceptMixinCoder));
 }
Exemple #28
0
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new SafeNullProxySubjectCoder(pcb.ProxyCoderContext.ProxyModule));
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return new ComputeMethodIndexForSubjectCoder((ComputeMethodIndexMixinCoder)mc);
 }
 public override void Generate(IProxyCodeBuilder pcb)
 {
     _methodIndexField = pcb.AddField("_methodIndex", typeof(int));
     base.Generate(pcb);
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new DirectProxySubjectCoder(mc as IRealSubjectMixinCoder));
 }
 public override void Generate(IProxyCodeBuilder pcb)
 {
     _methodIndexField = pcb.AddField("_methodIndex", typeof(int));
     base.Generate(pcb);
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return new DynamicPropertySourceSubjectCoder(mc as IDynamicPropertySourceMixinCoder, pcb.ProxyCoderContext.ModuleBuilder);
 }
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new ComputeMethodIndexResultSubjectCoder((ComputeMethodIndexMixinCoder)mc));
 }
Exemple #35
0
 public PropertyStoreSubjectCoder(IProxyCodeBuilder pcb)
 {
     _pcb = pcb;
 }
Exemple #36
0
 public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb)
 {
     return(new InterceptTargetSubjectCoder(mc as IRealSubjectMixinCoder, Type));
 }