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

feat: import extism functions from extism:host/env #16

Merged
merged 9 commits into from
Oct 31, 2023
Merged
Show file tree
Hide file tree
Changes from all 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
22 changes: 11 additions & 11 deletions src/Extism.Pdk.MSBuild/FFIGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ namespace Extism.Pdk.MSBuild
public class FFIGenerator
{
private readonly Action<string> _logError;
private readonly string _env;
private readonly string _extism;

public FFIGenerator(string env, Action<string> logError)
public FFIGenerator(string extism, Action<string> logError)
{
_logError = logError;
_env = env;
_extism = extism;
}

public IEnumerable<FileEntry> GenerateGlueCode(AssemblyDefinition assembly)
Expand All @@ -28,13 +28,13 @@ public IEnumerable<FileEntry> GenerateGlueCode(AssemblyDefinition assembly)
.Where(m => m.HasPInvokeInfo)
.ToArray();

var files = GenerateImports(importedMethods, _env);
var files = GenerateImports(importedMethods, _extism);
files.Add(GenerateExports(assembly.Name.Name + ".dll", exportedMethods));

return files;
}

private List<FileEntry> GenerateImports(MethodDefinition[] importedMethods, string env)
private List<FileEntry> GenerateImports(MethodDefinition[] importedMethods, string extism)
{
var modules = importedMethods.GroupBy(m => m.PInvokeInfo.Module.Name)
.Select(g => new
Expand All @@ -44,7 +44,7 @@ private List<FileEntry> GenerateImports(MethodDefinition[] importedMethods, stri
})
.ToList();

var envWritten = false;
var extismWritten = false;

var files = new List<FileEntry>();

Expand All @@ -54,10 +54,10 @@ private List<FileEntry> GenerateImports(MethodDefinition[] importedMethods, stri
{
var builder = new StringBuilder();

if (module.Name == "env")
if (module.Name == "extism")
{
envWritten = true;
builder.AppendLine(env);
extismWritten = true;
builder.AppendLine(extism);
}
else
{
Expand All @@ -72,9 +72,9 @@ private List<FileEntry> GenerateImports(MethodDefinition[] importedMethods, stri
files.Add(new FileEntry { Name = $"{module.Name}.c", Content = builder.ToString() });
}

if (!envWritten)
if (!extismWritten)
{
files.Add(new FileEntry { Name = $"env.c", Content = env });
files.Add(new FileEntry { Name = $"extism.c", Content = extism });
}

return files;
Expand Down
4 changes: 2 additions & 2 deletions src/Extism.Pdk.MSBuild/GenerateFFITask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class GenerateFFITask : Microsoft.Build.Utilities.Task
public string OutputPath { get; set; }

[Required]
public string EnvPath { get; set; }
public string ExtismPath { get; set; }

public override bool Execute()
{
Expand All @@ -36,7 +36,7 @@ public override bool Execute()
}
}

var generator = new FFIGenerator(File.ReadAllText(EnvPath), (string message) => Log.LogError(message));
var generator = new FFIGenerator(File.ReadAllText(ExtismPath), (string message) => Log.LogError(message));

foreach (var file in generator.GenerateGlueCode(assembly))
{
Expand Down
48 changes: 24 additions & 24 deletions src/Extism.Pdk/Native.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,74 +12,74 @@ internal static void Main() {
internal class Native
{

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_input_length();

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_length(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_alloc(ulong n);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_free(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern byte extism_input_load_u8(ulong index);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_input_load_u64(ulong index);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_output_set(ulong offset, ulong n);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_error_set(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_config_get(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_var_get(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_var_set(ulong keyOffset, ulong valueOffset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_store_u8(ulong offset, byte value);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern byte extism_load_u8(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_store_u64(ulong offset, ulong value);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_load_u64(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ulong extism_http_request(ulong requestOffset, ulong bodyOffset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern ushort extism_http_status_code();

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_log_info(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_log_debug(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_log_warn(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_log_error(ulong offset);

[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_store(ulong offset, byte* buffer, ulong n);
[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_load(ulong offset, byte* buffer, ulong n);
[DllImport("env")]
[DllImport("extism")]
internal static unsafe extern void extism_load_input(byte* buffer, ulong n);

internal static void PrintException(Exception ex)
Expand Down
4 changes: 2 additions & 2 deletions src/Extism.Pdk/build/Extism.Pdk.targets
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="GenerateFFITask" AssemblyFile="$(MSBuildThisFileDirectory)..\build\Extism.Pdk.MSBuild.dll" />
<Target Name="GenerateGlueCode" AfterTargets="Build" BeforeTargets="_BeforeWasmBuildApp">
<GenerateFFITask AssemblyPath="$(TargetPath)" OutputPath="$(IntermediateOutputPath)extism" EnvPath="$(MSBuildThisFileDirectory)..\native\env.c" />
<GenerateFFITask AssemblyPath="$(TargetPath)" OutputPath="$(IntermediateOutputPath)extism" ExtismPath="$(MSBuildThisFileDirectory)..\native\extism.c" />
<ItemGroup>
<NativeFileReference Include="$(IntermediateOutputPath)extism\*.c" />
<_WasmNativeFileForLinking Include="@(NativeFileReference)" />

<!-- Wrap mono_runtime_run_main because we have to make sure at least one argument is passed in to Mono -->
<!-- See native/env.c for the implementation -->
<!-- See native/extism.c for the implementation -->
<_WasiSdkClangArgs Include="-Wl,--wrap=mono_runtime_run_main" />

<!-- Wrap mono_wasm_load_runtime to ensure mono is loaded only once when _start is called after an exported function -->
Expand Down
44 changes: 22 additions & 22 deletions src/Extism.Pdk/native/env.c → src/Extism.Pdk/native/extism.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,147 +17,147 @@

typedef uint64_t ExtismPointer;

IMPORT("env", "extism_input_length")
IMPORT("extism:host/env", "input_length")
extern uint64_t extism_input_length_import();

uint64_t extism_input_length() {
return extism_input_length_import();
}

IMPORT("env", "extism_length")
IMPORT("extism:host/env", "length")
extern uint64_t extism_length_import(ExtismPointer);

uint64_t extism_length(ExtismPointer p) {
return extism_length_import(p);
}

IMPORT("env", "extism_alloc")
IMPORT("extism:host/env", "alloc")
extern ExtismPointer extism_alloc_import(uint64_t size);

ExtismPointer extism_alloc(uint64_t size) {
return extism_alloc_import(size);
}

IMPORT("env", "extism_free")
IMPORT("extism:host/env", "free")
extern void extism_free_import(ExtismPointer p);

void extism_free(ExtismPointer p) {
extism_free_import(p);
}

IMPORT("env", "extism_input_load_u8")
IMPORT("extism:host/env", "input_load_u8")
extern uint8_t extism_input_load_u8_import(ExtismPointer p);

uint8_t extism_input_load_u8(ExtismPointer p) {
return extism_input_load_u8_import(p);
}

IMPORT("env", "extism_input_load_u64")
IMPORT("extism:host/env", "input_load_u64")
extern uint64_t extism_input_load_u64_import(ExtismPointer p);

uint64_t extism_input_load_u64(ExtismPointer p) {
return extism_input_load_u64_import(p);
}

IMPORT("env", "extism_output_set")
IMPORT("extism:host/env", "output_set")
extern void extism_output_set_import(ExtismPointer p, uint64_t value);

void extism_output_set(ExtismPointer p, uint64_t value) {
extism_output_set_import(p, value);
}

IMPORT("env", "extism_error_set")
IMPORT("extism:host/env", "error_set")
extern void extism_error_set_import(ExtismPointer p);

void extism_error_set(ExtismPointer p) {
extism_error_set_import(p);
}

IMPORT("env", "extism_config_get")
IMPORT("extism:host/env", "config_get")
extern ExtismPointer extism_config_get_import(ExtismPointer p);

ExtismPointer extism_config_get(ExtismPointer p) {
return extism_config_get_import(p);
}

IMPORT("env", "extism_var_get")
IMPORT("extism:host/env", "var_get")
extern ExtismPointer extism_var_get_import(ExtismPointer p);

ExtismPointer extism_var_get(ExtismPointer p) {
return extism_var_get_import(p);
}

IMPORT("env", "extism_var_set")
IMPORT("extism:host/env", "var_set")
extern void extism_var_set_import(ExtismPointer p1, ExtismPointer p2);

void extism_var_set(ExtismPointer p1, ExtismPointer p2) {
extism_var_set_import(p1, p2);
}

IMPORT("env", "extism_store_u8")
IMPORT("extism:host/env", "store_u8")
extern void extism_store_u8_import(ExtismPointer p, uint8_t value);

void extism_store_u8(ExtismPointer p, uint8_t value) {
extism_store_u8_import(p, value);
}

IMPORT("env", "extism_load_u8")
IMPORT("extism:host/env", "load_u8")
extern uint8_t extism_load_u8_import(ExtismPointer p);

uint8_t extism_load_u8(ExtismPointer p) {
return extism_load_u8_import(p);
}

IMPORT("env", "extism_store_u64")
IMPORT("extism:host/env", "store_u64")
extern void extism_store_u64_import(ExtismPointer p, uint64_t value);

void extism_store_u64(ExtismPointer p, uint64_t value) {
extism_store_u64_import(p, value);
}

IMPORT("env", "extism_load_u64")
IMPORT("extism:host/env", "load_u64")
extern uint64_t extism_load_u64_import(ExtismPointer p);

uint64_t extism_load_u64(ExtismPointer p) {
return extism_load_u64_import(p);
}

IMPORT("env", "extism_http_request")
IMPORT("extism:host/env", "http_request")
extern ExtismPointer extism_http_request_import(ExtismPointer p1, ExtismPointer p2);

ExtismPointer extism_http_request(ExtismPointer p1, ExtismPointer p2) {
return extism_http_request_import(p1, p2);
}

IMPORT("env", "extism_http_status_code")
IMPORT("extism:host/env", "http_status_code")
extern int32_t extism_http_status_code_import();

int32_t extism_http_status_code() {
return extism_http_status_code_import();
}

IMPORT("env", "extism_log_info")
IMPORT("extism:host/env", "log_info")
extern void extism_log_info_import(ExtismPointer p);

void extism_log_info(ExtismPointer p) {
extism_log_info_import(p);
}

IMPORT("env", "extism_log_debug")
IMPORT("extism:host/env", "log_debug")
extern void extism_log_debug_import(ExtismPointer p);

void extism_log_debug(ExtismPointer p) {
extism_log_debug_import(p);
}

IMPORT("env", "extism_log_warn")
IMPORT("extism:host/env", "log_warn")
extern void extism_log_warn_import(ExtismPointer p);

void extism_log_warn(ExtismPointer p) {
extism_log_warn_import(p);
}

IMPORT("env", "extism_log_error")
IMPORT("extism:host/env", "log_error")
extern void extism_log_error_import(ExtismPointer p);

void extism_log_error(ExtismPointer p) {
Expand Down Expand Up @@ -245,4 +245,4 @@ void __wrap_mono_wasm_load_runtime(const char* unused, int debug_level) {

__real_mono_wasm_load_runtime(unused, debug_level);
mono_runtime_initialized = true;
}
}
Loading