Skip to content

Commit ad8031c

Browse files
buyaa-nsteveharterdanmoseleyjkotas
authored
Initial step for adding AssemblyBuilder.Save implementation (#83554)
* Initial import AB.Save * Move code from S.R.Metadata to S.R.Emit * Add additional proj refs for VS * Add resources strings * Namespace, name updates * Update names * Merge some of the test comparisons * Update test with meaningful name and other small changes --------- Co-authored-by: Steve Harter <[email protected]> Co-authored-by: Dan Moseley <[email protected]> Co-authored-by: Jan Kotas <[email protected]>
1 parent b79adc5 commit ad8031c

26 files changed

+1663
-116
lines changed

src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeAssemblyBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,13 @@ internal static RuntimeAssemblyBuilder InternalDefineDynamicAssembly(
183183
/// modules within an Assembly with the same name. This dynamic module is
184184
/// a transient module.
185185
/// </summary>
186-
protected override ModuleBuilder DefineDynamicModuleCore(string _)
186+
protected override ModuleBuilder DefineDynamicModuleCore(string name)
187187
{
188+
if (name[0] == '\0')
189+
{
190+
throw new ArgumentException(SR.Argument_InvalidName, nameof(name));
191+
}
192+
188193
lock (SyncRoot)
189194
{
190195
// Create the dynamic module- only one ModuleBuilder per AssemblyBuilder can be created.

src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeFieldBuilder.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,9 @@ internal sealed class RuntimeFieldBuilder : FieldBuilder
2020
internal RuntimeFieldBuilder(RuntimeTypeBuilder typeBuilder, string fieldName, Type type,
2121
Type[]? requiredCustomModifiers, Type[]? optionalCustomModifiers, FieldAttributes attributes)
2222
{
23-
ArgumentException.ThrowIfNullOrEmpty(fieldName);
24-
2523
if (fieldName[0] == '\0')
2624
throw new ArgumentException(SR.Argument_IllegalName, nameof(fieldName));
2725

28-
ArgumentNullException.ThrowIfNull(type);
29-
3026
if (type == typeof(void))
3127
throw new ArgumentException(SR.Argument_BadFieldType);
3228

src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeTypeBuilder.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -472,24 +472,22 @@ private RuntimeTypeBuilder(string szName, int genParamPos, RuntimeTypeBuilder de
472472
}
473473

474474
internal RuntimeTypeBuilder(
475-
string fullname, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces, RuntimeModuleBuilder module,
475+
string name, TypeAttributes attr, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces, RuntimeModuleBuilder module,
476476
PackingSize iPackingSize, int iTypeSize, RuntimeTypeBuilder? enclosingType)
477477
{
478-
ArgumentException.ThrowIfNullOrEmpty(fullname);
478+
if (name[0] == '\0')
479+
throw new ArgumentException(SR.Argument_IllegalName, nameof(name));
479480

480-
if (fullname[0] == '\0')
481-
throw new ArgumentException(SR.Argument_IllegalName, nameof(fullname));
482-
483-
if (fullname.Length > 1023)
484-
throw new ArgumentException(SR.Argument_TypeNameTooLong, nameof(fullname));
481+
if (name.Length > 1023)
482+
throw new ArgumentException(SR.Argument_TypeNameTooLong, nameof(name));
485483

486484
int i;
487485
m_module = module;
488486
m_DeclaringType = enclosingType;
489487
RuntimeAssemblyBuilder containingAssem = m_module.ContainingAssemblyBuilder;
490488

491489
// cannot have two types within the same assembly of the same name
492-
containingAssem.CheckTypeNameConflict(fullname, enclosingType);
490+
containingAssem.CheckTypeNameConflict(name, enclosingType);
493491

494492
if (enclosingType != null)
495493
{
@@ -514,18 +512,18 @@ internal RuntimeTypeBuilder(
514512
}
515513
}
516514

517-
int iLast = fullname.LastIndexOf('.');
515+
int iLast = name.LastIndexOf('.');
518516
if (iLast <= 0)
519517
{
520518
// no name space
521519
m_strNameSpace = string.Empty;
522-
m_strName = fullname;
520+
m_strName = name;
523521
}
524522
else
525523
{
526524
// split the name space
527-
m_strNameSpace = fullname.Substring(0, iLast);
528-
m_strName = fullname.Substring(iLast + 1);
525+
m_strNameSpace = name.Substring(0, iLast);
526+
m_strName = name.Substring(iLast + 1);
529527
}
530528

531529
VerifyTypeAttributes(attr);
@@ -550,7 +548,7 @@ internal RuntimeTypeBuilder(
550548
}
551549

552550
m_tdType = DefineType(new QCallModule(ref module),
553-
fullname, tkParent, m_iAttr, tkEnclosingType, interfaceTokens!);
551+
name, tkParent, m_iAttr, tkEnclosingType, interfaceTokens!);
554552

555553
m_iPackingSize = iPackingSize;
556554
m_iTypeSize = iTypeSize;
@@ -1558,6 +1556,11 @@ protected override PropertyBuilder DefinePropertyCore(string name, PropertyAttri
15581556

15591557
protected override EventBuilder DefineEventCore(string name, EventAttributes attributes, Type eventtype)
15601558
{
1559+
if (name[0] == '\0')
1560+
{
1561+
throw new ArgumentException(SR.Argument_IllegalName, nameof(name));
1562+
}
1563+
15611564
lock (SyncRoot)
15621565
{
15631566
int tkType;

src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@ public ModuleBuilder DefineDynamicModule(string name)
1717
{
1818
ArgumentException.ThrowIfNullOrEmpty(name);
1919

20-
if (name[0] == '\0')
21-
{
22-
throw new ArgumentException(SR.Argument_InvalidName, nameof(name));
23-
}
24-
2520
return DefineDynamicModuleCore(name);
2621
}
2722

src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ public void CreateGlobalFunctions()
1818
protected abstract void CreateGlobalFunctionsCore();
1919

2020
public EnumBuilder DefineEnum(string name, TypeAttributes visibility, Type underlyingType)
21-
=> DefineEnumCore(name, visibility, underlyingType);
21+
{
22+
ArgumentException.ThrowIfNullOrEmpty(name);
23+
24+
return DefineEnumCore(name, visibility, underlyingType);
25+
}
2226

2327
protected abstract EnumBuilder DefineEnumCore(string name, TypeAttributes visibility, Type underlyingType);
2428

@@ -80,7 +84,11 @@ public TypeBuilder DefineType(string name, TypeAttributes attr,
8084

8185
public TypeBuilder DefineType(string name, TypeAttributes attr,
8286
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces)
83-
=> DefineTypeCore(name, attr, parent, interfaces, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize);
87+
{
88+
ArgumentException.ThrowIfNullOrEmpty(name);
89+
90+
return DefineTypeCore(name, attr, parent, interfaces, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize);
91+
}
8492

8593
public TypeBuilder DefineType(string name, TypeAttributes attr,
8694
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, int typesize)
@@ -92,7 +100,11 @@ public TypeBuilder DefineType(string name, TypeAttributes attr,
92100

93101
public TypeBuilder DefineType(string name, TypeAttributes attr,
94102
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, PackingSize packingSize, int typesize)
95-
=> DefineTypeCore(name, attr, parent, null, packingSize, typesize);
103+
{
104+
ArgumentException.ThrowIfNullOrEmpty(name);
105+
106+
return DefineTypeCore(name, attr, parent, null, packingSize, typesize);
107+
}
96108

97109
protected abstract TypeBuilder DefineTypeCore(string name, TypeAttributes attr,
98110
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces, PackingSize packingSize, int typesize);

src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,6 @@ public EventBuilder DefineEvent(string name, EventAttributes attributes, Type ev
6363
{
6464
ArgumentException.ThrowIfNullOrEmpty(name);
6565

66-
if (name[0] == '\0')
67-
throw new ArgumentException(SR.Argument_IllegalName, nameof(name));
68-
6966
return DefineEventCore(name, attributes, eventtype);
7067
}
7168

@@ -76,7 +73,12 @@ public FieldBuilder DefineField(string fieldName, Type type, FieldAttributes att
7673

7774
public FieldBuilder DefineField(string fieldName, Type type, Type[]? requiredCustomModifiers, Type[]? optionalCustomModifiers,
7875
FieldAttributes attributes)
79-
=> DefineFieldCore(fieldName, type, requiredCustomModifiers, optionalCustomModifiers, attributes);
76+
{
77+
ArgumentException.ThrowIfNullOrEmpty(fieldName);
78+
ArgumentNullException.ThrowIfNull(type);
79+
80+
return DefineFieldCore(fieldName, type, requiredCustomModifiers, optionalCustomModifiers, attributes);
81+
}
8082

8183
protected abstract FieldBuilder DefineFieldCore(string fieldName, Type type, Type[]? requiredCustomModifiers, Type[]? optionalCustomModifiers,
8284
FieldAttributes attributes);
@@ -159,7 +161,11 @@ public TypeBuilder DefineNestedType(string name, TypeAttributes attr,
159161

160162
public TypeBuilder DefineNestedType(string name, TypeAttributes attr,
161163
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces)
162-
=> DefineNestedTypeCore(name, attr, parent, interfaces, PackingSize.Unspecified, UnspecifiedTypeSize);
164+
{
165+
ArgumentException.ThrowIfNullOrEmpty(name);
166+
167+
return DefineNestedTypeCore(name, attr, parent, interfaces, PackingSize.Unspecified, UnspecifiedTypeSize);
168+
}
163169

164170
protected abstract TypeBuilder DefineNestedTypeCore(string name, TypeAttributes attr,
165171
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, Type[]? interfaces, PackingSize packSize, int typeSize);
@@ -174,7 +180,11 @@ public TypeBuilder DefineNestedType(string name, TypeAttributes attr,
174180

175181
public TypeBuilder DefineNestedType(string name, TypeAttributes attr,
176182
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? parent, PackingSize packSize, int typeSize)
177-
=> DefineNestedTypeCore(name, attr, parent, null, packSize, typeSize);
183+
{
184+
ArgumentException.ThrowIfNullOrEmpty(name);
185+
186+
return DefineNestedTypeCore(name, attr, parent, null, packSize, typeSize);
187+
}
178188

179189
[RequiresUnreferencedCode("P/Invoke marshalling may dynamically access members that could be trimmed.")]
180190
public MethodBuilder DefinePInvokeMethod(string name, string dllName, MethodAttributes attributes,

0 commit comments

Comments
 (0)