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 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(); }
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(); }
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); }
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); }
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); }
public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb) { return(new SafeDirectProxySubjectCoder(mc as IRealSubjectMixinCoder, pcb.ProxyCoderContext.ProxyModule, Type)); }
public virtual void Generate(IProxyCodeBuilder pcb) { }
public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb) { return(new DynamicPropertySourceSubjectCoder(mc as IDynamicPropertySourceMixinCoder, pcb.ProxyCoderContext.ModuleBuilder)); }
public abstract ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb);
public virtual void Start(IProxyCodeBuilder pcb) { }
public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb) { return(new PropertyStoreSubjectCoder(pcb)); }
public PropertyStoreSubjectCoder(IProxyCodeBuilder pcb) { _pcb = 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); }
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)); }
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 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)); }
public override ISubjectCoder CreateCoder(IMixinCoder mc, IProxyCodeBuilder pcb) { return(new InterceptTargetSubjectCoder(mc as IRealSubjectMixinCoder, Type)); }