Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / ServiceModel / System / ServiceModel / Dispatcher / CodeGenerator.cs / 1 / CodeGenerator.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- // ***NOTE*** If this code is changed, make corresponding changes in System.Runtime.Serialization.CodeGenerator also namespace System.ServiceModel.Dispatcher { using System; using System.Collections; using System.Globalization; using System.Xml; using System.Reflection; using System.Reflection.Emit; using System.IO; using System.Security; using System.Security.Permissions; using System.Diagnostics; using System.ServiceModel.Diagnostics; ////// Critical - generates IL into an ILGenerator that was created under an Assert /// generated IL must be correct and must not subvert the type system /// [SecurityCritical(SecurityCriticalScope.Everything)] internal class CodeGenerator { static MethodInfo getTypeFromHandle; static MethodInfo stringConcat2; static MethodInfo objectToString; static MethodInfo boxPointer; static MethodInfo unboxPointer; #if USE_REFEMIT AssemblyBuilder assemblyBuilder; ModuleBuilder moduleBuilder; TypeBuilder typeBuilder; static int typeCounter; MethodBuilder methodBuilder; #else static Module SerializationModule = typeof(CodeGenerator).Module; // Can be replaced by different assembly with SkipVerification set to false DynamicMethod dynamicMethod; #if DEBUG bool allowPrivateMemberAccess; #endif #endif Type delegateType; ILGenerator ilGen; ArrayList argList; Stack blockStack; Label methodEndLabel; Hashtable localNames; int lineNo = 1; enum CodeGenTrace {None, Save, Tron}; CodeGenTrace codeGenTrace; internal CodeGenerator() { SourceSwitch codeGenSwitch = OperationInvokerTrace.CodeGenerationSwitch; if ((codeGenSwitch.Level & SourceLevels.Verbose) == SourceLevels.Verbose) codeGenTrace = CodeGenTrace.Tron; else if ((codeGenSwitch.Level & SourceLevels.Information) == SourceLevels.Information) codeGenTrace = CodeGenTrace.Save; else codeGenTrace = CodeGenTrace.None; } static MethodInfo GetTypeFromHandle { get { if (getTypeFromHandle == null) getTypeFromHandle = typeof(Type).GetMethod("GetTypeFromHandle"); return getTypeFromHandle; } } static MethodInfo StringConcat2 { get { if (stringConcat2 == null) stringConcat2 = typeof(string).GetMethod("Concat", new Type[] { typeof(string), typeof(string) }); return stringConcat2; } } static MethodInfo ObjectToString { get { if (objectToString == null) objectToString = typeof(object).GetMethod("ToString", new Type[0]); return objectToString; } } static MethodInfo BoxPointer { get { if (boxPointer == null) boxPointer = typeof(Pointer).GetMethod("Box"); return boxPointer; } } static MethodInfo UnboxPointer { get { if (unboxPointer == null) unboxPointer = typeof(Pointer).GetMethod("Unbox"); return unboxPointer; } } internal void BeginMethod(string methodName, Type delegateType, bool allowPrivateMemberAccess) { MethodInfo signature = delegateType.GetMethod("Invoke"); ParameterInfo[] parameters = signature.GetParameters(); Type[] paramTypes = new Type[parameters.Length]; for (int i = 0; i < parameters.Length; i++) paramTypes[i] = parameters[i].ParameterType; BeginMethod(signature.ReturnType, methodName, paramTypes, allowPrivateMemberAccess); this.delegateType = delegateType; } void BeginMethod(Type returnType, string methodName, Type[] argTypes, bool allowPrivateMemberAccess) { #if USE_REFEMIT string typeName = "Type" + (typeCounter++); InitAssemblyBuilder(typeName + "." + methodName); this.typeBuilder = moduleBuilder.DefineType(typeName, TypeAttributes.Public); this.methodBuilder = typeBuilder.DefineMethod(methodName, MethodAttributes.Public|MethodAttributes.Static, returnType, argTypes); this.ilGen = this.methodBuilder.GetILGenerator(); #else this.dynamicMethod = new DynamicMethod(methodName, returnType, argTypes, SerializationModule, allowPrivateMemberAccess); this.ilGen = this.dynamicMethod.GetILGenerator(); #if DEBUG this.allowPrivateMemberAccess = allowPrivateMemberAccess; #endif #endif this.methodEndLabel = ilGen.DefineLabel(); this.blockStack = new Stack(); this.argList = new ArrayList(); for (int i=0;i"); Else(); Call(ObjectToString); EndIf(); } } internal void Concat2() { Call(StringConcat2); } internal void LoadZeroValueIntoLocal(Type type, LocalBuilder local) { if (type.IsValueType) { switch (Type.GetTypeCode(type)) { case TypeCode.Boolean: case TypeCode.Char: case TypeCode.SByte: case TypeCode.Byte: case TypeCode.Int16: case TypeCode.UInt16: case TypeCode.Int32: case TypeCode.UInt32: ilGen.Emit(OpCodes.Ldc_I4_0); Store(local); break; case TypeCode.Int64: case TypeCode.UInt64: ilGen.Emit(OpCodes.Ldc_I4_0); ilGen.Emit(OpCodes.Conv_I8); Store(local); break; case TypeCode.Single: ilGen.Emit(OpCodes.Ldc_R4, 0.0F); Store(local); break; case TypeCode.Double: ilGen.Emit(OpCodes.Ldc_R8, 0.0); Store(local); break; case TypeCode.Decimal: case TypeCode.DateTime: default: LoadAddress(local); InitObj(type); break; } } else { Load(null); Store(local); } } } internal class ArgBuilder { internal int Index; internal Type ArgType; internal ArgBuilder(int index, Type argType) { this.Index = index; this.ArgType = argType; } } internal class IfState { Label elseBegin; Label endIf; internal Label EndIf { get { return this.endIf; } set { this.endIf= value; } } internal Label ElseBegin { get { return this.elseBegin; } set { this.elseBegin= value; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TemplateApplicationHelper.cs
- CompositeTypefaceMetrics.cs
- TextMarkerSource.cs
- PeerTransportListenAddressValidatorAttribute.cs
- SizeIndependentAnimationStorage.cs
- DiagnosticEventProvider.cs
- MessagePropertyAttribute.cs
- ContextMarshalException.cs
- SafeBitVector32.cs
- HandlerElement.cs
- CrossContextChannel.cs
- HtmlToClrEventProxy.cs
- InplaceBitmapMetadataWriter.cs
- LayoutDump.cs
- AppLevelCompilationSectionCache.cs
- UserNamePasswordValidator.cs
- Utils.cs
- InvalidCommandTreeException.cs
- DebugTracing.cs
- TypeSystem.cs
- SubpageParaClient.cs
- BitmapFrameEncode.cs
- RelationshipDetailsRow.cs
- OraclePermissionAttribute.cs
- BaseProcessProtocolHandler.cs
- GradientBrush.cs
- IndicFontClient.cs
- FilterElement.cs
- DataKeyCollection.cs
- XmlWhitespace.cs
- ObjRef.cs
- XamlSerializerUtil.cs
- ElementProxy.cs
- RowUpdatingEventArgs.cs
- XsdCachingReader.cs
- StreamWriter.cs
- DiscoveryClientChannelFactory.cs
- XmlEncoding.cs
- RtfToXamlLexer.cs
- TypeCacheManager.cs
- DocumentSequenceHighlightLayer.cs
- ValidationEventArgs.cs
- DataTransferEventArgs.cs
- ScrollEvent.cs
- DataServiceQueryException.cs
- EmulateRecognizeCompletedEventArgs.cs
- SerializerDescriptor.cs
- HealthMonitoringSectionHelper.cs
- JoinQueryOperator.cs
- TreeViewDesigner.cs
- MemberExpressionHelper.cs
- Part.cs
- SymLanguageVendor.cs
- SharedPerformanceCounter.cs
- MdImport.cs
- Baml2006ReaderSettings.cs
- GenericsNotImplementedException.cs
- NameValueConfigurationCollection.cs
- SmtpLoginAuthenticationModule.cs
- DbDataAdapter.cs
- SimpleModelProvider.cs
- FormViewDeletedEventArgs.cs
- CheckBoxAutomationPeer.cs
- ComponentResourceKeyConverter.cs
- DetailsViewRowCollection.cs
- ConnectionAcceptor.cs
- CodeAttachEventStatement.cs
- DesignerVerbCollection.cs
- Sentence.cs
- DbProviderFactories.cs
- WindowsFont.cs
- ReferenceEqualityComparer.cs
- InertiaTranslationBehavior.cs
- MonikerBuilder.cs
- FileChangesMonitor.cs
- ValidationHelpers.cs
- WebReferencesBuildProvider.cs
- QuaternionRotation3D.cs
- EditorBrowsableAttribute.cs
- SelectionRange.cs
- WebRequestModulesSection.cs
- C14NUtil.cs
- OrderByExpression.cs
- WebEvents.cs
- SelectionGlyph.cs
- HostSecurityManager.cs
- ObjectPersistData.cs
- ConditionCollection.cs
- SslStream.cs
- BlurEffect.cs
- Tablet.cs
- StorageEntitySetMapping.cs
- PartBasedPackageProperties.cs
- Int32CollectionValueSerializer.cs
- SynchronizationContext.cs
- GridViewUpdateEventArgs.cs
- CodeVariableReferenceExpression.cs
- PtsHost.cs
- MetadataItemSerializer.cs
- ProxyWebPartConnectionCollection.cs