New XS framework for C and C++ code
This commit is contained in:
parent
c88d8a5842
commit
9d27b5e4a7
1
Build.PL
1
Build.PL
@ -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
41
xs/Build.PL
Normal 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
11
xs/MANIFEST
Normal 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
15
xs/MANIFEST.SKIP.bak
Normal 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
11
xs/MANIFEST.bak
Normal 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
236
xs/buildtmp/XS.c
Normal 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
BIN
xs/buildtmp/XS.o
Normal file
Binary file not shown.
27
xs/buildtmp/main.xs
Normal file
27
xs/buildtmp/main.xs
Normal 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
429
xs/buildtmp/typemap
Normal 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));
|
||||
}
|
10
xs/lib/Slic3r/TriangleMesh/XS.pm
Normal file
10
xs/lib/Slic3r/TriangleMesh/XS.pm
Normal 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
11
xs/lib/Slic3r/XS.pm
Normal 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
0
xs/src/myinit.h
Normal file
7063
xs/src/ppport.h
Normal 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
12
xs/t/01_trianglemesh.t
Normal 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
14
xs/xsp/TriangleMesh.xsp
Normal 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
6
xs/xsp/XS.xsp
Normal file
@ -0,0 +1,6 @@
|
||||
%module{Slic3r::XS};
|
||||
%package{Slic3r::XS};
|
||||
|
||||
%{
|
||||
#include <myinit.h>
|
||||
%}
|
0
xs/xsp/mytype.map
Normal file
0
xs/xsp/mytype.map
Normal file
2
xs/xsp/typemap.xspt
Normal file
2
xs/xsp/typemap.xspt
Normal file
@ -0,0 +1,2 @@
|
||||
%typemap{std::string}{simple};
|
||||
%typemap{std::string&}{reference};
|
Loading…
Reference in New Issue
Block a user