Fixed [ 827907 ] argout objects not being wrapped properly (PATH).
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@5213 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
7ba2933d2f
commit
77d05524a9
4 changed files with 81 additions and 222 deletions
|
|
@ -132,7 +132,7 @@
|
|||
|
||||
%typemap(out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &
|
||||
"ST(argvi) = sv_newmortal();
|
||||
SWIG_MakePtr(ST(argvi++), (void *) $1, $1_descriptor,0);";
|
||||
SWIG_MakePtr(ST(argvi++), (void *) $1, $1_descriptor, $shadow|$owner);";
|
||||
|
||||
|
||||
%typemap(out) SWIGTYPE
|
||||
|
|
@ -140,14 +140,14 @@
|
|||
{
|
||||
$&1_ltype resultobj = new $1_ltype(($1_ltype &)$1);
|
||||
ST(argvi) = sv_newmortal();
|
||||
SWIG_MakePtr(ST(argvi++), (void *) resultobj, $&1_descriptor,0);
|
||||
SWIG_MakePtr(ST(argvi++), (void *) resultobj, $&1_descriptor, $shadow|$owner);
|
||||
}
|
||||
#else
|
||||
{
|
||||
$&1_ltype resultobj = ($&1_ltype) malloc(sizeof($1_type));
|
||||
memmove(resultobj, &$1, sizeof($1_type));
|
||||
ST(argvi) = sv_newmortal();
|
||||
SWIG_MakePtr(ST(argvi++), (void *) resultobj, $&1_descriptor,0);
|
||||
SWIG_MakePtr(ST(argvi++), (void *) resultobj, $&1_descriptor, $shadow|$owner);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -156,7 +156,7 @@
|
|||
%typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC {
|
||||
swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1);
|
||||
ST(argvi) = sv_newmortal();
|
||||
SWIG_MakePtr(ST(argvi++), (void *) $1, ty,0);
|
||||
SWIG_MakePtr(ST(argvi++), (void *) $1, ty, $shadow|$owner);
|
||||
}
|
||||
|
||||
%typemap(out) void "";
|
||||
|
|
|
|||
|
|
@ -119,6 +119,9 @@ typedef int (*SwigMagicFuncHack)(struct interpreter *, SV *, MAGIC *);
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define SWIG_OWNER 1
|
||||
#define SWIG_SHADOW 2
|
||||
|
||||
#ifdef SWIG_NOINCLUDE
|
||||
|
||||
#ifndef PERL_OBJECT
|
||||
|
|
@ -246,7 +249,31 @@ SWIGRUNTIME(void)
|
|||
SWIG_MakePtr_(CPerlObj *pPerl, SV *sv, void *ptr, swig_type_info *t, int flags)
|
||||
#endif
|
||||
{
|
||||
sv_setref_pv(sv, (char *) t->name, ptr);
|
||||
if (ptr && (flags & SWIG_SHADOW)) {
|
||||
SV *self;
|
||||
SV *obj=newSV(0);
|
||||
HV *hash=newHV();
|
||||
HV *stash;
|
||||
sv_setref_pv(obj, (char *) t->name, ptr);
|
||||
stash=SvSTASH(SvRV(obj));
|
||||
if (flags & SWIG_OWNER) {
|
||||
HV *hv;
|
||||
GV *gv=*(GV**)hv_fetch(stash, "OWNER", 5, TRUE);
|
||||
if (!isGV(gv))
|
||||
gv_init(gv, stash, "OWNER", 5, FALSE);
|
||||
hv=GvHVn(gv);
|
||||
hv_store_ent(hv, obj, newSViv(1), 0);
|
||||
}
|
||||
sv_magic((SV *)hash, (SV *)obj, PERL_MAGIC_tied, Nullch, 0);
|
||||
SvREFCNT_dec(obj);
|
||||
self=newRV_noinc((SV *)hash);
|
||||
sv_setsv(sv, self);
|
||||
SvREFCNT_dec((SV *)self);
|
||||
sv_bless(sv, stash);
|
||||
}
|
||||
else {
|
||||
sv_setref_pv(sv, (char *) t->name, ptr);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ namespace std {
|
|||
for (unsigned int i=0; i<len; i++) {
|
||||
svs[i] = sv_newmortal();
|
||||
SWIG_MakePtr(svs[i], (void*)&($1[i]),
|
||||
$descriptor(T *), 0);
|
||||
$descriptor(T *), $shadow|$owner);
|
||||
}
|
||||
AV *myav = av_make(len, svs);
|
||||
delete[] svs;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue