fix cleanup for ruby and make the process similar in python and tcl
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@7685 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
3aac30b168
commit
5af71f22b3
3 changed files with 55 additions and 12 deletions
|
|
@ -1350,8 +1350,10 @@ public:
|
||||||
/* Insert cleanup code */
|
/* Insert cleanup code */
|
||||||
for (p = l; p;) {
|
for (p = l; p;) {
|
||||||
if (!checkAttribute(p,"tmap:in:numinputs","0") && (tm = Getattr(p,"tmap:freearg"))) {
|
if (!checkAttribute(p,"tmap:in:numinputs","0") && (tm = Getattr(p,"tmap:freearg"))) {
|
||||||
Replaceall(tm,"$source",Getattr(p,"lname"));
|
if (Len(tm) != 0) {
|
||||||
Printv(cleanup,tm,"\n",NIL);
|
Replaceall(tm,"$source",Getattr(p,"lname"));
|
||||||
|
Printv(cleanup,tm,"\n",NIL);
|
||||||
|
}
|
||||||
p = Getattr(p,"tmap:freearg:next");
|
p = Getattr(p,"tmap:freearg:next");
|
||||||
} else {
|
} else {
|
||||||
p = nextSibling(p);
|
p = nextSibling(p);
|
||||||
|
|
@ -1487,7 +1489,11 @@ public:
|
||||||
Printv(f->code,outarg,NIL);
|
Printv(f->code,outarg,NIL);
|
||||||
|
|
||||||
/* Output cleanup code */
|
/* Output cleanup code */
|
||||||
Printv(f->code,cleanup,NIL);
|
int need_cleanup = Len(cleanup) != 0;
|
||||||
|
if (need_cleanup) {
|
||||||
|
Printf(f->code,"cleanup:\n");
|
||||||
|
Printv(f->code,cleanup,NIL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Look to see if there is any newfree cleanup code */
|
/* Look to see if there is any newfree cleanup code */
|
||||||
if (GetFlag(n,"feature:new")) {
|
if (GetFlag(n,"feature:new")) {
|
||||||
|
|
@ -1508,8 +1514,15 @@ public:
|
||||||
/* Error handling code */
|
/* Error handling code */
|
||||||
|
|
||||||
Printf(f->code,"fail:\n");
|
Printf(f->code,"fail:\n");
|
||||||
Printv(f->code,cleanup,NIL);
|
if (need_cleanup) {
|
||||||
Printf(f->code,"return NULL;\n");
|
Printf(f->code,"if (resultobj) Py_DECREF(resultobj);\n");
|
||||||
|
Printf(f->code,"resultobj = NULL;\n");
|
||||||
|
Printf(f->code,"goto cleanup;\n");
|
||||||
|
} else {
|
||||||
|
Printf(f->code,"return NULL;\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Printf(f->code,"}\n");
|
Printf(f->code,"}\n");
|
||||||
|
|
||||||
/* Substitute the cleanup code */
|
/* Substitute the cleanup code */
|
||||||
|
|
|
||||||
|
|
@ -904,8 +904,10 @@ public:
|
||||||
String *tm;
|
String *tm;
|
||||||
for (Parm *p = l; p; ) {
|
for (Parm *p = l; p; ) {
|
||||||
if (!checkAttribute(p,"tmap:in:numinputs","0") && (tm = Getattr(p,"tmap:freearg"))) {
|
if (!checkAttribute(p,"tmap:in:numinputs","0") && (tm = Getattr(p,"tmap:freearg"))) {
|
||||||
Replaceall(tm,"$source",Getattr(p,"lname"));
|
if (Len(tm) != 0) {
|
||||||
Printv(cleanup,tm,"\n",NIL);
|
Replaceall(tm,"$source",Getattr(p,"lname"));
|
||||||
|
Printv(cleanup,tm,"\n",NIL);
|
||||||
|
}
|
||||||
p = Getattr(p,"tmap:freearg:next");
|
p = Getattr(p,"tmap:freearg:next");
|
||||||
} else {
|
} else {
|
||||||
p = nextSibling(p);
|
p = nextSibling(p);
|
||||||
|
|
@ -1223,6 +1225,10 @@ public:
|
||||||
/* Now write code to make the function call */
|
/* Now write code to make the function call */
|
||||||
if (current != CONSTRUCTOR_ALLOCATE) {
|
if (current != CONSTRUCTOR_ALLOCATE) {
|
||||||
if (current == CONSTRUCTOR_INITIALIZE) {
|
if (current == CONSTRUCTOR_INITIALIZE) {
|
||||||
|
Node *pn = Swig_methodclass(n);
|
||||||
|
String *symname = Getattr(pn,"sym:name");
|
||||||
|
String *classname = NewStringf("const char *classname = \"%s::%s\"", module, symname);
|
||||||
|
Wrapper_add_local(f, "classname", classname);
|
||||||
String *action = Getattr(n,"wrap:action");
|
String *action = Getattr(n,"wrap:action");
|
||||||
if (action) {
|
if (action) {
|
||||||
Append(action,"DATA_PTR(self) = result;\n");
|
Append(action,"DATA_PTR(self) = result;\n");
|
||||||
|
|
@ -1306,8 +1312,12 @@ public:
|
||||||
Printv(f->code,outarg,NIL);
|
Printv(f->code,outarg,NIL);
|
||||||
|
|
||||||
/* Dump the argument cleanup code */
|
/* Dump the argument cleanup code */
|
||||||
if (current != CONSTRUCTOR_ALLOCATE)
|
int need_cleanup = (current != CONSTRUCTOR_ALLOCATE) && (Len(cleanup) != 0);
|
||||||
|
if (need_cleanup) {
|
||||||
|
Printv(f->code,"cleanup:\n",NIL);
|
||||||
Printv(f->code,cleanup,NIL);
|
Printv(f->code,cleanup,NIL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Look for any remaining cleanup. This processes the %new directive */
|
/* Look for any remaining cleanup. This processes the %new directive */
|
||||||
if (current != CONSTRUCTOR_ALLOCATE && GetFlag(n, "feature:new")) {
|
if (current != CONSTRUCTOR_ALLOCATE && GetFlag(n, "feature:new")) {
|
||||||
|
|
@ -1331,12 +1341,32 @@ public:
|
||||||
Printv(f->code, tab4, "return vresult;\n", NIL);
|
Printv(f->code, tab4, "return vresult;\n", NIL);
|
||||||
} else if (current == CONSTRUCTOR_INITIALIZE) {
|
} else if (current == CONSTRUCTOR_INITIALIZE) {
|
||||||
Printv(f->code, tab4, "return self;\n", NIL);
|
Printv(f->code, tab4, "return self;\n", NIL);
|
||||||
|
Printv(f->code,"fail:\n",NIL);
|
||||||
|
if (need_cleanup) {
|
||||||
|
Printv(f->code, tab4, "self = Qnil;\n", NIL);
|
||||||
|
Printv(f->code, tab4, "goto cleanup;\n", NIL);
|
||||||
|
} else {
|
||||||
|
Printv(f->code, tab4, "return Qnil;\n", NIL);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Wrapper_add_local(f,"vresult","VALUE vresult = Qnil");
|
Wrapper_add_local(f,"vresult","VALUE vresult = Qnil");
|
||||||
Printv(f->code, tab4, "return vresult;\n", NIL);
|
Printv(f->code, tab4, "return vresult;\n", NIL);
|
||||||
|
Printv(f->code,"fail:\n",NIL);
|
||||||
|
if (need_cleanup) {
|
||||||
|
Printv(f->code, tab4, "vresult = Qnil;\n", NIL);
|
||||||
|
Printv(f->code, tab4, "goto cleanup;\n", NIL);
|
||||||
|
} else {
|
||||||
|
Printv(f->code, tab4, "return Qnil;\n", NIL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Printv(f->code, tab4, "return Qnil;\n", NIL);
|
Printv(f->code, tab4, "return Qnil;\n", NIL);
|
||||||
|
Printv(f->code,"fail:\n",NIL);
|
||||||
|
if (need_cleanup) {
|
||||||
|
Printv(f->code, tab4, "goto cleanup;\n", NIL);
|
||||||
|
} else {
|
||||||
|
Printv(f->code, tab4, "return Qnil;\n", NIL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Error handling code */
|
/* Error handling code */
|
||||||
|
|
@ -1882,7 +1912,6 @@ public:
|
||||||
char *cname = Char(name);
|
char *cname = Char(name);
|
||||||
if(cname) cname[0] = toupper(cname[0]);
|
if(cname) cname[0] = toupper(cname[0]);
|
||||||
Printv(director_prot_ctor_code,
|
Printv(director_prot_ctor_code,
|
||||||
"char *classname = \"",module,"::",cname,"\";\n",
|
|
||||||
"if ( $comparison ) { /* subclassed */\n",
|
"if ( $comparison ) { /* subclassed */\n",
|
||||||
" $director_new \n",
|
" $director_new \n",
|
||||||
"} else {\n",
|
"} else {\n",
|
||||||
|
|
@ -1892,7 +1921,6 @@ public:
|
||||||
Delete(director_ctor_code);
|
Delete(director_ctor_code);
|
||||||
director_ctor_code = NewString("");
|
director_ctor_code = NewString("");
|
||||||
Printv(director_ctor_code,
|
Printv(director_ctor_code,
|
||||||
"char *classname = \"",module,"::",cname,"\";\n",
|
|
||||||
"if ( $comparison ) { /* subclassed */\n",
|
"if ( $comparison ) { /* subclassed */\n",
|
||||||
" $director_new \n",
|
" $director_new \n",
|
||||||
"} else {\n",
|
"} else {\n",
|
||||||
|
|
|
||||||
|
|
@ -420,8 +420,10 @@ public:
|
||||||
/* Insert cleanup code */
|
/* Insert cleanup code */
|
||||||
for (i = 0, p = parms; p; i++) {
|
for (i = 0, p = parms; p; i++) {
|
||||||
if (!checkAttribute(p,"tmap:in:numinputs","0") && (tm = Getattr(p,"tmap:freearg"))) {
|
if (!checkAttribute(p,"tmap:in:numinputs","0") && (tm = Getattr(p,"tmap:freearg"))) {
|
||||||
Replaceall(tm,"$source",Getattr(p,"lname"));
|
if (Len(tm) != 0) {
|
||||||
Printv(cleanup,tm,"\n",NIL);
|
Replaceall(tm,"$source",Getattr(p,"lname"));
|
||||||
|
Printv(cleanup,tm,"\n",NIL);
|
||||||
|
}
|
||||||
p = Getattr(p,"tmap:freearg:next");
|
p = Getattr(p,"tmap:freearg:next");
|
||||||
} else {
|
} else {
|
||||||
p = nextSibling(p);
|
p = nextSibling(p);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue