Skip to content

Commit 8d63165

Browse files
committed
feat/fix: switch from returning undef on error to croaking exceptions, fix setting namespace when creating a function
1 parent a8686ce commit 8d63165

File tree

4 files changed

+65
-31
lines changed

4 files changed

+65
-31
lines changed

Extism/lib/Extism/Function.pm

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ sub new {
7171
my $output_types_array = pack('L*', @outputs);
7272
my $output_types_ptr = unpack('Q', pack('P', $output_types_array));
7373
my $function = function_new($name, $input_types_ptr, scalar(@inputs), $output_types_ptr, scalar(@outputs), \%hostdata);
74-
$function or return undef;
74+
$function or croak("Failed to create function, is the name valid?");
7575
my $functionref = bless \$function, $class;
76-
defined $namespace and $functionref->($namespace);
76+
defined $namespace and $functionref->set_namespace($namespace);
7777
return $functionref;
7878
}
7979

@@ -88,7 +88,6 @@ sub set_namespace {
8888
function_set_namespace($$self, $namespace);
8989
}
9090

91-
9291
sub load_raw_array {
9392
my ($ptr, $elm_size, $n) = @_;
9493
$n or return [];

Extism/lib/Extism/Plugin.pm

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package Extism::Plugin;
33
use 5.016;
44
use strict;
55
use warnings;
6+
use Carp qw(croak);
67
use Extism::XS qw(
78
plugin_new
89
plugin_new_error_free
@@ -17,6 +18,7 @@ use Extism::XS qw(
1718
plugin_config
1819
plugin_cancel_handle
1920
);
21+
use Extism::Plugin::CallException;
2022
use Extism::Plugin::CancelHandle;
2123
use Data::Dumper qw(Dumper);
2224
use Devel::Peek qw(Dump);
@@ -45,12 +47,9 @@ sub new {
4547
if (! $plugin) {
4648
my $errmsg = unpack('p', $errptr);
4749
plugin_new_error_free(unpack('Q', $errptr));
48-
return undef unless wantarray;
49-
return (undef, $errmsg);
50+
croak $errmsg;
5051
}
51-
my $pluginobj = \$plugin;
52-
my $realplugin = bless $pluginobj, $name;
53-
return $realplugin;
52+
bless \$plugin, $name
5453
}
5554

5655
# call PLUGIN,FUNCNAME,INPUT
@@ -68,8 +67,7 @@ sub call {
6867
}
6968
my $rc = plugin_call($$self, $func_name, $input, length($input));
7069
if ($rc != 0) {
71-
return undef unless wantarray;
72-
return (undef, $rc, plugin_error($$self));
70+
die Extism::Plugin::CallException->new($rc, plugin_error($$self));
7371
}
7472
my $output_size = plugin_output_length($$self);
7573
my $output_ptr = plugin_output_data($$self);
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package Extism::Plugin::CallException;
2+
3+
use 5.016;
4+
use strict;
5+
use warnings;
6+
use version 0.77; our $VERSION = qv(v0.0.1);
7+
use Carp qw(croak shortmess);
8+
our @CARP_NOT = qw(Extism::Plugin);
9+
use overload '""' => sub {
10+
"$_[0]->{message}, code: $_[0]->{code} " . shortmess()
11+
};
12+
13+
sub new {
14+
my ($name, $rc, $message) = @_;
15+
my %obj = (code => $rc, message => $message);
16+
bless \%obj, $name
17+
}
18+
19+
1; # End of Extism::Plugin::CallException

Extism/t/02-extism.t

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use Extism ':all';
77
use JSON::PP qw(encode_json decode_json);
88
use File::Temp qw(tempfile);
99
use Devel::Peek qw(Dump);
10-
plan tests => 44;
10+
plan tests => 45;
1111

1212
# ...
1313
ok(Extism::version());
@@ -23,7 +23,10 @@ ok(Extism::version());
2323
my $tempfunc = sub {
2424
$log_text .= $_[0];
2525
};
26-
Extism::Plugin->new('');
26+
eval {
27+
Extism::Plugin->new('');
28+
fail('Extism::Plugin->new("") should throw an exception');
29+
};
2730
Extism::log_drain($tempfunc);
2831
$log_text or $rc = 1;
2932
POSIX::_exit($rc);
@@ -33,16 +36,12 @@ ok(Extism::version());
3336
}
3437
}
3538

