Clownfish
view release on metacpan or search on metacpan
buildlib/Clownfish/Build/Binding.pm view on Meta::CPAN
sub bind_all {
my $class = shift;
$class->bind_clownfish;
$class->bind_test;
$class->bind_test_host;
$class->bind_blob;
$class->bind_boolean;
$class->bind_bytebuf;
$class->bind_charbuf;
$class->bind_string;
$class->bind_stringiterator;
$class->bind_err;
$class->bind_hash;
$class->bind_hashiterator;
$class->bind_float;
$class->bind_integer;
$class->bind_obj;
$class->bind_vector;
$class->bind_class;
}
sub bind_clownfish {
my $xs_code = <<'END_XS_CODE';
MODULE = Clownfish PACKAGE = Clownfish
SV*
to_clownfish(sv)
SV *sv;
CODE:
{
cfish_Obj *obj = XSBind_perl_to_cfish_nullable(aTHX_ sv, CFISH_OBJ);
RETVAL = CFISH_OBJ_TO_SV_NOINC(obj);
}
OUTPUT: RETVAL
END_XS_CODE
my $binding = Clownfish::CFC::Binding::Perl::Class->new(
parcel => "Clownfish",
class_name => "Clownfish",
);
$binding->append_xs($xs_code);
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_test {
my $xs_code = <<'END_XS_CODE';
MODULE = Clownfish::Test PACKAGE = Clownfish::Test
SV*
create_test_suite()
CODE:
cfish_TestSuite *suite = testcfish_Test_create_test_suite();
RETVAL = CFISH_OBJ_TO_SV_NOINC(suite);
OUTPUT: RETVAL
void
invoke_to_string(obj)
cfish_Obj *obj;
PPCODE:
cfish_String *str = CFISH_Obj_To_String(obj);
CFISH_DECREF(str);
int
refcount(obj)
cfish_Obj *obj;
CODE:
RETVAL = (int)CFISH_REFCOUNT_NN(obj);
OUTPUT: RETVAL
END_XS_CODE
my $binding = Clownfish::CFC::Binding::Perl::Class->new(
parcel => "TestClownfish",
class_name => "Clownfish::Test",
);
$binding->append_xs($xs_code);
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_test_host {
my $binding = Clownfish::CFC::Binding::Perl::Class->new(
class_name => "Clownfish::Test::TestHost",
);
$binding->bind_method(
alias => 'perl_alias',
method => 'Aliased',
);
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_blob {
my $pod_spec = Clownfish::CFC::Binding::Perl::Pod->new;
my $synopsis = <<'END_SYNOPSIS';
my $blob = Clownfish::Blob->new($byte_string);
my $byte_string = $blob->to_perl;
END_SYNOPSIS
my $constructor = <<'END_CONSTRUCTOR';
=head2 new
my $blob = Clownfish::Blob->new($byte_string);
Create a Blob containing the passed-in bytes.
END_CONSTRUCTOR
$pod_spec->set_synopsis($synopsis);
$pod_spec->add_constructor( pod => $constructor );
my $xs_code = <<'END_XS_CODE';
MODULE = Clownfish PACKAGE = Clownfish::Blob
SV*
new(either_sv, sv)
SV *either_sv;
SV *sv;
CODE:
{
STRLEN size;
char *ptr = SvPV(sv, size);
cfish_Blob *self
= (cfish_Blob*)XSBind_new_blank_obj(aTHX_ either_sv);
buildlib/Clownfish/Build/Binding.pm view on Meta::CPAN
trap(routine_sv, context_sv)
SV *routine_sv;
SV *context_sv;
CODE:
cfish_Err *error = XSBind_trap(routine_sv, context_sv);
RETVAL = CFISH_OBJ_TO_SV_NOINC(error);
OUTPUT: RETVAL
END_XS_CODE
my $binding = Clownfish::CFC::Binding::Perl::Class->new(
class_name => "Clownfish::Err",
);
$binding->bind_constructor( alias => '_new' );
$binding->set_pod_spec($pod_spec);
$binding->append_xs($xs_code);
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_hash {
my @hand_rolled = qw(
Store
);
my $pod_spec = Clownfish::CFC::Binding::Perl::Pod->new;
my $synopsis = <<'END_SYNOPSIS';
my $hash = Clownfish::Hash->new;
$hash->store($key, $value);
my $value = $hash->fetch($key);
END_SYNOPSIS
my $store_pod = <<'END_POD';
=head2 store
$hash->store($key, $value);
Store a key-value pair.
END_POD
$pod_spec->set_synopsis($synopsis);
$pod_spec->add_constructor();
$pod_spec->add_method(
method => 'Store',
alias => 'store',
pod => $store_pod,
);
my $xs_code = <<'END_XS_CODE';
MODULE = Clownfish PACKAGE = Clownfish::Hash
SV*
fetch_raw(self, key)
cfish_Hash *self;
cfish_String *key;
CODE:
RETVAL = CFISH_OBJ_TO_SV_INC(CFISH_Hash_Fetch(self, key));
OUTPUT: RETVAL
void
store(self, key, value_sv);
cfish_Hash *self;
cfish_String *key;
SV *value_sv;
PPCODE:
{
cfish_Obj *value
= (cfish_Obj*)XSBind_perl_to_cfish_nullable(aTHX_ value_sv, CFISH_OBJ);
CFISH_Hash_Store(self, key, value);
}
END_XS_CODE
my $binding = Clownfish::CFC::Binding::Perl::Class->new(
class_name => "Clownfish::Hash",
);
$binding->set_pod_spec($pod_spec);
$binding->exclude_method($_) for @hand_rolled;
$binding->append_xs($xs_code);
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_hashiterator {
my $pod_spec = Clownfish::CFC::Binding::Perl::Pod->new;
my $synopsis = <<'END_SYNOPSIS';
my $iter = Clownfish::HashIterator->new($hash);
while ($iter->next) {
my $key = $iter->get_key;
my $value = $iter->get_value;
}
END_SYNOPSIS
my $constructor = <<'END_CONSTRUCTOR';
my $iter = Clownfish::HashIterator->new($hash);
END_CONSTRUCTOR
$pod_spec->set_synopsis($synopsis);
$pod_spec->add_constructor( sample => $constructor );
my $xs_code = <<'END_XS_CODE';
MODULE = Clownfish PACKAGE = Clownfish::HashIterator
SV*
new(either_sv, hash)
SV *either_sv;
cfish_Hash *hash;
CODE:
{
cfish_HashIterator *self
= (cfish_HashIterator*)XSBind_new_blank_obj(aTHX_ either_sv);
cfish_HashIter_init(self, hash);
RETVAL = CFISH_OBJ_TO_SV_NOINC(self);
}
OUTPUT: RETVAL
END_XS_CODE
my $binding = Clownfish::CFC::Binding::Perl::Class->new(
class_name => "Clownfish::HashIterator",
);
$binding->set_pod_spec($pod_spec);
$binding->append_xs($xs_code);
$binding->exclude_constructor;
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_float {
buildlib/Clownfish/Build/Binding.pm view on Meta::CPAN
);
$binding->bind_method(
alias => 'DESTROY',
method => 'Destroy',
);
$binding->append_xs($xs_code);
$binding->set_pod_spec($pod_spec);
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_vector {
my @hand_rolled = qw(
Store
);
my $pod_spec = Clownfish::CFC::Binding::Perl::Pod->new;
my $synopsis = <<'END_SYNOPSIS';
my $vector = Clownfish::Vector->new;
$vector->store($tick, $value);
my $value = $vector->fetch($tick);
END_SYNOPSIS
my $store_pod = <<'END_POD';
=head2 store
$vector->store($tick, $elem)
Store an element at index C<tick>, possibly displacing an existing element.
END_POD
$pod_spec->set_synopsis($synopsis);
$pod_spec->add_constructor();
$pod_spec->add_method(
method => 'Store',
alias => 'store',
pod => $store_pod,
);
my $xs_code = <<'END_XS_CODE';
MODULE = Clownfish PACKAGE = Clownfish::Vector
SV*
pop_raw(self)
cfish_Vector *self;
CODE:
RETVAL = CFISH_OBJ_TO_SV_NOINC(CFISH_Vec_Pop(self));
OUTPUT: RETVAL
SV*
delete_raw(self, tick)
cfish_Vector *self;
uint32_t tick;
CODE:
RETVAL = CFISH_OBJ_TO_SV_NOINC(CFISH_Vec_Delete(self, tick));
OUTPUT: RETVAL
void
store(self, tick, value);
cfish_Vector *self;
uint32_t tick;
cfish_Obj *value;
PPCODE:
{
if (value) { CFISH_INCREF(value); }
CFISH_Vec_Store(self, tick, value);
}
SV*
fetch_raw(self, tick)
cfish_Vector *self;
uint32_t tick;
CODE:
RETVAL = CFISH_OBJ_TO_SV_INC(CFISH_Vec_Fetch(self, tick));
OUTPUT: RETVAL
END_XS_CODE
my $binding = Clownfish::CFC::Binding::Perl::Class->new(
class_name => "Clownfish::Vector",
);
$binding->set_pod_spec($pod_spec);
$binding->exclude_method($_) for @hand_rolled;
$binding->append_xs($xs_code);
Clownfish::CFC::Binding::Perl::Class->register($binding);
}
sub bind_class {
my $pod_spec = Clownfish::CFC::Binding::Perl::Pod->new;
my $synopsis = <<'END_SYNOPSIS';
my $class = Clownfish::Class->fetch_class('Foo::Bar');
my $subclass = Clownfish::Class->singleton('Foo::Bar::Jr', $class);
END_SYNOPSIS
my $fetch_class_sample = <<'END_CONSTRUCTOR';
my $class = Clownfish::Class->fetch_class($class_name);
END_CONSTRUCTOR
$pod_spec->set_synopsis($synopsis);
$pod_spec->add_constructor(
alias => 'fetch_class',
sample => $fetch_class_sample,
);
$pod_spec->add_constructor( alias => 'singleton' );
my $xs_code = <<'END_XS_CODE';
MODULE = Clownfish PACKAGE = Clownfish::Class
SV*
fetch_class(unused_sv, class_name)
SV *unused_sv;
cfish_String *class_name;
CODE:
{
cfish_Class *klass = cfish_Class_fetch_class(class_name);
CFISH_UNUSED_VAR(unused_sv);
RETVAL = klass ? (SV*)CFISH_Class_To_Host(klass, NULL) : &PL_sv_undef;
}
OUTPUT: RETVAL
SV*
singleton(unused_sv, ...)
SV *unused_sv;
CODE:
{
( run in 1.632 second using v1.01-cache-2.11-cpan-71847e10f99 )