Browse Source

Improved extension load pipeline

Krzysztof Krysiński 1 year ago
parent
commit
456c561ed6

+ 6 - 0
src/PixiEditor.Extensions.Wasm/ExtensionContext.cs

@@ -0,0 +1,6 @@
+namespace PixiEditor.Extensions.Wasm;
+
+public static class ExtensionContext
+{
+    public static WasmExtension Active { get; set; } = null!;
+}

+ 0 - 13
src/PixiEditor.Extensions.Wasm/ExtensionEvents.cs

@@ -1,13 +0,0 @@
-using System.Runtime.CompilerServices;
-
-namespace PixiEditor.Extensions.Wasm;
-
-public static class ExtensionEvents
-{
-    public static event Action OnInitialized;
-
-    internal static void Initialize()
-    {
-        OnInitialized?.Invoke();
-    }
-}

+ 18 - 2
src/PixiEditor.Extensions.Wasm/Interop.cs

@@ -1,4 +1,6 @@
-using System.Runtime.CompilerServices;
+using System.Diagnostics;
+using System.Reflection;
+using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 
 namespace PixiEditor.Extensions.Wasm;
@@ -11,8 +13,22 @@ internal class Interop
     [MethodImpl(MethodImplOptions.InternalCall)]
     internal static extern void CreatePopupWindow(string title, string body);
 
+    internal static void Load()
+    {
+        Type extensionType = Assembly.GetEntryAssembly().ExportedTypes
+            .FirstOrDefault(type => type.IsSubclassOf(typeof(WasmExtension)));
+
+        Debug.Assert(extensionType != null, "extensionType != null");
+
+        LogMessage($"Loading extension {extensionType.FullName}");
+
+        WasmExtension extension = (WasmExtension)Activator.CreateInstance(extensionType);
+        ExtensionContext.Active = extension;
+        extension.OnLoaded();
+    }
+
     internal static void Initialize()
     {
-        ExtensionEvents.Initialize();
+        ExtensionContext.Active.OnInitialized();
     }
 }

+ 1 - 1
src/PixiEditor.Extensions.Wasm/PixiEditor.Extensions.Wasm.csproj

@@ -3,7 +3,7 @@
     <PropertyGroup>
         <TargetFramework>net8.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
-        <Nullable>enable</Nullable>
+        <Nullable>disable</Nullable>
         <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     </PropertyGroup>
 

+ 24 - 9
src/PixiEditor.Extensions.Wasm/native/api_interop.c

@@ -3,22 +3,37 @@
 #include <assert.h>
 #include "api.h"
 
-MonoMethod* method_init;
-
-__attribute((export_name("initialize")))
-void initialize()
+MonoMethod* lookup_interop_method(const char* method_name)
 {
-    if (!method_init) {
-        method_init = lookup_dotnet_method("PixiEditor.Extensions.Wasm.dll", "PixiEditor.Extensions.Wasm", "Interop", "Initialize", -1);
-        assert(method_init);
-    }
+    MonoMethod* method = NULL;
+    method = lookup_dotnet_method("PixiEditor.Extensions.Wasm.dll", "PixiEditor.Extensions.Wasm", "Interop", method_name, -1);
+    assert(method);
 
+    return method;
+}
+
+void invoke_interop_method(MonoMethod* method)
+{
     void* method_params[] = {  };
     MonoObject* exception;
-    mono_wasm_invoke_method(method_init, NULL, method_params, &exception);
+    mono_wasm_invoke_method(method, NULL, method_params, &exception);
     assert(!exception);
 }
 
+__attribute((export_name("load")))
+void load()
+{
+    MonoMethod* metod = lookup_interop_method("Load");
+    invoke_interop_method(metod);
+}
+
+__attribute((export_name("initialize")))
+void initialize()
+{
+    MonoMethod* metod = lookup_interop_method("Initialize");
+    invoke_interop_method(metod);
+}
+
 void attach_internal_calls()
 {
     attach_logger_calls();

+ 3 - 1
src/PixiEditor.Extensions.WasmRuntime/WasmExtensionInstance.cs

@@ -23,6 +23,7 @@ public class WasmExtensionInstance : Extension
         Linker.DefineModule(Store, Module);
 
         Instance = Linker.Instantiate(Store, Module);
+        Instance.GetFunction("_start").Invoke();
     }
 
     protected override void OnInitialized()
@@ -33,6 +34,7 @@ public class WasmExtensionInstance : Extension
 
     protected override void OnLoaded()
     {
-        Instance.GetFunction("_start").Invoke();
+        Instance.GetAction("load").Invoke();
+        base.OnLoaded();
     }
 }

+ 0 - 8
src/WasmSampleExtension/Program.cs

@@ -4,16 +4,8 @@ namespace SampleExtension.WASM;
 
 public static class Program
 {
-    static SampleExtension extension = new SampleExtension();
     public static void Main(string[] args)
     {
-        ExtensionEvents.OnInitialized += OnExtensionInitialized;
-        extension = new SampleExtension();
-        extension.OnLoaded();
-    }
 
-    private static void OnExtensionInitialized()
-    {
-        extension.OnInitialized();
     }
 }