36-
# test failing plugin new in scalar and list context
37-
{
39+
# test failing plugin throws an exception
40+
eval {
3841
my $notplugin = Extism::Plugin->new('');
39-
ok(!defined $notplugin);
40-
}
41-
{
42-
my ($notplugin, $error) = Extism::Plugin->new('');
43-
ok(!defined $notplugin);
44-
ok($error);
45-
}
42+
fail('Extism::Plugin->new("") should throw an exception');
43+
};
44+
ok($@);
4645

4746
# test succeeding plugin new in scalar and list context
4847
# also text various Plugin:: functions
@@ -65,7 +64,7 @@ my $wasm = do { local(@ARGV, $/) = 'count_vowels.wasm'; <> };
6564
ok($plugin->reset());
6665
}
6766
{
68-
my ($plugin, $error) = Extism::Plugin->new($wasm, {wasi => 1});
67+
my $plugin = Extism::Plugin->new($wasm, {wasi => 1});
6968
ok($plugin);
7069
my ($output) = $plugin->call('count_vowels', "this is a test");
7170
ok($output);
@@ -79,18 +78,31 @@ my $wasm = do { local(@ARGV, $/) = 'count_vowels.wasm'; <> };
7978
Extism::log_file($filename, "error");
8079
my $failwasm = do { local(@ARGV, $/) = 'fail.wasm'; <> };
8180
my $failplugin = Extism::Plugin->new($failwasm, {wasi => 1});
82-
my $failed = $failplugin->call('run_test', "");
83-
ok(!$failed);
81+
eval {
82+
my $failed = $failplugin->call('run_test', "");
83+
fail('calling run_test in failplugin should throw an exception');
84+
};
85+
ok($@);
8486
my $rc = read($error_fh, my $filler, 1);
8587
ok($rc == 1);
8688
unlink($filename);
8789
Extism::log_file("/dev/stdout", "error");
88-
my ($res, $rca, $info) = $failplugin->call('run_test', "");
89-
ok($rca == 1);
90-
is($info, 'Some error message');
90+
eval {
91+
$failplugin->call('run_test', "");
92+
fail('calling run_test in failplugin should throw an exception');
93+
};
94+
ok($@);
95+
ok($@->{code} == 1);
96+
is($@->{message}, 'Some error message');
9197
}
9298

9399
# test basic host functions
100+
eval {
101+
my $badname = Extism::Function->new("\x{D800}", [], [], sub {});
102+
fail('Function->new should throw an exception when an invalid name is passed');
103+
};
104+
ok($@);
105+
94106
my $voidfunction = Extism::Function->new("hello_void", [], [], sub {
95107
print "hello_void\n";
96108
return;
@@ -101,6 +113,9 @@ my $paramsfunction = Extism::Function->new("hello_params", [Extism_F64, Extism_I
101113
return 18446744073709551615;
102114
});
103115
ok($paramsfunction);
116+
my $withnamespace = Extism::Function->new("with_namespace", [], [], sub {
117+
}, 'namespace');
118+
ok($withnamespace);
104119
my $hostwasm = do { local(@ARGV, $/) = 'host.wasm'; <> };
105120
my $fplugin = Extism::Plugin->new($hostwasm, {functions => [$voidfunction, $paramsfunction], wasi => 1});
106121
ok($fplugin);
@@ -191,7 +206,10 @@ my $unreachable = encode_json({
191206
});
192207
my $uplugin = Extism::Plugin->new($unreachable, {wasi => 1});
193208
ok($uplugin);
194-
my ($ures, $urc, $uinfo) = $uplugin->call('do_unreachable');
195-
ok(!defined $ures);
196-
ok($urc != 0);
197-
ok($uinfo);
209+
eval {
210+
$uplugin->call('do_unreachable');
211+
fail('calling do_unreachable should throw an exception');
212+
};
213+
ok($@);
214+
ok($@->{code} != 0);
215+
ok($@->{message});

0 commit comments

Comments
 (0)