// (C) 2001 Ximian, Inc. http://www.ximian.com
//
+#if !FULL_AOT_RUNTIME
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.InteropServices;
namespace System.Reflection.Emit {
-#if NET_2_0
[ComVisible (true)]
[ComDefaultInterface (typeof (_SignatureHelper))]
-#endif
[ClassInterface (ClassInterfaceType.None)]
+ [StructLayout (LayoutKind.Sequential)]
public sealed class SignatureHelper : _SignatureHelper {
internal enum SignatureHelperType {
HELPER_FIELD,
private Type returnType;
private CallingConventions callConv;
private CallingConvention unmanagedCallConv;
+#pragma warning disable 649
private Type[][] modreqs;
private Type[][] modopts;
+#pragma warning restore 649
internal SignatureHelper (ModuleBuilder module, SignatureHelperType type)
{
return new SignatureHelper ((ModuleBuilder) mod, SignatureHelperType.HELPER_LOCAL);
}
-#if NET_2_0
public static SignatureHelper GetLocalVarSigHelper ()
{
return new SignatureHelper (null, SignatureHelperType.HELPER_LOCAL);
}
- public static SignatureHelper GetMethodSigHelper(CallingConventions callingConvention, Type returnType)
+ public static SignatureHelper GetMethodSigHelper (CallingConventions callingConvention, Type returnType)
{
return GetMethodSigHelper (null, callingConvention, (CallingConvention)0, returnType, null);
}
- public static SignatureHelper GetMethodSigHelper (CallingConvention unmanagedCallingConvention,
- Type returnType)
+ public static SignatureHelper GetMethodSigHelper (CallingConvention unmanagedCallingConvention, Type returnType)
{
return GetMethodSigHelper (null, CallingConventions.Standard, unmanagedCallingConvention, returnType, null);
}
-#endif
- public static SignatureHelper GetMethodSigHelper( Module mod, CallingConventions callingConvention, Type returnType)
+ public static SignatureHelper GetMethodSigHelper (Module mod, CallingConventions callingConvention, Type returnType)
{
return GetMethodSigHelper (mod, callingConvention, (CallingConvention)0, returnType, null);
}
- public static SignatureHelper GetMethodSigHelper( Module mod, CallingConvention unmanagedCallingConvention, Type returnType)
+ public static SignatureHelper GetMethodSigHelper (Module mod, CallingConvention unmanagedCallConv, Type returnType)
{
- return GetMethodSigHelper (mod, CallingConventions.Standard, unmanagedCallingConvention, returnType, null);
+ return GetMethodSigHelper (mod, CallingConventions.Standard, unmanagedCallConv, returnType, null);
}
- public static SignatureHelper GetMethodSigHelper( Module mod, Type returnType, Type[] parameterTypes)
+ public static SignatureHelper GetMethodSigHelper (Module mod, Type returnType, Type[] parameterTypes)
{
- return GetMethodSigHelper (mod, CallingConventions.Standard,
- (CallingConvention)0, returnType,
- parameterTypes);
+ return GetMethodSigHelper (mod, CallingConventions.Standard, (CallingConvention)0, returnType, parameterTypes);
+ }
+
+ [MonoTODO("Not implemented")]
+ public static SignatureHelper GetPropertySigHelper (Module mod, Type returnType, Type[] parameterTypes)
+ {
+ throw new NotImplementedException ();
}
+
[MonoTODO("Not implemented")]
- public static SignatureHelper GetPropertySigHelper( Module mod, Type returnType, Type[] parameterTypes)
+ public static SignatureHelper GetPropertySigHelper (Module mod, Type returnType,
+ Type [] requiredReturnTypeCustomModifiers,
+ Type [] optionalReturnTypeCustomModifiers,
+ Type [] parameterTypes,
+ Type [] [] requiredParameterTypeCustomModifiers,
+ Type [] [] optionalParameterTypeCustomModifiers)
+ {
+ throw new NotImplementedException ();
+ }
+
+ [MonoTODO("Not implemented")]
+ public static SignatureHelper GetPropertySigHelper (Module mod,
+ CallingConventions callingConvention,
+ Type returnType,
+ Type [] requiredReturnTypeCustomModifiers,
+ Type [] optionalReturnTypeCustomModifiers,
+ Type [] parameterTypes,
+ Type [] [] requiredParameterTypeCustomModifiers,
+ Type [] [] optionalParameterTypeCustomModifiers)
{
throw new NotImplementedException ();
}
}
}
-#if NET_2_0
//
// Appends the given type array @t into the @array passed at
// position @pos. If there is no array, it gets created
array = new_a;
}
- static void ValidateParameterModifiers(string name, Type [] parameter_modifiers)
+ static void ValidateParameterModifiers (string name, Type [] parameter_modifiers)
{
foreach (Type modifier in parameter_modifiers){
if (modifier == null)
AppendArrayAt (ref modopts, optionalCustomModifiers, p);
}
- [MonoTODO("Not implemented")]
- public static SignatureHelper GetPropertySigHelper (Module mod, Type returnType,
- Type [] requiredReturnTypeCustomModifiers,
- Type [] optionalReturnTypeCustomModifiers,
- Type [] parameterTypes,
- Type [] [] requiredParameterTypeCustomModifiers,
- Type [] [] optionalParameterTypeCustomModifiers)
- {
- throw new NotImplementedException ();
- }
-#endif
-
public void AddArgument (Type clsArgument)
{
if (clsArgument == null)
- throw new ArgumentNullException ("argument");
+ throw new ArgumentNullException ("clsArgument");
AppendArray (ref arguments, clsArgument);
}
throw new NotImplementedException ();
}
- [MonoTODO("Not implemented")]
+ static bool CompareOK (Type [][] one, Type [][] two)
+ {
+ if (one == null){
+ if (two == null)
+ return true;
+ return false;
+ } else if (two == null)
+ return false;
+
+ if (one.Length != two.Length)
+ return false;
+
+ for (int i = 0; i < one.Length; i++){
+ Type [] tone = one [i];
+ Type [] ttwo = two [i];
+
+ if (tone == null){
+ if (ttwo == null)
+ continue;
+ } else if (ttwo == null)
+ return false;
+
+ if (tone.Length != ttwo.Length)
+ return false;
+
+ for (int j = 0; j < tone.Length; j++){
+ Type uone = tone [j];
+ Type utwo = ttwo [j];
+
+ if (uone == null){
+ if (utwo == null)
+ continue;
+ return false;
+ } else if (utwo == null)
+ return false;
+
+ if (!uone.Equals (utwo))
+ return false;
+ }
+ }
+ return true;
+ }
+
public override bool Equals (object obj)
{
- throw new NotImplementedException ();
+ SignatureHelper other = obj as SignatureHelper;
+ if (other == null)
+ return false;
+
+ if (other.module != module ||
+ other.returnType != returnType ||
+ other.callConv != callConv ||
+ other.unmanagedCallConv != unmanagedCallConv)
+ return false;
+
+ if (arguments != null){
+ if (other.arguments == null)
+ return false;
+ if (arguments.Length != other.arguments.Length)
+ return false;
+
+ for (int i = 0; i < arguments.Length; i++)
+ if (!other.arguments [i].Equals (arguments [i]))
+ return false;
+ } else if (other.arguments != null)
+ return false;
+
+ return CompareOK (other.modreqs, modreqs) && CompareOK (other.modopts, modopts);
}
- [MonoTODO("Not implemented")]
public override int GetHashCode ()
{
- throw new NotImplementedException ();
+ // Lame, but easy, and will work, and chances are
+ // you will only need a few of these.
+ return 0;
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
return "SignatureHelper";
}
- internal static SignatureHelper GetMethodSigHelper( Module mod, CallingConventions callConv, CallingConvention unmanagedCallConv, Type returnType,
+ internal static SignatureHelper GetMethodSigHelper (Module mod, CallingConventions callingConvention, CallingConvention unmanagedCallingConvention, Type returnType,
Type [] parameters)
{
if (mod != null && !(mod is ModuleBuilder))
throw new ArgumentException ("ModuleBuilder is expected");
+ if (returnType == null)
+ returnType = typeof (void);
+
+ if (returnType.IsUserType)
+ throw new NotSupportedException ("User defined subclasses of System.Type are not yet supported.");
+ if (parameters != null) {
+ for (int i = 0; i < parameters.Length; ++i)
+ if (parameters [i].IsUserType)
+ throw new NotSupportedException ("User defined subclasses of System.Type are not yet supported.");
+
+ }
+
SignatureHelper helper =
new SignatureHelper ((ModuleBuilder)mod, SignatureHelperType.HELPER_METHOD);
helper.returnType = returnType;
- helper.callConv = callConv;
- helper.unmanagedCallConv = unmanagedCallConv;
+ helper.callConv = callingConvention;
+ helper.unmanagedCallConv = unmanagedCallingConvention;
if (parameters != null) {
helper.arguments = new Type [parameters.Length];
return helper;
}
- void _SignatureHelper.GetIDsOfNames([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
+ void _SignatureHelper.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
{
throw new NotImplementedException ();
}
}
}
}
-
+#endif