Phasor 3.1.1
Stack VM based Programming Language
Loading...
Searching...
No Matches
ffi.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <Value.hpp>
5
6#include <vector>
7#include <string>
8
9
10#if defined(_WIN32)
11#include <windows.h>
12#else
13#include <dlfcn.h>
14#endif
15
16#include <PhasorFFI.h>
17
18namespace Phasor {
19 class VM;
20}
21
22using FFIFunction = void (*)(const PhasorAPI *api, PhasorVM *vm);
24namespace Phasor
25{
26
33struct Plugin
34{
35#if defined(_WIN32)
36 HMODULE handle;
37#else
38 void *handle;
39#endif
40 std::string path;
42 std::function<void()> shutdown;
43};
44
55 const std::vector<Phasor::Value> &args);
56
64void register_native_c_func(PhasorVM *vm, const char *name, PhasorNativeFunction func);
65
72class FFI
73{
74 public:
80 explicit FFI(const std::filesystem::path &pluginFolder, VM *vm);
81
85 ~FFI();
86
92 bool addPlugin(const std::filesystem::path &pluginPath);
93
97 Value native_add_plugin(const std::vector<Value> &args, VM *vm);
98
99 private:
106 bool loadPlugin(const std::filesystem::path &library, VM *vm);
107
113 std::vector<std::string> scanPlugins(const std::filesystem::path &folder);
114
118 void unloadAll();
119
120 std::vector<Plugin> plugins_;
121 std::filesystem::path pluginFolder_;
123};
124
125} // namespace Phasor
PhasorValue(* PhasorNativeFunction)(PhasorVM *vm, int argc, const PhasorValue *argv)
Signature for a native C function that can be registered with the Phasor VM.
Definition PhasorFFI.h:189
struct PhasorVM PhasorVM
Phasor Virtual Machine pointer.
Definition PhasorFFI.h:44
void unloadAll()
Unloads all currently loaded plugins and clears internal state.
Definition ffi.cpp:160
std::vector< Plugin > plugins_
Loaded plugins.
Definition ffi.hpp:120
std::filesystem::path pluginFolder_
Plugin search folder.
Definition ffi.hpp:121
~FFI()
Destructor. Unloads all loaded plugins.
Definition ffi.cpp:202
std::vector< std::string > scanPlugins(const std::filesystem::path &folder)
Scans a folder for plugin libraries.
Definition ffi.cpp:88
Value native_add_plugin(const std::vector< Value > &args, VM *vm)
Native function to load a plugin at runtime.
Definition ffi.cpp:211
bool loadPlugin(const std::filesystem::path &library, VM *vm)
Loads a single plugin from a library file.
Definition ffi.cpp:25
bool addPlugin(const std::filesystem::path &pluginPath)
Adds a single plugin from the specified path.
Definition ffi.cpp:76
VM * vm_
Pointer to the Phasor VM.
Definition ffi.hpp:122
FFI(const std::filesystem::path &pluginFolder, VM *vm)
Constructs the FFI manager and loads plugins.
Definition ffi.cpp:181
Virtual Machine.
Definition VM.hpp:30
A value in the Phasor VM.
Definition Value.hpp:67
void(*)(const PhasorAPI *api, PhasorVM *vm) FFIFunction
Definition ffi.hpp:22
The Phasor Programming Language and Runtime.
Definition AST.hpp:11
void register_native_c_func(PhasorVM *vm, const char *name, PhasorNativeFunction func)
The concrete implementation of the PhasorRegisterFunction API call.
Definition api.cpp:119
Phasor::Value c_native_func_wrapper(PhasorNativeFunction c_func, Phasor::VM *vm, const std::vector< Phasor::Value > &args)
The "trampoline" that wraps a C function from a plugin.
Definition api.cpp:102
Represents a loaded plugin.
Definition ffi.hpp:34
void * handle
POSIX handle for the loaded library.
Definition ffi.hpp:38
std::function< void()> shutdown
Optional shutdown callback.
Definition ffi.hpp:42
std::string path
Path to the plugin file.
Definition ffi.hpp:40
FFIFunction init
Plugin initialization function.
Definition ffi.hpp:41
The collection of API functions that the Phasor host provides to the plugin.
Definition PhasorFFI.h:196