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};
|
my $version = $modules{$module};
|
||||||
system $cpanm, '--sudo', "$module~$version";
|
system $cpanm, '--sudo', "$module~$version";
|
||||||
}
|
}
|
||||||
|
system $cpanm, '--sudo', '--reinstall', './xs';
|
||||||
|
|
||||||
if (eval "use App::Prove; 1") {
|
if (eval "use App::Prove; 1") {
|
||||||
App::Prove->new->run;
|
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