Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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
- XmlCharType.cs
- Converter.cs
- UniqueIdentifierService.cs
- UIElementCollection.cs
- WebBrowserNavigatingEventHandler.cs
- TextTrailingWordEllipsis.cs
- FixedSOMLineCollection.cs
- PlaceHolder.cs
- CheckBoxRenderer.cs
- CharacterMetricsDictionary.cs
- WindowsSpinner.cs
- DataSourceHelper.cs
- AsyncResult.cs
- AssociationTypeEmitter.cs
- ConnectionPoint.cs
- FixedNode.cs
- ClosableStream.cs
- SoapAttributeAttribute.cs
- WindowsImpersonationContext.cs
- DataGridViewHeaderCell.cs
- RangeValuePatternIdentifiers.cs
- _AutoWebProxyScriptWrapper.cs
- PreProcessInputEventArgs.cs
- Operand.cs
- ITreeGenerator.cs
- BitmapEffectInput.cs
- TreeNodeStyle.cs
- objectquery_tresulttype.cs
- Base64Encoder.cs
- ObjectSpanRewriter.cs
- SelectionBorderGlyph.cs
- OdbcRowUpdatingEvent.cs
- TabItemWrapperAutomationPeer.cs
- SqlServer2KCompatibilityCheck.cs
- ActiveXMessageFormatter.cs
- IssuanceLicense.cs
- ObjectTypeMapping.cs
- ItemsControl.cs
- TransformCollection.cs
- CheckBoxAutomationPeer.cs
- DocumentViewerBaseAutomationPeer.cs
- NamespaceEmitter.cs
- OdbcConnectionStringbuilder.cs
- RedirectionProxy.cs
- FreeFormDesigner.cs
- CallSiteHelpers.cs
- NamedPipeTransportSecurity.cs
- Panel.cs
- SystemIPGlobalStatistics.cs
- SymbolEqualComparer.cs
- HttpHeaderCollection.cs
- UrlMappingsSection.cs
- XmlQueryOutput.cs
- Page.cs
- WsatServiceAddress.cs
- HealthMonitoringSection.cs
- DetailsView.cs
- DataSetMappper.cs
- Shape.cs
- GreenMethods.cs
- SamlNameIdentifierClaimResource.cs
- EdmItemCollection.cs
- ToolStripRenderEventArgs.cs
- CodeTypeDeclaration.cs
- CustomAttributeFormatException.cs
- CardSpaceException.cs
- CharKeyFrameCollection.cs
- StringConcat.cs
- SelectionItemProviderWrapper.cs
- SmtpReplyReaderFactory.cs
- VarRemapper.cs
- WebBrowserSiteBase.cs
- OleDbException.cs
- TableChangeProcessor.cs
- Base64Encoder.cs
- FontCacheLogic.cs
- ChannelEndpointElementCollection.cs
- SystemIPv6InterfaceProperties.cs
- StringBlob.cs
- XamlFigureLengthSerializer.cs
- HttpCookie.cs
- InputLanguageCollection.cs
- FileSystemInfo.cs
- DocumentXmlWriter.cs
- CompilerInfo.cs
- Padding.cs
- Icon.cs
- XmlWriterSettings.cs
- Utils.cs
- ApplicationContext.cs
- EventsTab.cs
- SoapSchemaMember.cs
- CaseInsensitiveHashCodeProvider.cs
- AggregateNode.cs
- COAUTHIDENTITY.cs
- Repeater.cs
- DataGridViewRowPostPaintEventArgs.cs
- CallbackValidator.cs
- CompiledQueryCacheEntry.cs
- DeclaredTypeElement.cs