Add "freearg" template
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10037 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
7037fecf7e
commit
54f0b11ddf
2 changed files with 47 additions and 10 deletions
28
Lib/r/r.swg
28
Lib/r/r.swg
|
|
@ -96,24 +96,38 @@ SWIG_InitializeModule(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
%typemap(in,noblock=1) char* {
|
%typemap(in,noblock=1) char* {
|
||||||
$1 = %reinterpret_cast(%const_cast(CHAR(STRING_ELT($input, 0)),
|
$1 = %reinterpret_cast(strdup(CHAR(STRING_ELT($input, 0))), $1_ltype);
|
||||||
char *), $1_ltype);
|
}
|
||||||
|
|
||||||
|
%typemap(freearg,noblock=1) char* {
|
||||||
|
free($1);
|
||||||
}
|
}
|
||||||
|
|
||||||
%typemap(in,noblock=1) char *[ANY] {
|
%typemap(in,noblock=1) char *[ANY] {
|
||||||
$1 = %reinterpret_cast(%const_cast(CHAR(STRING_ELT($input, 0)),
|
$1 = %reinterpret_cast(strdup(CHAR(STRING_ELT($input, 0))), $1_ltype);
|
||||||
char *),
|
}
|
||||||
$1_ltype);
|
|
||||||
|
%typemap(freearg,noblock=1) char *[ANY] {
|
||||||
|
free($1);
|
||||||
}
|
}
|
||||||
|
|
||||||
%typemap(in,noblock=1) char[ANY] {
|
%typemap(in,noblock=1) char[ANY] {
|
||||||
$1 = %const_cast(CHAR(STRING_ELT($input, 0)), char *);
|
$1 = strdup(CHAR(STRING_ELT($input, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
%typemap(freearg,noblock=1) char[ANY] {
|
||||||
|
free($1);
|
||||||
}
|
}
|
||||||
|
|
||||||
%typemap(in,noblock=1) char[] {
|
%typemap(in,noblock=1) char[] {
|
||||||
$1 = %const_cast(CHAR(STRING_ELT($input, 0)), char *);
|
$1 = strdup(CHAR(STRING_ELT($input, 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
%typemap(freearg,noblock=1) char[] {
|
||||||
|
free($1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
%typemap(memberin) char[] %{
|
%typemap(memberin) char[] %{
|
||||||
if ($input) strcpy($1, $input);
|
if ($input) strcpy($1, $input);
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -1766,6 +1766,7 @@ int R::functionWrapper(Node *n) {
|
||||||
String *s_inputTypes = NewString("");
|
String *s_inputTypes = NewString("");
|
||||||
String *s_inputMap = NewString("");
|
String *s_inputMap = NewString("");
|
||||||
bool inFirstArg = true;
|
bool inFirstArg = true;
|
||||||
|
bool inFirstType = true;
|
||||||
Parm *curP;
|
Parm *curP;
|
||||||
for (p =l, i = 0 ; i < nargs ; i++) {
|
for (p =l, i = 0 ; i < nargs ; i++) {
|
||||||
|
|
||||||
|
|
@ -1897,8 +1898,9 @@ int R::functionWrapper(Node *n) {
|
||||||
if(tm) {
|
if(tm) {
|
||||||
replaceRClass(tm, Getattr(curP, "type"));
|
replaceRClass(tm, Getattr(curP, "type"));
|
||||||
}
|
}
|
||||||
Printf(s_inputTypes, "'%s'%s", tm, p ? ", " : "");
|
Printf(s_inputTypes, "%s'%s'", inFirstType ? "" : ", ", tm);
|
||||||
Printf(s_inputMap, "%s='%s'%s", name, tm, p ? ", " : "");
|
Printf(s_inputMap, "%s%s='%s'", inFirstType ? "" : ", ", name, tm);
|
||||||
|
inFirstType = false;
|
||||||
|
|
||||||
if(funcptr_name)
|
if(funcptr_name)
|
||||||
Delete(funcptr_name);
|
Delete(funcptr_name);
|
||||||
|
|
@ -1914,6 +1916,20 @@ int R::functionWrapper(Node *n) {
|
||||||
Printv(f->def, ")\n{\n", NIL);
|
Printv(f->def, ")\n{\n", NIL);
|
||||||
Printv(sfun->def, ")\n{\n", NIL);
|
Printv(sfun->def, ")\n{\n", NIL);
|
||||||
|
|
||||||
|
|
||||||
|
/* Insert cleanup code */
|
||||||
|
String *cleanup = NewString("");
|
||||||
|
for (p = l; p;) {
|
||||||
|
if ((tm = Getattr(p, "tmap:freearg"))) {
|
||||||
|
Replaceall(tm, "$source", Getattr(p, "lname"));
|
||||||
|
Printv(cleanup, tm, "\n", NIL);
|
||||||
|
p = Getattr(p, "tmap:freearg:next");
|
||||||
|
} else {
|
||||||
|
p = nextSibling(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
emit_action(n, f);
|
emit_action(n, f);
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1994,10 +2010,17 @@ int R::functionWrapper(Node *n) {
|
||||||
Insert(outargs, 0, tmp);
|
Insert(outargs, 0, tmp);
|
||||||
Delete(tmp);
|
Delete(tmp);
|
||||||
|
|
||||||
Printf(f->code, "%s", outargs);
|
|
||||||
|
|
||||||
|
Printv(f->code, outargs, NIL);
|
||||||
Delete(outargs);
|
Delete(outargs);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Output cleanup code */
|
||||||
|
Printv(f->code, cleanup, NIL);
|
||||||
|
Delete(cleanup);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Printv(f->code, UnProtectWrapupCode, NIL);
|
Printv(f->code, UnProtectWrapupCode, NIL);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue