New XS framework for C and C++ code

This commit is contained in:
Alessandro Ranellucci 2013-06-22 17:16:45 +02:00
parent c88d8a5842
commit 9d27b5e4a7
18 changed files with 7889 additions and 0 deletions

View File

@ -59,6 +59,7 @@ foreach my $module (sort keys %modules) {
my $version = $modules{$module};
system $cpanm, '--sudo', "$module~$version";
}
system $cpanm, '--sudo', '--reinstall', './xs';
if (eval "use App::Prove; 1") {
App::Prove->new->run;

41
xs/Build.PL Normal file
View File

@ -0,0 +1,41 @@
#!/usr/bin/perl -w
use strict;
use warnings;
use Module::Build::WithXSpp;
my $build = Module::Build::WithXSpp->new(
module_name => 'Slic3r::XS',
dist_abstract => 'XS code for Slic3r',
build_requires => {qw(
ExtUtils::Typemaps::Default 0.05
ExtUtils::XSpp 0.16
Module::Build 0.3601
Test::More 0
)},
configure_requires => {qw(
ExtUtils::CppGuess 0.07
Module::Build 0.38
Module::Build::WithXSpp 0.10
)},
# HAS_BOOL : stops Perl/lib/CORE/handy.h from doing "# define bool char" for MSVC
extra_compiler_flags => [qw(-DHAS_BOOL)],
# Provides extra C typemaps that are auto-merged
extra_typemap_modules => {
'ExtUtils::Typemaps::Default' => '0.05',
},
# for MSVC builds
early_includes => [qw(
cstring
cstdlib
ostream
)]
);
$build->create_build_script;
__END__

11
xs/MANIFEST Normal file
View File

@ -0,0 +1,11 @@
Build.PL
lib/Slic3r/TriangleMesh/XS.pm
lib/Slic3r/XS.pm
MANIFEST This list of files
src/myinit.h
src/ppport.h
t/01_trianglemesh.t
xsp/mytype.map
xsp/TriangleMesh.xsp
xsp/typemap.xspt
xsp/XS.xsp

15
xs/MANIFEST.SKIP.bak Normal file
View File

@ -0,0 +1,15 @@
#!include_default
# Avoid configuration metadata file
^MYMETA\.
# Avoid Module::Build generated and utility files.
\bBuild$
\bBuild.bat$
\b_build
\bBuild.COM$
\bBUILD.COM$
\bbuild.com$
^MANIFEST\.SKIP
# Avoid archives of this distribution
\bSlic3r-XS-[\d\.\_]+

11
xs/MANIFEST.bak Normal file
View File

@ -0,0 +1,11 @@
Build.PL
lib/Slic3r/TriangleMesh/XS.pm
lib/Slic3r/XS.pm
MANIFEST This list of files
src/myinit.h
src/ppport.h
t/01_trianglemesh.t
xsp/mytype.map
xsp/TriangleMesh.xsp
xsp/typemap.xspt
xsp/XS.xsp

236
xs/buildtmp/XS.c Normal file
View File

@ -0,0 +1,236 @@
/*
* This file was generated automatically by ExtUtils::ParseXS version 3.15 from the
* contents of main.xs. Do not edit this file, edit main.xs instead.
*
* ANY CHANGES MADE HERE WILL BE LOST!
*
*/
#line 1 "buildtmp/main.xs"
/*
* WARNING: This file was auto-generated. Changes will be lost!
*/
#include <cstring>
#include <cstdlib>
#include <ostream>
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#undef do_open
#undef do_close
#ifdef __cplusplus
}
#endif
#line 32 "buildtmp/XS.c"
#ifndef PERL_UNUSED_VAR
# define PERL_UNUSED_VAR(var) if (0) var = var
#endif
#ifndef dVAR
# define dVAR dNOOP
#endif
/* This stuff is not part of the API! You have been warned. */
#ifndef PERL_VERSION_DECIMAL
# define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s)
#endif
#ifndef PERL_DECIMAL_VERSION
# define PERL_DECIMAL_VERSION \
PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION)
#endif
#ifndef PERL_VERSION_GE
# define PERL_VERSION_GE(r,v,s) \
(PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s))
#endif
#ifndef PERL_VERSION_LE
# define PERL_VERSION_LE(r,v,s) \
(PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s))
#endif
/* XS_INTERNAL is the explicit static-linkage variant of the default
* XS macro.
*
* XS_EXTERNAL is the same as XS_INTERNAL except it does not include
* "STATIC", ie. it exports XSUB symbols. You probably don't want that
* for anything but the BOOT XSUB.
*
* See XSUB.h in core!
*/
/* TODO: This might be compatible further back than 5.10.0. */
#if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1)
# undef XS_EXTERNAL
# undef XS_INTERNAL
# if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING)
# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name)
# define XS_INTERNAL(name) STATIC XSPROTO(name)
# endif
# if defined(__SYMBIAN32__)
# define XS_EXTERNAL(name) EXPORT_C XSPROTO(name)
# define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name)
# endif
# ifndef XS_EXTERNAL
# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus)
# define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__)
# define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__)
# else
# ifdef __cplusplus
# define XS_EXTERNAL(name) extern "C" XSPROTO(name)
# define XS_INTERNAL(name) static XSPROTO(name)
# else
# define XS_EXTERNAL(name) XSPROTO(name)
# define XS_INTERNAL(name) STATIC XSPROTO(name)
# endif
# endif
# endif
#endif
/* perl >= 5.10.0 && perl <= 5.15.1 */
/* The XS_EXTERNAL macro is used for functions that must not be static
* like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL
* macro defined, the best we can do is assume XS is the same.
* Dito for XS_INTERNAL.
*/
#ifndef XS_EXTERNAL
# define XS_EXTERNAL(name) XS(name)
#endif
#ifndef XS_INTERNAL
# define XS_INTERNAL(name) XS(name)
#endif
/* Now, finally, after all this mess, we want an ExtUtils::ParseXS
* internal macro that we're free to redefine for varying linkage due
* to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use
* XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to!
*/
#undef XS_EUPXS
#if defined(PERL_EUPXS_ALWAYS_EXPORT)
# define XS_EUPXS(name) XS_EXTERNAL(name)
#else
/* default to internal */
# define XS_EUPXS(name) XS_INTERNAL(name)
#endif
#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE
#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params)
/* prototype to pass -Wmissing-prototypes */
STATIC void
S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params);
STATIC void
S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
{
const GV *const gv = CvGV(cv);
PERL_ARGS_ASSERT_CROAK_XS_USAGE;
if (gv) {
const char *const gvname = GvNAME(gv);
const HV *const stash = GvSTASH(gv);
const char *const hvname = stash ? HvNAME(stash) : NULL;
if (hvname)
Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
else
Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
} else {
/* Pants. I don't think that it should be possible to get here. */
Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
}
}
#undef PERL_ARGS_ASSERT_CROAK_XS_USAGE
#ifdef PERL_IMPLICIT_CONTEXT
#define croak_xs_usage(a,b) S_croak_xs_usage(aTHX_ a,b)
#else
#define croak_xs_usage S_croak_xs_usage
#endif
#endif
/* NOTE: the prototype of newXSproto() is different in versions of perls,
* so we define a portable version of newXSproto()
*/
#ifdef newXS_flags
#define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0)
#else
#define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv)
#endif /* !defined(newXS_flags) */
#line 174 "buildtmp/XS.c"
/* INCLUDE_COMMAND: Including output of '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp' from 'main.xs' */
#include <exception>
XS_EUPXS(XS_Slic3r__TriangleMesh__XS_hello_world); /* prototype to pass -Wmissing-prototypes */
XS_EUPXS(XS_Slic3r__TriangleMesh__XS_hello_world)
{
dVAR; dXSARGS;
if (items != 0)
croak_xs_usage(cv, "");
{
std::string RETVAL;
#line 14 "/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp"
RETVAL = "Hello world!";
#line 191 "buildtmp/XS.c"
ST(0) = newSVpvn( RETVAL.c_str(), RETVAL.length() );
sv_2mortal(ST(0));
}
XSRETURN(1);
}
/* INCLUDE: Returning to 'main.xs' from '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp' */
/* INCLUDE_COMMAND: Including output of '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/XS.xsp' from 'main.xs' */
#include <exception>
#include <myinit.h>
/* INCLUDE: Returning to 'main.xs' from '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/XS.xsp' */
#ifdef __cplusplus
extern "C"
#endif
XS_EXTERNAL(boot_Slic3r__XS); /* prototype to pass -Wmissing-prototypes */
XS_EXTERNAL(boot_Slic3r__XS)
{
dVAR; dXSARGS;
#if (PERL_REVISION == 5 && PERL_VERSION < 9)
char* file = __FILE__;
#else
const char* file = __FILE__;
#endif
PERL_UNUSED_VAR(cv); /* -W */
PERL_UNUSED_VAR(items); /* -W */
#ifdef XS_APIVERSION_BOOTCHECK
XS_APIVERSION_BOOTCHECK;
#endif
XS_VERSION_BOOTCHECK;
newXS("Slic3r::TriangleMesh::XS::hello_world", XS_Slic3r__TriangleMesh__XS_hello_world, file);
#if (PERL_REVISION == 5 && PERL_VERSION >= 9)
if (PL_unitcheckav)
call_list(PL_scopestack_ix, PL_unitcheckav);
#endif
XSRETURN_YES;
}

BIN
xs/buildtmp/XS.o Normal file

Binary file not shown.

27
xs/buildtmp/main.xs Normal file
View File

@ -0,0 +1,27 @@
/*
* WARNING: This file was auto-generated. Changes will be lost!
*/
#include <cstring>
#include <cstdlib>
#include <ostream>
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#undef do_open
#undef do_close
#ifdef __cplusplus
}
#endif
MODULE = Slic3r::XS PACKAGE = Slic3r::XS
INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp
INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/XS.xsp

429
xs/buildtmp/typemap Normal file
View File

@ -0,0 +1,429 @@
TYPEMAP
int T_IV
signed int T_IV
short T_IV
signed short T_IV
long T_IV
signed long T_IV
char T_IV
signed char T_IV
short int T_IV
signed short int T_IV
long int T_IV
signed long int T_IV
long long T_IV
signed long long T_IV
time_t T_IV
Sint16 T_IV
Sint32 T_IV
Sint64 T_IV
unsigned int T_UV
unsigned short T_UV
unsigned long T_UV
unsigned char T_UV
unsigned short int T_UV
unsigned long int T_UV
unsigned long long T_UV
unsigned T_UV
Uint16 T_UV
Uint32 T_UV
Uint64 T_UV
size_t T_UV
bool T_UV
float T_NV
double T_NV
long double T_NV
const int T_IV
const signed int T_IV
const short T_IV
const signed short T_IV
const long T_IV
const signed long T_IV
const char T_IV
const signed char T_IV
const short int T_IV
const signed short int T_IV
const long int T_IV
const signed long int T_IV
const long long T_IV
const signed long long T_IV
const time_t T_IV
const Sint16 T_IV
const Sint32 T_IV
const Sint64 T_IV
const unsigned int T_UV
const unsigned short T_UV
const unsigned long T_UV
const unsigned char T_UV
const unsigned short int T_UV
const unsigned long int T_UV
const unsigned long long T_UV
const unsigned T_UV
const Uint16 T_UV
const Uint32 T_UV
const Uint64 T_UV
const size_t T_UV
const bool T_UV
const float T_NV
const double T_NV
const long double T_NV
HV * T_HvRV
AV * T_AvRV
std::string T_STD_STRING
std::string* T_STD_STRING_PTR
std::vector< double >* T_STD_VECTOR_DOUBLE_PTR
std::vector<double>* T_STD_VECTOR_DOUBLE_PTR
std::vector< double > T_STD_VECTOR_DOUBLE
std::vector<double> T_STD_VECTOR_DOUBLE
std::vector< int >* T_STD_VECTOR_INT_PTR
std::vector<int>* T_STD_VECTOR_INT_PTR
std::vector< int > T_STD_VECTOR_INT
std::vector<int> T_STD_VECTOR_INT
std::vector< unsigned int >* T_STD_VECTOR_UINT_PTR
std::vector<unsigned int>* T_STD_VECTOR_UINT_PTR
std::vector< unsigned int > T_STD_VECTOR_UINT
std::vector<unsigned int> T_STD_VECTOR_UINT
std::vector<std::string> T_STD_VECTOR_STD_STRING
std::vector<std::string>* T_STD_VECTOR_STD_STRING_PTR
std::vector<char*> T_STD_VECTOR_CSTRING
std::vector<char*>* T_STD_VECTOR_CSTRING_PTR
INPUT
O_OBJECT
if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
$var = ($type)SvIV((SV*)SvRV( $arg ));
else{
warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
XSRETURN_UNDEF;
}
T_OBJECT
if( SvROK($arg) )
$var = ($type)SvIV((SV*)SvRV( $arg ));
else{
warn( \"${Package}::$func_name() -- $var is not an SV reference\" );
XSRETURN_UNDEF;
}
O_HvRV
if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVHV) )
$var = (HV*)SvRV( $arg );
else {
warn( \"${Package}::$func_name() -- $var is not a blessed HV reference\" );
XSRETURN_UNDEF;
}
T_HvRV
if( SvROK($arg) && (SvTYPE(SvRV($arg)) == SVt_PVHV) )
$var = (HV*)SvRV( $arg );
else {
warn( \"${Package}::$func_name() -- $var is not an HV reference\" );
XSRETURN_UNDEF;
}
O_AvRV
if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVAV) )
$var = (AV*)SvRV( $arg );
else {
warn( \"${Package}::$func_name() -- $var is not a blessed AV reference\" );
XSRETURN_UNDEF;
}
T_AvRV
if( SvROK($arg) && (SvTYPE(SvRV($arg)) == SVt_PVAV) )
$var = (AV*)SvRV( $arg );
else {
warn( \"${Package}::$func_name() -- $var is not an AV reference\" );
XSRETURN_UNDEF;
}
T_STD_STRING
$var = std::string( SvPV_nolen( $arg ), SvCUR( $arg ) );
T_STD_STRING_PTR
$var = new std::string( SvPV_nolen( $arg ), SvCUR( $arg ) );
T_STD_VECTOR_DOUBLE
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = std::vector<double>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL)
${var}[i] = SvNV(*elem);
else
${var}[i] = 0.;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_DOUBLE_PTR
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = new std::vector<double>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL)
(*$var)[i] = SvNV(*elem);
else
(*$var)[i] = 0.;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_INT
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = std::vector<int>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL)
${var}[i] = SvIV(*elem);
else
${var}[i] = 0;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_INT_PTR
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = new std::vector<int>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL)
(*$var)[i] = SvIV(*elem);
else
(*$var)[i] = 0.;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_UINT
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = std::vector<unsigned int>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL)
${var}[i] = SvUV(*elem);
else
${var}[i] = 0;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_UINT_PTR
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = new std::vector<unsigned int>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL)
(*$var)[i] = SvUV(*elem);
else
(*$var)[i] = 0.;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_STD_STRING
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int alen = av_len(av)+1;
$var = std::vector<std::string>(alen);
STRLEN len;
char* tmp;
SV** elem;
for (unsigned int i = 0; i < alen; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL) {
tmp = SvPV(*elem, len);
${var}[i] = std::string(tmp, len);
}
else
${var}[i] = std::string(\"\");
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_STD_STRING_PTR
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int alen = av_len(av)+1;
$var = new std::vector<std::string>(alen);
STRLEN len;
char* tmp;
SV** elem;
for (unsigned int i = 0; i < alen; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL) {
tmp = SvPV(*elem, len);
(*$var)[i] = std::string(tmp, len);
}
else
(*$var)[i] = std::string(\"\");
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_CSTRING
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = std::vector<char*>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL) {
${var}[i] = SvPV_nolen(*elem);
else
${var}[i] = NULL;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
T_STD_VECTOR_CSTRING_PTR
if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$var = new std::vector<char*>(len);
SV** elem;
for (unsigned int i = 0; i < len; i++) {
elem = av_fetch(av, i, 0);
if (elem != NULL) {
(*$var)[i] = SvPV_nolen(*elem);
else
(*$var)[i] = NULL;
}
}
else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
OUTPUT
O_OBJECT
sv_setref_pv( $arg, CLASS, (void*)$var );
T_OBJECT
sv_setref_pv( $arg, Nullch, (void*)$var );
O_HvRV
$arg = sv_bless( newRV((SV*)$var), gv_stashpv(CLASS,1) );
T_HvRV
$arg = newRV((SV*)$var);
O_AvRV
$arg = sv_bless( newRV((SV*)$var), gv_stashpv(CLASS,1) );
T_AvRV
$arg = newRV((SV*)$var);
T_STD_STRING
$arg = newSVpvn( $var.c_str(), $var.length() );
T_STD_STRING_PTR
$arg = newSVpvn( $var->c_str(), $var->length() );
T_STD_VECTOR_DOUBLE
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var.size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
av_store(av, i, newSVnv(${var}[i]));
}
T_STD_VECTOR_DOUBLE_PTR
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var->size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
av_store(av, i, newSVnv((*$var)[i]));
}
T_STD_VECTOR_INT
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var.size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
av_store(av, i, newSViv(${var}[i]));
}
T_STD_VECTOR_INT_PTR
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var->size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
av_store(av, i, newSViv((*$var)[i]));
}
T_STD_VECTOR_UINT
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var.size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
av_store(av, i, newSVuv(${var}[i]));
}
T_STD_VECTOR_UINT_PTR
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var->size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
av_store(av, i, newSVuv((*$var)[i]));
}
T_STD_VECTOR_STD_STRING
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var.size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
const std::string& str = ${var}[i];
STRLEN len = str.length();
av_store(av, i, newSVpv(str.c_str(), len));
}
T_STD_VECTOR_STD_STRING_PTR
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var->size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
const std::string& str = (*$var)[i];
STRLEN len = str.length();
av_store(av, i, newSVpv(str.c_str(), len));
}
T_STD_VECTOR_CSTRING
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var.size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
STRLEN len = strlen(${var}[i]);
av_store(av, i, newSVpv(${var}[i], len));
}
T_STD_VECTOR_CSTRING_PTR
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var->size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
STRLEN len = strlen((*$var)[i]);
av_store(av, i, newSVpv((*$var)[i], len));
}

View File

@ -0,0 +1,10 @@
package Slic3r::TriangleMesh::XS;
use warnings;
use strict;
our $VERSION = '0.01';
use XSLoader;
XSLoader::load(__PACKAGE__, $VERSION);
1;

11
xs/lib/Slic3r/XS.pm Normal file
View File

@ -0,0 +1,11 @@
package Slic3r::XS;
use warnings;
use strict;
our $VERSION = '0.01';
use XSLoader;
XSLoader::load(__PACKAGE__, $VERSION);
1;

0
xs/src/myinit.h Normal file
View File

7063
xs/src/ppport.h Normal file

File diff suppressed because it is too large Load Diff

12
xs/t/01_trianglemesh.t Normal file
View File

@ -0,0 +1,12 @@
#!/usr/bin/perl
use strict;
use warnings;
use Slic3r::XS;
use Test::More tests => 1;
is Slic3r::TriangleMesh::XS::hello_world(), 'Hello world!',
'hello world';
__END__

14
xs/xsp/TriangleMesh.xsp Normal file
View File

@ -0,0 +1,14 @@
%module{Slic3r::TriangleMesh::XS};
%package{Slic3r::TriangleMesh::XS};
%{
PROTOTYPES: DISABLE
std::string
hello_world()
CODE:
RETVAL = "Hello world!";
OUTPUT:
RETVAL
%}

6
xs/xsp/XS.xsp Normal file
View File

@ -0,0 +1,6 @@
%module{Slic3r::XS};
%package{Slic3r::XS};
%{
#include <myinit.h>
%}

0
xs/xsp/mytype.map Normal file
View File

2
xs/xsp/typemap.xspt Normal file
View File

@ -0,0 +1,2 @@
%typemap{std::string}{simple};
%typemap{std::string&}{reference};