diff options
| author | nsfisis <nsfisis@gmail.com> | 2024-07-12 22:39:20 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2024-07-13 08:23:06 +0900 |
| commit | e94a046a548795b8675bc109c87413de6bca53e7 (patch) | |
| tree | 9958efead32039de87f3564c77a7b09f978a13ef /src/WebAssembly/Execution/Linker.php | |
| parent | d1c268b76f65e69ea708096d5023c4d731cff594 (diff) | |
| download | php-waddiwasi-e94a046a548795b8675bc109c87413de6bca53e7.tar.gz php-waddiwasi-e94a046a548795b8675bc109c87413de6bca53e7.tar.zst php-waddiwasi-e94a046a548795b8675bc109c87413de6bca53e7.zip | |
feat: add Linker class
Diffstat (limited to 'src/WebAssembly/Execution/Linker.php')
| -rw-r--r-- | src/WebAssembly/Execution/Linker.php | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/WebAssembly/Execution/Linker.php b/src/WebAssembly/Execution/Linker.php new file mode 100644 index 0000000..3c9c1d0 --- /dev/null +++ b/src/WebAssembly/Execution/Linker.php @@ -0,0 +1,49 @@ +<?php + +declare(strict_types=1); + +namespace Nsfisis\Waddiwasi\WebAssembly\Execution; + +use Nsfisis\Waddiwasi\WebAssembly\Structure\Modules\Module; + +final class Linker +{ + /** + * @var array<string, array<string, ExternVal>> + */ + private array $symbols = []; + + public function __construct( + private Store $store, + ) { + } + + public function register(string $namespace, string $name, Extern $extern): void + { + $externVal = $this->store->register($extern); + $this->symbols[$namespace][$name] = $externVal; + } + + public function registerNamespace(string $namespace, ExporterInterface $exporter): void + { + foreach ($exporter->exports() as $export) { + $this->symbols[$namespace][$export->name] = $export->value; + } + } + + /** + * @return list<ExternVal> + */ + public function resolve(Module $module): array + { + $externVals = []; + foreach ($module->imports as $import) { + $externVal = $this->symbols[$import->module][$import->name] ?? null; + if ($externVal === null) { + throw new LinkErrorException("import not found: {$import->module}::{$import->name}"); + } + $externVals[] = $externVal; + } + return $externVals; + } +} |
