Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / ArgIterator.cs / 2 / 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 ValueType.GetHashCodeOfPtr(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 ValueType.GetHashCodeOfPtr(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
- WebPartCloseVerb.cs
- SecurityManager.cs
- Stack.cs
- AutomationPattern.cs
- AnnotationStore.cs
- SqlConnectionStringBuilder.cs
- XmlSchemaAnnotation.cs
- DefaultExpressionVisitor.cs
- ScriptModule.cs
- SetState.cs
- TraceEventCache.cs
- RectangleHotSpot.cs
- SqlDataSourceEnumerator.cs
- SafeNativeMethods.cs
- MessageHeaders.cs
- SamlAssertion.cs
- StateChangeEvent.cs
- DataColumnMappingCollection.cs
- NoResizeSelectionBorderGlyph.cs
- SecureEnvironment.cs
- XamlGridLengthSerializer.cs
- AdapterDictionary.cs
- OleDbConnection.cs
- Table.cs
- LinqTreeNodeEvaluator.cs
- ConstraintCollection.cs
- WebControlAdapter.cs
- xmlglyphRunInfo.cs
- SymbolDocumentInfo.cs
- ClientProxyGenerator.cs
- LogFlushAsyncResult.cs
- SQLDecimal.cs
- XmlSchemaSimpleTypeRestriction.cs
- TextTreeFixupNode.cs
- TransformerTypeCollection.cs
- XmlChildEnumerator.cs
- ServiceSecurityAuditElement.cs
- SoapElementAttribute.cs
- Sql8ExpressionRewriter.cs
- BulletedList.cs
- InfoCardBaseException.cs
- QuadraticBezierSegment.cs
- XmlCodeExporter.cs
- TimeSpanOrInfiniteConverter.cs
- RightsManagementEncryptionTransform.cs
- SqlRowUpdatedEvent.cs
- CLSCompliantAttribute.cs
- DispatcherTimer.cs
- LineGeometry.cs
- CreateDataSourceDialog.cs
- ColorConvertedBitmapExtension.cs
- WebConfigurationFileMap.cs
- NumberSubstitution.cs
- Native.cs
- SupportingTokenProviderSpecification.cs
- DataGridViewLinkColumn.cs
- XhtmlBasicSelectionListAdapter.cs
- BoundField.cs
- DrawingGroupDrawingContext.cs
- RbTree.cs
- TrueReadOnlyCollection.cs
- SmtpClient.cs
- ListenerConstants.cs
- PreviewPageInfo.cs
- SecurityTokenRequirement.cs
- IteratorFilter.cs
- DataGridViewRowPrePaintEventArgs.cs
- DataControlFieldCollection.cs
- NetMsmqBindingElement.cs
- CodeTypeConstructor.cs
- XmlElementElementCollection.cs
- HttpCookiesSection.cs
- ConfigXmlAttribute.cs
- PopupEventArgs.cs
- XPathDocumentNavigator.cs
- Stack.cs
- LocatorPart.cs
- NavigationWindowAutomationPeer.cs
- WindowsFormsHost.cs
- ControlPaint.cs
- DataMisalignedException.cs
- MDIControlStrip.cs
- CellParaClient.cs
- WinHttpWebProxyFinder.cs
- WorkflowViewStateService.cs
- X509CertificateTrustedIssuerElementCollection.cs
- MediaScriptCommandRoutedEventArgs.cs
- ExtensibleClassFactory.cs
- MultiByteCodec.cs
- StringCollection.cs
- EndpointIdentity.cs
- DirtyTextRange.cs
- DataException.cs
- IdentityNotMappedException.cs
- WindowsTooltip.cs
- CreateUserWizardStep.cs
- MarkupCompilePass1.cs
- Normalization.cs
- HtmlLink.cs
- WorkflowInstanceExtensionCollection.cs