2008-03-03 10:05:19 +03:00
|
|
|
|
/*
|
|
|
|
|
Copyright (C) 2008 Jeroen Frijters
|
|
|
|
|
|
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
|
|
|
warranty. In no event will the authors be held liable for any damages
|
|
|
|
|
arising from the use of this software.
|
|
|
|
|
|
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
|
|
|
including commercial applications, and to alter it and redistribute it
|
|
|
|
|
freely, subject to the following restrictions:
|
|
|
|
|
|
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
|
|
|
claim that you wrote the original software. If you use this software
|
|
|
|
|
in a product, an acknowledgment in the product documentation would be
|
|
|
|
|
appreciated but is not required.
|
|
|
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
|
misrepresented as being the original software.
|
|
|
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
|
|
|
|
|
|
|
|
Jeroen Frijters
|
|
|
|
|
jeroen@frijters.net
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
2010-01-25 10:52:27 +03:00
|
|
|
|
using IKVM.Reflection;
|
2008-11-14 11:42:07 +03:00
|
|
|
|
using IKVM.Reflection.Emit;
|
2010-01-25 10:52:27 +03:00
|
|
|
|
using Type = IKVM.Reflection.Type;
|
2008-03-03 10:05:19 +03:00
|
|
|
|
|
|
|
|
|
namespace IKVM.Internal
|
|
|
|
|
{
|
|
|
|
|
static class FakeTypes
|
|
|
|
|
{
|
|
|
|
|
private static Type genericEnumEnumType;
|
|
|
|
|
private static Type genericDelegateInterfaceType;
|
|
|
|
|
private static Type genericAttributeAnnotationType;
|
|
|
|
|
private static Type genericAttributeAnnotationMultipleType;
|
|
|
|
|
private static Type genericAttributeAnnotationReturnValueType;
|
|
|
|
|
|
|
|
|
|
internal static Type GetEnumType(Type enumType)
|
|
|
|
|
{
|
|
|
|
|
return genericEnumEnumType.MakeGenericType(enumType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static Type GetDelegateType(Type delegateType)
|
|
|
|
|
{
|
|
|
|
|
return genericDelegateInterfaceType.MakeGenericType(delegateType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static Type GetAttributeType(Type attributeType)
|
|
|
|
|
{
|
|
|
|
|
return genericAttributeAnnotationType.MakeGenericType(attributeType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static Type GetAttributeMultipleType(Type attributeType)
|
|
|
|
|
{
|
|
|
|
|
return genericAttributeAnnotationMultipleType.MakeGenericType(attributeType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static Type GetAttributeReturnValueType(Type attributeType)
|
|
|
|
|
{
|
|
|
|
|
return genericAttributeAnnotationReturnValueType.MakeGenericType(attributeType);
|
|
|
|
|
}
|
|
|
|
|
|
2008-11-18 08:32:15 +03:00
|
|
|
|
internal static void Create(ModuleBuilder modb, ClassLoaderWrapper loader)
|
2008-03-03 10:05:19 +03:00
|
|
|
|
{
|
|
|
|
|
TypeBuilder tb = modb.DefineType(DotNetTypeWrapper.GenericDelegateInterfaceTypeName, TypeAttributes.Interface | TypeAttributes.Abstract | TypeAttributes.Public);
|
2009-10-14 18:58:41 +04:00
|
|
|
|
tb.DefineGenericParameters("T")[0].SetBaseTypeConstraint(Types.MulticastDelegate);
|
2008-03-03 10:05:19 +03:00
|
|
|
|
genericDelegateInterfaceType = tb.CreateType();
|
2008-04-21 08:33:22 +04:00
|
|
|
|
|
2011-12-14 12:26:39 +04:00
|
|
|
|
genericAttributeAnnotationType = CreateAnnotationType(modb, DotNetTypeWrapper.GenericAttributeAnnotationTypeName);
|
|
|
|
|
genericAttributeAnnotationMultipleType = CreateAnnotationType(modb, DotNetTypeWrapper.GenericAttributeAnnotationMultipleTypeName);
|
|
|
|
|
genericAttributeAnnotationReturnValueType = CreateAnnotationType(modb, DotNetTypeWrapper.GenericAttributeAnnotationReturnValueTypeName);
|
2009-07-29 13:36:56 +04:00
|
|
|
|
CreateEnumEnum(modb, loader);
|
2008-03-03 10:05:19 +03:00
|
|
|
|
}
|
|
|
|
|
|
2011-12-14 13:04:57 +04:00
|
|
|
|
internal static void Finish(ClassLoaderWrapper loader)
|
2008-03-03 10:05:19 +03:00
|
|
|
|
{
|
2011-12-14 13:04:57 +04:00
|
|
|
|
TypeBuilder tb = (TypeBuilder)genericEnumEnumType;
|
2008-03-03 10:05:19 +03:00
|
|
|
|
TypeWrapper enumTypeWrapper = loader.LoadClassByDottedName("java.lang.Enum");
|
|
|
|
|
enumTypeWrapper.Finish();
|
2011-12-14 13:04:57 +04:00
|
|
|
|
tb.SetParent(enumTypeWrapper.TypeAsBaseType);
|
2009-10-14 18:58:41 +04:00
|
|
|
|
CodeEmitter ilgen = CodeEmitter.Create(tb.DefineConstructor(MethodAttributes.Private, CallingConventions.Standard, new Type[] { Types.String, Types.Int32 }));
|
2008-03-03 10:05:19 +03:00
|
|
|
|
ilgen.Emit(OpCodes.Ldarg_0);
|
|
|
|
|
ilgen.Emit(OpCodes.Ldarg_1);
|
|
|
|
|
ilgen.Emit(OpCodes.Ldarg_2);
|
|
|
|
|
enumTypeWrapper.GetMethodWrapper("<init>", "(Ljava.lang.String;I)V", false).EmitCall(ilgen);
|
|
|
|
|
ilgen.Emit(OpCodes.Ret);
|
2010-09-30 08:03:32 +04:00
|
|
|
|
ilgen.DoEmit();
|
2008-03-03 10:05:19 +03:00
|
|
|
|
genericEnumEnumType = tb.CreateType();
|
|
|
|
|
}
|
|
|
|
|
|
2011-12-14 13:04:57 +04:00
|
|
|
|
private static void CreateEnumEnum(ModuleBuilder modb, ClassLoaderWrapper loader)
|
|
|
|
|
{
|
|
|
|
|
TypeBuilder tb = modb.DefineType(DotNetTypeWrapper.GenericEnumEnumTypeName, TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.Public);
|
|
|
|
|
GenericTypeParameterBuilder gtpb = tb.DefineGenericParameters("T")[0];
|
|
|
|
|
gtpb.SetBaseTypeConstraint(Types.Enum);
|
|
|
|
|
genericEnumEnumType = tb;
|
|
|
|
|
}
|
|
|
|
|
|
2011-12-14 12:26:39 +04:00
|
|
|
|
private static Type CreateAnnotationType(ModuleBuilder modb, string name)
|
2008-03-03 10:05:19 +03:00
|
|
|
|
{
|
|
|
|
|
TypeBuilder tb = modb.DefineType(name, TypeAttributes.Interface | TypeAttributes.Abstract | TypeAttributes.Public);
|
2009-10-14 18:58:41 +04:00
|
|
|
|
tb.DefineGenericParameters("T")[0].SetBaseTypeConstraint(Types.Attribute);
|
2008-03-03 10:05:19 +03:00
|
|
|
|
return tb.CreateType();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal static void Load(Assembly assembly)
|
|
|
|
|
{
|
|
|
|
|
genericEnumEnumType = assembly.GetType(DotNetTypeWrapper.GenericEnumEnumTypeName);
|
|
|
|
|
genericDelegateInterfaceType = assembly.GetType(DotNetTypeWrapper.GenericDelegateInterfaceTypeName);
|
|
|
|
|
genericAttributeAnnotationType = assembly.GetType(DotNetTypeWrapper.GenericAttributeAnnotationTypeName);
|
|
|
|
|
genericAttributeAnnotationMultipleType = assembly.GetType(DotNetTypeWrapper.GenericAttributeAnnotationMultipleTypeName);
|
|
|
|
|
genericAttributeAnnotationReturnValueType = assembly.GetType(DotNetTypeWrapper.GenericAttributeAnnotationReturnValueTypeName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|