Perl bindings for Blob
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/911bcb75 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/911bcb75 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/911bcb75 Branch: refs/heads/master Commit: 911bcb75d7972cfd7c8a5c86a89e6c4d4279ed9c Parents: 1b1789a Author: Nick Wellnhofer <[email protected]> Authored: Mon May 4 15:34:52 2015 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Tue May 5 11:15:12 2015 +0200 ---------------------------------------------------------------------- .../perl/buildlib/Clownfish/Build/Binding.pm | 31 ++++++++++++++++++++ runtime/perl/lib/Clownfish/Blob.pm | 25 ++++++++++++++++ runtime/perl/t/018-host.t | 2 +- runtime/perl/xs/XSBind.c | 10 +++++++ runtime/perl/xs/XSBind.h | 12 ++++++-- 5 files changed, 77 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/911bcb75/runtime/perl/buildlib/Clownfish/Build/Binding.pm ---------------------------------------------------------------------- diff --git a/runtime/perl/buildlib/Clownfish/Build/Binding.pm b/runtime/perl/buildlib/Clownfish/Build/Binding.pm index 6d8be97..c70d528 100644 --- a/runtime/perl/buildlib/Clownfish/Build/Binding.pm +++ b/runtime/perl/buildlib/Clownfish/Build/Binding.pm @@ -24,6 +24,7 @@ sub bind_all { $class->bind_clownfish; $class->bind_test; $class->bind_test_alias_obj; + $class->bind_blob; $class->bind_bytebuf; $class->bind_string; $class->bind_err; @@ -140,6 +141,36 @@ sub bind_test_alias_obj { Clownfish::CFC::Binding::Perl::Class->register($binding); } +sub bind_blob { + 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); + cfish_Blob_init(self, ptr, size); + RETVAL = CFISH_OBJ_TO_SV_NOINC(self); +} +OUTPUT: RETVAL +END_XS_CODE + + my $binding = Clownfish::CFC::Binding::Perl::Class->new( + parcel => "Clownfish", + class_name => "Clownfish::Blob", + ); + $binding->append_xs($xs_code); + $binding->exclude_constructor; + + Clownfish::CFC::Binding::Perl::Class->register($binding); +} + sub bind_bytebuf { my $xs_code = <<'END_XS_CODE'; MODULE = Clownfish PACKAGE = Clownfish::ByteBuf http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/911bcb75/runtime/perl/lib/Clownfish/Blob.pm ---------------------------------------------------------------------- diff --git a/runtime/perl/lib/Clownfish/Blob.pm b/runtime/perl/lib/Clownfish/Blob.pm new file mode 100644 index 0000000..b944259 --- /dev/null +++ b/runtime/perl/lib/Clownfish/Blob.pm @@ -0,0 +1,25 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +package Clownfish::Blob; +use Clownfish; +our $VERSION = '0.004000'; +$VERSION = eval $VERSION; + +1; + +__END__ + + http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/911bcb75/runtime/perl/t/018-host.t ---------------------------------------------------------------------- diff --git a/runtime/perl/t/018-host.t b/runtime/perl/t/018-host.t index 5a79eff..050a010 100644 --- a/runtime/perl/t/018-host.t +++ b/runtime/perl/t/018-host.t @@ -30,7 +30,7 @@ is_deeply( $transformed, \%complex_data_structure, "transform from Perl to Clownfish data structures and back" ); my $bread_and_butter = Clownfish::Hash->new; -$bread_and_butter->store( 'bread', Clownfish::ByteBuf->new('butter') ); +$bread_and_butter->store( 'bread', Clownfish::Blob->new('butter') ); my $salt_and_pepper = Clownfish::Hash->new; $salt_and_pepper->store( 'salt', Clownfish::ByteBuf->new('pepper') ); $complex_data_structure{c} = $bread_and_butter; http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/911bcb75/runtime/perl/xs/XSBind.c ---------------------------------------------------------------------- diff --git a/runtime/perl/xs/XSBind.c b/runtime/perl/xs/XSBind.c index df069c9..fd5fd09 100644 --- a/runtime/perl/xs/XSBind.c +++ b/runtime/perl/xs/XSBind.c @@ -150,6 +150,9 @@ XSBind_cfish_to_perl(pTHX_ cfish_Obj *obj) { else if (CFISH_Obj_Is_A(obj, CFISH_STRING)) { return XSBind_str_to_sv(aTHX_ (cfish_String*)obj); } + else if (CFISH_Obj_Is_A(obj, CFISH_BLOB)) { + return XSBind_blob_to_sv(aTHX_ (cfish_Blob*)obj); + } else if (CFISH_Obj_Is_A(obj, CFISH_BYTEBUF)) { return XSBind_bb_to_sv(aTHX_ (cfish_ByteBuf*)obj); } @@ -232,6 +235,13 @@ XSBind_perl_to_cfish(pTHX_ SV *sv) { } SV* +XSBind_blob_to_sv(pTHX_ cfish_Blob *blob) { + return blob + ? newSVpvn(CFISH_Blob_Get_Buf(blob), CFISH_Blob_Get_Size(blob)) + : newSV(0); +} + +SV* XSBind_bb_to_sv(pTHX_ cfish_ByteBuf *bb) { return bb ? newSVpvn(CFISH_BB_Get_Buf(bb), CFISH_BB_Get_Size(bb)) http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/911bcb75/runtime/perl/xs/XSBind.h ---------------------------------------------------------------------- diff --git a/runtime/perl/xs/XSBind.h b/runtime/perl/xs/XSBind.h index b1c7b22..4b48167 100644 --- a/runtime/perl/xs/XSBind.h +++ b/runtime/perl/xs/XSBind.h @@ -21,6 +21,7 @@ #define H_CFISH_XSBIND 1 #include "Clownfish/Obj.h" +#include "Clownfish/Blob.h" #include "Clownfish/ByteBuf.h" #include "Clownfish/String.h" #include "Clownfish/Err.h" @@ -117,8 +118,9 @@ cfish_XSBind_cfish_obj_to_sv_noinc(pTHX_ cfish_Obj *obj) { cfish_XSBind_cfish_obj_to_sv_noinc(aTHX_ (cfish_Obj*)_obj) /** Deep conversion of Clownfish objects to Perl objects -- Strings to UTF-8 - * SVs, ByteBufs to SVs, Vectors to Perl array refs, Hashes to Perl hashrefs, - * and any other object to a Perl object wrapping the Clownfish Obj. + * SVs, Blobs to SVs, ByteBufs to SVs, Vectors to Perl array refs, Hashes to + * Perl hashrefs, and any other object to a Perl object wrapping the Clownfish + * Obj. */ CFISH_VISIBLE SV* cfish_XSBind_cfish_to_perl(pTHX_ cfish_Obj *obj); @@ -130,6 +132,11 @@ cfish_XSBind_cfish_to_perl(pTHX_ cfish_Obj *obj); CFISH_VISIBLE cfish_Obj* cfish_XSBind_perl_to_cfish(pTHX_ SV *sv); +/** Convert a Blob into a new string SV. + */ +CFISH_VISIBLE SV* +cfish_XSBind_blob_to_sv(pTHX_ cfish_Blob *blob); + /** Convert a ByteBuf into a new string SV. */ CFISH_VISIBLE SV* @@ -317,6 +324,7 @@ cfish_XSBind_allot_params(pTHX_ SV** stack, int32_t start, #define XSBind_cfish_obj_to_sv_noinc cfish_XSBind_cfish_obj_to_sv_noinc #define XSBind_cfish_to_perl cfish_XSBind_cfish_to_perl #define XSBind_perl_to_cfish cfish_XSBind_perl_to_cfish +#define XSBind_blob_to_sv cfish_XSBind_blob_to_sv #define XSBind_bb_to_sv cfish_XSBind_bb_to_sv #define XSBind_str_to_sv cfish_XSBind_str_to_sv #define XSBind_trap cfish_XSBind_trap
