Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make TypeBuilder.CreateType return non nullable #72180

Merged
merged 16 commits into from
Jul 26, 2022
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ public FieldBuilder DefineLiteral(string literalName, object? literalValue)
}

[return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)]
public TypeInfo? CreateTypeInfo()
public TypeInfo CreateTypeInfo()
{
return m_typeBuilder.CreateTypeInfo();
}

jkotas marked this conversation as resolved.
Show resolved Hide resolved
// CreateType cause EnumBuilder to be baked.
[return: DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.All)]
public Type? CreateType()
public Type CreateType()
{
return m_typeBuilder.CreateType();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ private void CreateGlobalFunctionsNoLock()
// cannot create globals twice
throw new InvalidOperationException(SR.InvalidOperation_NotADebugModule);
}
_globalTypeBuilder.CreateType();
_globalTypeBuilder.CreateTypeInfoImpl();
_hasGlobalBeenCreated = true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1677,16 +1677,23 @@ private EventBuilder DefineEventNoLock(string name, EventAttributes attributes,
#region Create Type

[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
public TypeInfo? CreateTypeInfo()
public TypeInfo CreateTypeInfo()
{
lock (SyncRoot)
{
return CreateTypeNoLock();
}
TypeInfo? typeInfo = CreateTypeInfoImpl();
Debug.Assert(typeInfo != null);
return typeInfo;
}
jkotas marked this conversation as resolved.
Show resolved Hide resolved

[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
public Type CreateType()
{
Type? type = CreateTypeInfoImpl();
Debug.Assert(type != null);
return type;
}

[return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
public Type? CreateType()
internal TypeInfo? CreateTypeInfoImpl()
jkotas marked this conversation as resolved.
Show resolved Hide resolved
{
lock (SyncRoot)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public static ConstructorInfo AddToModule(ModuleBuilder mb)
attributeTypeBuilder.SetCustomAttribute(customAttributeBuilder);

// Make the TypeInfo real so the constructor can be used.
return attributeTypeBuilder.CreateTypeInfo()!.DeclaredConstructors.Single();
return attributeTypeBuilder.CreateTypeInfo().DeclaredConstructors.Single();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ private static Type MakeNewCustomDelegate(Type[] types)
TypeBuilder builder = AssemblyGen.DefineDelegateType("Delegate" + types.Length);
builder.DefineConstructor(ctorAttributes, CallingConventions.Standard, delegateCtorSignature).SetImplementationFlags(implAttributes);
builder.DefineMethod("Invoke", invokeAttributes, returnType, parameters).SetImplementationFlags(implAttributes);
return builder.CreateTypeInfo()!;
return builder.CreateTypeInfo();
}
else
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ internal string GenerateBaseSerializer(string baseSerializer, string readerClass

baseSerializerTypeBuilder.DefineDefaultConstructor(
MethodAttributes.Family | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName);
Type baseSerializerType = baseSerializerTypeBuilder.CreateTypeInfo()!.AsType();
Type baseSerializerType = baseSerializerTypeBuilder.CreateType();
CreatedTypes.Add(baseSerializerType.Name, baseSerializerType);

return baseSerializer;
Expand Down Expand Up @@ -396,7 +396,7 @@ internal string GenerateTypedSerializer(string readMethod, string writeMethod, X
ilg.EndMethod();
}
typedSerializerTypeBuilder.DefineDefaultConstructor(CodeGenerator.PublicMethodAttributes);
Type typedSerializerType = typedSerializerTypeBuilder.CreateTypeInfo()!.AsType();
Type typedSerializerType = typedSerializerTypeBuilder.CreateType();
CreatedTypes.Add(typedSerializerType.Name, typedSerializerType);

return typedSerializerType.Name;
Expand Down Expand Up @@ -558,7 +558,7 @@ internal void GenerateSerializerContract(string className, XmlMapping[] xmlMappi
ilg.Call(baseCtor);
ilg.EndMethod();
// Instantiate type
Type serializerContractType = serializerContractTypeBuilder.CreateTypeInfo()!.AsType();
Type serializerContractType = serializerContractTypeBuilder.CreateType();
CreatedTypes.Add(serializerContractType.Name, serializerContractType);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ internal void GenerateEnd(string[] methods, XmlMapping[] xmlMappings, Type[] typ

this.typeBuilder.DefineDefaultConstructor(
CodeGenerator.PublicMethodAttributes);
Type readerType = this.typeBuilder.CreateTypeInfo()!.AsType();
Type readerType = this.typeBuilder.CreateType();
CreatedTypes.Add(readerType.Name, readerType);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ internal Type GenerateEnd()
GenerateInitCallbacksMethod();
this.typeBuilder.DefineDefaultConstructor(
CodeGenerator.PublicMethodAttributes);
return this.typeBuilder.CreateTypeInfo()!.AsType();
return this.typeBuilder.CreateType();
}

[RequiresUnreferencedCode("calls GenerateTypeElement")]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ public void BakeMethods()

if (!_useLRE)
{
typBaked = _typeBldr!.CreateTypeInfo()!.AsType();
typBaked = _typeBldr!.CreateType();

// Replace all MethodInfos in this.methods
methodsBaked = new Hashtable(_methods.Count);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ private void Complete()
internal GeneratedTypeInfo CreateType()
{
this.Complete();
return new GeneratedTypeInfo(_tb.CreateType()!, _methodInfos.ToArray());
return new GeneratedTypeInfo(_tb.CreateType(), _methodInfos.ToArray());
}

internal void AddInterfaceImpl([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type iface)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ public static IEnumerable<object[]> Ctor_RefEmitParameters_TestData()
setMethodGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetSetMethod(setMethod);

Type createdType = typeBuilder.CreateTypeInfo().AsType();
Type createdType = typeBuilder.CreateType();

// ConstructorBuilder, PropertyInfo, FieldInfo
yield return new object[]
Expand Down Expand Up @@ -555,7 +555,7 @@ public static void ConstructorHasNonStandardCallingConvention_ThrowsArgumentExce
ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, callingConvention, new Type[0]);
constructorBuilder.GetILGenerator().Emit(OpCodes.Ret);

ConstructorInfo con = typeBuilder.CreateTypeInfo().AsType().GetConstructor(new Type[0]);
ConstructorInfo con = typeBuilder.CreateType().GetConstructor(new Type[0]);

AssertExtensions.Throws<ArgumentException>(null, () => new CustomAttributeBuilder(con, new object[0]));
AssertExtensions.Throws<ArgumentException>(null, () => new CustomAttributeBuilder(con, new object[0], new FieldInfo[0], new object[0]));
Expand Down Expand Up @@ -1068,7 +1068,7 @@ private static Type CreateEnum(Type underlyingType, params object[] literalValue
{
enumBuilder.DefineLiteral("Value" + i, literalValues[i]);
}
return enumBuilder.CreateTypeInfo().AsType();
return enumBuilder.CreateType();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public void PosTest1()
ilgen.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType1 = type.CreateTypeInfo().AsType();
Type createdType1 = type.CreateType();
MethodInfo createdMethod1 = createdType1.GetMethod("meth1");

TypeBuilder type2 = module.DefineType("C2", TypeAttributes.Public);
Expand All @@ -35,7 +35,7 @@ public void PosTest1()
ilgen2.Emit(OpCodes.Ret);

// Create the type whose method will be invoking the MethodInfo method
Type createdType2 = type2.CreateTypeInfo().AsType();
Type createdType2 = type2.CreateType();
MethodInfo createdMethod2 = createdType2.GetMethod("meth2");

// meth2 should invoke meth1 which should return value from meth1
Expand All @@ -56,7 +56,7 @@ public void PosTest2()
ilGenerator1.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType1 = type1.CreateTypeInfo().AsType();
Type createdType1 = type1.CreateType();
MethodInfo createdMethod1 = createdType1.GetMethod("meth1");

TypeBuilder type2 = module.DefineType("C2", TypeAttributes.Public);
Expand All @@ -69,7 +69,7 @@ public void PosTest2()
ilGenerator2.Emit(OpCodes.Ret);

// Create the type whose method will be invoking the MethodInfo method
Type createdType2 = type2.CreateTypeInfo().AsType();
Type createdType2 = type2.CreateType();
MethodInfo createdMethod2 = createdType2.GetMethod("meth2");

// meth2 should invoke meth1 which should return value 'methodRet'
Expand All @@ -93,7 +93,7 @@ public void PosTest3()
ilGenerator.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType1 = type1.CreateTypeInfo().AsType();
Type createdType1 = type1.CreateType();
MethodInfo createdMethod1 = createdType1.GetMethod("meth1");
MethodInfo genericMethod = createdMethod1.MakeGenericMethod(typeof(int));

Expand All @@ -107,7 +107,7 @@ public void PosTest3()
ilGenerator2.Emit(OpCodes.Ret);

// Create the type whose method will be invoking the MethodInfo method
Type createdType2 = type2.CreateTypeInfo().AsType();
Type createdType2 = type2.CreateType();
MethodInfo createdMethod2 = createdType2.GetMethod("meth2");

// meth2 should invoke meth1 which should return value 'methodRet'
Expand All @@ -131,7 +131,7 @@ public void PosTest4()
ilGenerator1.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType1 = type1.CreateTypeInfo().AsType();
Type createdType1 = type1.CreateType();
Type genericType = createdType1.MakeGenericType(typeof(int));
MethodInfo genericMethod = genericType.GetMethod("meth1");

Expand All @@ -145,7 +145,7 @@ public void PosTest4()
ilGenerator2.Emit(OpCodes.Ret);

// Create the type whose method will be invoking the MethodInfo method
Type createdType2 = type2.CreateTypeInfo().AsType();
Type createdType2 = type2.CreateType();
MethodInfo createdMethod2 = createdType2.GetMethod("meth2");

// meth2 should invoke meth1 which should return value 'methodRet'
Expand All @@ -170,7 +170,7 @@ public void PosTest5()
ilGenerator1.Emit(OpCodes.Ret);

// create the type where this method is in
Type createdType1 = type1.CreateTypeInfo().AsType();
Type createdType1 = type1.CreateType();
Type genericType = createdType1.MakeGenericType(typeof(int));
MethodInfo createdMethod1 = genericType.GetMethod("meth1");
MethodInfo genericMethod = createdMethod1.MakeGenericMethod(typeof(string));
Expand All @@ -185,7 +185,7 @@ public void PosTest5()
ilGenerator2.Emit(OpCodes.Ret);

// Create the type whose method will be invoking the MethodInfo method
Type createdType2 = type2.CreateTypeInfo().AsType();
Type createdType2 = type2.CreateType();
MethodInfo createdMethod2 = createdType2.GetMethod("meth2");

// meth2 should invoke meth1 which should return value 'methodRet'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void PosTest1()
ilGenerator.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
MethodInfo createdMethod = createdType.GetMethod("meth1");

Assert.True((bool)createdMethod.Invoke(null, null));
Expand All @@ -105,7 +105,7 @@ public void PosTest2()
ilGenerator.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = tb.CreateTypeInfo().AsType();
Type createdType = tb.CreateType();
MethodInfo createdMethod = createdType.GetMethod("meth1");

Assert.True((bool)createdMethod.Invoke(null, null));
Expand All @@ -126,7 +126,7 @@ public void PosTest3()
ilGenerator.Emit(OpCodes.Ret);

// create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
MethodInfo createdMethod = createdType.GetMethod("meth1");

Assert.True((bool)createdMethod.Invoke(null, null));
Expand Down Expand Up @@ -205,7 +205,7 @@ public void PosTest4()
ilGenerator.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
MethodInfo createdMethod = createdType.GetMethod("meth1");

Assert.True((bool)createdMethod.Invoke(null, null));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ static MethodInfo GetCode(int num)
ilg.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
MethodInfo createdMethod = createdType.GetMethod("meth1");

return createdMethod;
Expand Down Expand Up @@ -135,7 +135,7 @@ static MethodInfo GetCode(int num)
ilg.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
return createdType.GetMethod("meth1");
}
}
Expand Down Expand Up @@ -209,7 +209,7 @@ static MethodInfo GetCode(int num)
ilg.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
return createdType.GetMethod("meth1");
}
}
Expand Down Expand Up @@ -256,7 +256,7 @@ static MethodInfo GetCode()
ilg.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
return createdType.GetMethod("meth1");
}
}
Expand Down Expand Up @@ -297,7 +297,7 @@ static MethodInfo GetCode()
ilg.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
return createdType.GetMethod("meth1");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void EmitWriteLineTests()
ilGenerator1.Emit(OpCodes.Ret);

// Create the type where this method is in
Type createdType1 = type1.CreateTypeInfo().AsType();
Type createdType1 = type1.CreateType();
FieldInfo createdField = createdType1.GetField("field1");

TypeBuilder type2 = module.DefineType("C2", TypeAttributes.Public);
Expand All @@ -39,7 +39,7 @@ public void EmitWriteLineTests()
ilGenerator2.Emit(OpCodes.Ret);

// Create the type whose method will be invoking the MethodInfo method
Type createdType2 = type2.CreateTypeInfo().AsType();
Type createdType2 = type2.CreateType();
MethodInfo createdMethod = createdType2.GetMethod("meth2");

// meth2 should invoke meth1 which should return value from meth1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public void TestExceptionEmitCalls()
ilGenerator.Emit(OpCodes.Ldloc_S, tmp1);
ilGenerator.Emit(OpCodes.Ret);

Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
MethodInfo createdMethod = createdType.GetMethod("DoThrow");

Assert.Equal(-1, createdMethod.Invoke(null, new object[] { true })); // Throws
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void SetCustomAttribute_CustomAttributeBuilder()

CustomAttributeBuilder attribute = new CustomAttributeBuilder(constructor, new object[] { 4 }, new FieldInfo[] { field }, new object[] { "hello" });
parameter.SetCustomAttribute(attribute);
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
MethodInfo createdMethod = createdType.GetMethod("method1");
ParameterInfo createdParameter = createdMethod.GetParameters()[0];

Expand All @@ -46,7 +46,7 @@ public void SetCustomAttribute_ConstructorInfo_ByteArray()
ilGenerator.Emit(OpCodes.Ret);

parameter.SetCustomAttribute(typeof(ParameterBuilderCustomAttribute).GetConstructor(new Type[] { typeof(bool)}), new byte[] { 1, 0, 1, 0, 0});
Type createdType = type.CreateTypeInfo().AsType();
Type createdType = type.CreateType();
MethodInfo createdMethod = createdType.GetMethod("method1");
ParameterInfo createdParameter = createdMethod.GetParameters()[0];

Expand Down
Loading