Skip to content

Commit 871d5b9

Browse files
committed
Type name can now be set when converting WASM to DLL. Removed some excess types from the generated DLL.
1 parent 85f1cda commit 871d5b9

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

WebAssembly.Tests/ApiQualityTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,16 @@ static IEnumerable<string> GatherViolations()
9797

9898
Assert.AreEqual("", string.Join(", ", GatherViolations()), "Instruction intermediate types can only have internal constructors.");
9999
}
100+
101+
#if NET9_0_OR_GREATER
102+
/// <summary>
103+
/// Ensures that there's no collision between the default value of <see cref="Runtime.CompilerConfiguration.TypeName"/> and any compiled type.
104+
/// </summary>
105+
[TestMethod]
106+
public void NoTypeMatchingCompilerConfigurationDefaultNameExists()
107+
{
108+
var defaultTypeName = new Runtime.CompilerConfiguration().TypeName;
109+
Assert.IsNull(typeof(Module).Assembly.GetType(defaultTypeName));
110+
}
111+
#endif
100112
}

WebAssembly/Runtime/Compile.cs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -238,14 +238,7 @@ CompilerConfiguration configuration
238238

239239
var module = assembly.DefineDynamicModule("CompiledWebAssembly");
240240

241-
var importBuilder = module.DefineType("Imports");
242-
var instanceContainer = typeof(Instance<>).MakeGenericType(importBuilder);
243-
var exportContainer = module.DefineType("Exports");
244-
245-
FromBinary(assembly, reader, configuration, instanceContainer, exportContainer, module, importBuilder);
246-
247-
importBuilder.CreateType();
248-
exportContainer.CreateType();
241+
FromBinary(assembly, reader, configuration, null, null, module, null);
249242

250243
return assembly;
251244
}
@@ -280,8 +273,8 @@ private static ConstructorInfo FromBinary(
280273
AssemblyBuilder assembly,
281274
Reader reader,
282275
CompilerConfiguration configuration,
283-
Type instanceContainer,
284-
Type exportContainer,
276+
Type? instanceContainer,
277+
Type? exportContainer,
285278
ModuleBuilder module,
286279
TypeBuilder? importBuilder = null
287280
)
@@ -310,7 +303,14 @@ private static ConstructorInfo FromBinary(
310303
var previousSection = Section.None;
311304

312305
var context = new CompilationContext(configuration);
313-
var exportsBuilder = context.CheckedExportsBuilder = module.DefineType("CompiledExports", ClassAttributes, exportContainer);
306+
var exportsBuilder = context.CheckedExportsBuilder = module.DefineType(
307+
#if NET9_0_OR_GREATER
308+
configuration.TypeName,
309+
#else
310+
"CompiledExports",
311+
#endif
312+
ClassAttributes,
313+
exportContainer);
314314
MethodBuilder? importedMemoryProvider = null;
315315
FieldBuilder? memory = null;
316316

@@ -329,7 +329,7 @@ private static ConstructorInfo FromBinary(
329329
}
330330
else
331331
{
332-
var usableConstructor = exportContainer.GetTypeInfo().DeclaredConstructors.FirstOrDefault(c => c.GetParameters().Length == 0);
332+
var usableConstructor = exportContainer?.GetTypeInfo().DeclaredConstructors.FirstOrDefault(c => c.GetParameters().Length == 0);
333333
if (usableConstructor != null)
334334
{
335335
instanceConstructorIL.Emit(OpCodes.Ldarg_0);
@@ -633,6 +633,9 @@ private static ConstructorInfo FromBinary(
633633
instanceConstructorIL.Emit(OpCodes.Ret); //Finish the constructor.
634634
var exportInfo = exportsBuilder.CreateTypeInfo();
635635

636+
if (importBuilder is null && instanceContainer is null)
637+
return exportInfo.DeclaredConstructors.First();
638+
636639
TypeInfo instance;
637640
{
638641
var instanceBuilder = module.DefineType("CompiledInstance", ClassAttributes, instanceContainer);
@@ -660,7 +663,7 @@ private static ConstructorInfo FromBinary(
660663

661664
importConstructor = importConstructorBuilder;
662665
}
663-
else
666+
else if (instanceContainer is not null)
664667
{
665668
importConstructor = instanceContainer
666669
.GetTypeInfo()
@@ -670,6 +673,10 @@ private static ConstructorInfo FromBinary(
670673
?.ParameterType == exportContainer
671674
);
672675
}
676+
else
677+
{
678+
return exportInfo.DeclaredConstructors.First();
679+
}
673680

674681
il.Emit(OpCodes.Call, importConstructor);
675682
il.Emit(OpCodes.Ret);

WebAssembly/Runtime/CompilerConfiguration.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,24 @@ public CompilerConfiguration()
1515
{
1616
}
1717

18+
#if NET9_0_OR_GREATER
19+
private string typeName = "WebAssembly.CompiledFromWasm";
20+
21+
/// <summary>
22+
/// Gets or sets the name of the type that hosts the compiled code.
23+
/// Defaults to "WebAssembly.CompiledFromWasm".
24+
/// </summary>
25+
public string TypeName
26+
{
27+
get => typeName;
28+
set
29+
{
30+
ArgumentNullException.ThrowIfNull(value);
31+
typeName = value;
32+
}
33+
}
34+
#endif
35+
1836
[DebuggerBrowsable(DebuggerBrowsableState.Never)] //Wrapped by a property
1937
private GetDelegateForTypeCallback getDelegateForType = GetStandardDelegateForType;
2038

0 commit comments

Comments
 (0)