diff --git a/examples/wasm/greet.pl b/examples/wasm/greet.pl new file mode 100644 index 0000000..44d5c2f --- /dev/null +++ b/examples/wasm/greet.pl @@ -0,0 +1,7 @@ +use strict; +use warnings; +use Path::Tiny qw( path ); +use lib path(__FILE__)->parent->child('lib')->stringify; +use Greet; + +print greet("Perl!"), "\n"; diff --git a/examples/wasm/lib/Greet.c b/examples/wasm/lib/Greet.c new file mode 100644 index 0000000..b248cbe --- /dev/null +++ b/examples/wasm/lib/Greet.c @@ -0,0 +1,23 @@ +#include +#include +#include + +#define EXPORT __attribute__ ((visibility ("default"))) + +EXPORT void * +_allocate(size_t size) { + return malloc(size); +} + +EXPORT void +_deallocate(void* ptr) { + free(ptr); +} + +EXPORT char * +_greet(const char *subject) { + int len = strlen(subject) + strlen("Hello, ") + 1; + char *greeting = malloc(len); + snprintf(greeting, len, "Hello, %s", subject); + return greeting; +} diff --git a/examples/wasm/lib/Greet.pm b/examples/wasm/lib/Greet.pm new file mode 100644 index 0000000..ece3544 --- /dev/null +++ b/examples/wasm/lib/Greet.pm @@ -0,0 +1,31 @@ +package Greet; + +use strict; +use warnings; +use FFI::Platypus; +use FFI::Platypus::Memory qw( strcpy ); +use base qw( Exporter ); +use Wasm + -api => 0, + -self +; + +our @EXPORT = qw( greet ); + +sub greet +{ + my($subject) = @_; + + my $input_offset = _allocate(length($subject) + 1); + strcpy( $memory->address + $input_offset, $subject ); + + my $output_offset = _greet($input_offset); + my $greeting = FFI::Platypus->new->cast('opaque', 'string', $memory->address + $output_offset); + + _deallocate($input_offset); + _deallocate($output_offset); + + return $greeting; +} + +1; diff --git a/examples/wasm/lib/Greet.wasm b/examples/wasm/lib/Greet.wasm new file mode 100644 index 0000000..e11ff59 Binary files /dev/null and b/examples/wasm/lib/Greet.wasm differ