Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / clr / src / BCL / System / ArgIterator.cs / 1 / ArgIterator.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System { using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; // This class will not be marked serializable [StructLayout(LayoutKind.Auto)] public struct ArgIterator { [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern ArgIterator(IntPtr arglist); // create an arg iterator that points at the first argument that // is not statically declared (that is the first ... arg) // 'arglist' is the value returned by the ARGLIST instruction public ArgIterator(RuntimeArgumentHandle arglist) : this(arglist.Value) { } [MethodImplAttribute(MethodImplOptions.InternalCall)] private unsafe extern ArgIterator(IntPtr arglist, void *ptr); // create an arg iterator that points just past 'firstArg'. // 'arglist' is the value returned by the ARGLIST instruction // This is much like the C va_start macro [CLSCompliant(false)] public unsafe ArgIterator(RuntimeArgumentHandle arglist, void* ptr) : this(arglist.Value, ptr) { } // Fetch an argument as a typed referece, advance the iterator. // Throws an exception if past end of argument list [CLSCompliant(false)] public TypedReference GetNextArg() { TypedReference result = new TypedReference (); // reference to TypedReference is banned, so have to pass result as pointer unsafe { FCallGetNextArg (&result); } return result; } [MethodImplAttribute(MethodImplOptions.InternalCall)] // reference to TypedReference is banned, so have to pass result as void pointer private unsafe extern void FCallGetNextArg(void * result); // Alternate version of GetNextArg() intended primarily for IJW code // generated by VC's "va_arg()" construct. [CLSCompliant(false)] public TypedReference GetNextArg(RuntimeTypeHandle rth) { if (sigPtr != IntPtr.Zero) { // This is an ordinary ArgIterator capable of determining // types from a signature. Just do a regular GetNextArg. return GetNextArg(); } else { // Prevent abuse of this API with a default ArgIterator (it // doesn't require permission to create a zero-inited value // type). Check that ArgPtr isn't zero or this API will allow a // malicious caller to increment the pointer to an arbitrary // location in memory and read the contents. if (ArgPtr == IntPtr.Zero) throw new ArgumentNullException(); TypedReference result = new TypedReference (); // reference to TypedReference is banned, so have to pass result as pointer unsafe { InternalGetNextArg(&result, rth); } return result; } } [MethodImplAttribute(MethodImplOptions.InternalCall)] // reference to TypedReference is banned, so have to pass result as void pointer private unsafe extern void InternalGetNextArg(void * result, RuntimeTypeHandle rth); // This method should invalidate the iterator (va_end). It is not supported yet. public void End() { } // How many arguments are left in the list [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern int GetRemainingCount(); // Gets the type of the current arg, does NOT advance the iterator [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern unsafe void* _GetNextArgType(); public unsafe RuntimeTypeHandle GetNextArgType() { return new RuntimeTypeHandle(_GetNextArgType()); } public override int GetHashCode() { return unchecked((int)((long)ArgCookie)); } // Inherited from object public override bool Equals(Object o) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NYI")); } private IntPtr ArgCookie; // Cookie from the EE. // The SigPtr structure consists of the following members private IntPtr sigPtr; // Pointer to remaining signature. private IntPtr sigPtrLen; // Remaining length of the pointer // Note, sigPtrLen is actually a DWORD, but on 64bit systems this structure becomes // 8-byte aligned, which requires us to pad it. private IntPtr ArgPtr; // Pointer to remaining args. private int RemainingArgs; // # of remaining args. } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System { using System; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; // This class will not be marked serializable [StructLayout(LayoutKind.Auto)] public struct ArgIterator { [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern ArgIterator(IntPtr arglist); // create an arg iterator that points at the first argument that // is not statically declared (that is the first ... arg) // 'arglist' is the value returned by the ARGLIST instruction public ArgIterator(RuntimeArgumentHandle arglist) : this(arglist.Value) { } [MethodImplAttribute(MethodImplOptions.InternalCall)] private unsafe extern ArgIterator(IntPtr arglist, void *ptr); // create an arg iterator that points just past 'firstArg'. // 'arglist' is the value returned by the ARGLIST instruction // This is much like the C va_start macro [CLSCompliant(false)] public unsafe ArgIterator(RuntimeArgumentHandle arglist, void* ptr) : this(arglist.Value, ptr) { } // Fetch an argument as a typed referece, advance the iterator. // Throws an exception if past end of argument list [CLSCompliant(false)] public TypedReference GetNextArg() { TypedReference result = new TypedReference (); // reference to TypedReference is banned, so have to pass result as pointer unsafe { FCallGetNextArg (&result); } return result; } [MethodImplAttribute(MethodImplOptions.InternalCall)] // reference to TypedReference is banned, so have to pass result as void pointer private unsafe extern void FCallGetNextArg(void * result); // Alternate version of GetNextArg() intended primarily for IJW code // generated by VC's "va_arg()" construct. [CLSCompliant(false)] public TypedReference GetNextArg(RuntimeTypeHandle rth) { if (sigPtr != IntPtr.Zero) { // This is an ordinary ArgIterator capable of determining // types from a signature. Just do a regular GetNextArg. return GetNextArg(); } else { // Prevent abuse of this API with a default ArgIterator (it // doesn't require permission to create a zero-inited value // type). Check that ArgPtr isn't zero or this API will allow a // malicious caller to increment the pointer to an arbitrary // location in memory and read the contents. if (ArgPtr == IntPtr.Zero) throw new ArgumentNullException(); TypedReference result = new TypedReference (); // reference to TypedReference is banned, so have to pass result as pointer unsafe { InternalGetNextArg(&result, rth); } return result; } } [MethodImplAttribute(MethodImplOptions.InternalCall)] // reference to TypedReference is banned, so have to pass result as void pointer private unsafe extern void InternalGetNextArg(void * result, RuntimeTypeHandle rth); // This method should invalidate the iterator (va_end). It is not supported yet. public void End() { } // How many arguments are left in the list [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern int GetRemainingCount(); // Gets the type of the current arg, does NOT advance the iterator [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern unsafe void* _GetNextArgType(); public unsafe RuntimeTypeHandle GetNextArgType() { return new RuntimeTypeHandle(_GetNextArgType()); } public override int GetHashCode() { return unchecked((int)((long)ArgCookie)); } // Inherited from object public override bool Equals(Object o) { throw new NotSupportedException(Environment.GetResourceString("NotSupported_NYI")); } private IntPtr ArgCookie; // Cookie from the EE. // The SigPtr structure consists of the following members private IntPtr sigPtr; // Pointer to remaining signature. private IntPtr sigPtrLen; // Remaining length of the pointer // Note, sigPtrLen is actually a DWORD, but on 64bit systems this structure becomes // 8-byte aligned, which requires us to pad it. private IntPtr ArgPtr; // Pointer to remaining args. private int RemainingArgs; // # of remaining args. } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GlyphRunDrawing.cs
- ComponentManagerBroker.cs
- ConstructorArgumentAttribute.cs
- WebPartHeaderCloseVerb.cs
- IndexedString.cs
- TextServicesDisplayAttributePropertyRanges.cs
- ScriptingProfileServiceSection.cs
- ObjectHandle.cs
- ControlBuilder.cs
- TypeCodeDomSerializer.cs
- OperationPerformanceCounters.cs
- ISFTagAndGuidCache.cs
- XDRSchema.cs
- Semaphore.cs
- TextBoxLine.cs
- DataGridTextColumn.cs
- KeyInfo.cs
- DbExpressionBuilder.cs
- XmlCodeExporter.cs
- Guid.cs
- WebServiceData.cs
- COM2ExtendedUITypeEditor.cs
- XmlAnyElementAttributes.cs
- WebPartTracker.cs
- TargetControlTypeAttribute.cs
- XmlConverter.cs
- XmlILOptimizerVisitor.cs
- XPathParser.cs
- DesignerDataParameter.cs
- EntitySqlException.cs
- CachedCompositeFamily.cs
- Vector3DConverter.cs
- DataGridViewCellCollection.cs
- DataGridColumnHeaderAutomationPeer.cs
- XmlSchemaDocumentation.cs
- CqlGenerator.cs
- ObjectFullSpanRewriter.cs
- ThreadPoolTaskScheduler.cs
- KeyedCollection.cs
- CacheAxisQuery.cs
- CodeMemberProperty.cs
- SettingsSavedEventArgs.cs
- Propagator.JoinPropagator.SubstitutingCloneVisitor.cs
- Timer.cs
- TextContainerChangedEventArgs.cs
- PrimitiveSchema.cs
- FrameworkElement.cs
- LightweightCodeGenerator.cs
- BitmapEffectInputConnector.cs
- SelectionWordBreaker.cs
- SqlAggregateChecker.cs
- BitmapEffectDrawingContextState.cs
- DataGridViewAdvancedBorderStyle.cs
- CapabilitiesState.cs
- PageRequestManager.cs
- FlowDocumentPageViewerAutomationPeer.cs
- XmlAtomicValue.cs
- SemanticBasicElement.cs
- DbTransaction.cs
- TargetControlTypeCache.cs
- LoaderAllocator.cs
- DataAccessException.cs
- TraceSection.cs
- WorkBatch.cs
- LicenseManager.cs
- DrawingAttributesDefaultValueFactory.cs
- JobDuplex.cs
- SmiSettersStream.cs
- RegexCharClass.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- ReturnType.cs
- FrameDimension.cs
- FocusChangedEventArgs.cs
- DataGridViewCellCancelEventArgs.cs
- HtmlCalendarAdapter.cs
- IApplicationTrustManager.cs
- CqlLexerHelpers.cs
- ArgumentValidation.cs
- BitmapEffectGroup.cs
- SafePEFileHandle.cs
- SimpleMailWebEventProvider.cs
- TogglePattern.cs
- CombinedGeometry.cs
- WmlValidatorAdapter.cs
- FullTextBreakpoint.cs
- MarkupExtensionSerializer.cs
- EtwTrace.cs
- WizardSideBarListControlItem.cs
- HttpInputStream.cs
- CSharpCodeProvider.cs
- ResourceWriter.cs
- OleDbMetaDataFactory.cs
- UriSection.cs
- SortKey.cs
- ProtectedConfiguration.cs
- FirstMatchCodeGroup.cs
- FullTextState.cs
- Root.cs
- DispatcherEventArgs.cs
- XmlArrayItemAttribute.cs