Return scoped_dohptr from get_wrapper_func_proto()
This ensures that the pointer is not leaked. Unfortunately it requires adding a dangerous, std::auto_ptr<>-like destructive copy ctor to scoped_dohptr<>, but there is no better solution without C++11.
This commit is contained in:
parent
e2738ad524
commit
02c52331cd
1 changed files with 15 additions and 7 deletions
|
|
@ -44,10 +44,20 @@ public:
|
||||||
explicit scoped_dohptr(DOH* obj) : obj_(obj) {}
|
explicit scoped_dohptr(DOH* obj) : obj_(obj) {}
|
||||||
~scoped_dohptr() { Delete(obj_); }
|
~scoped_dohptr() { Delete(obj_); }
|
||||||
|
|
||||||
|
// This is an std::auto_ptr<>-like "destructive" copy ctor which allows to return objects of this type from functions.
|
||||||
|
scoped_dohptr(scoped_dohptr const& tmp) : obj_(tmp.release()) {}
|
||||||
|
|
||||||
|
DOH* get() const { return obj_; }
|
||||||
|
|
||||||
|
DOH* release() const /* not really */ {
|
||||||
|
DOH* obj = obj_;
|
||||||
|
const_cast<DOH*&>(const_cast<scoped_dohptr*>(this)->obj_) = NULL;
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
operator DOH*() const { return obj_; }
|
operator DOH*() const { return obj_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
scoped_dohptr(scoped_dohptr const&);
|
|
||||||
scoped_dohptr& operator=(scoped_dohptr const&);
|
scoped_dohptr& operator=(scoped_dohptr const&);
|
||||||
|
|
||||||
DOH* const obj_;
|
DOH* const obj_;
|
||||||
|
|
@ -795,7 +805,7 @@ ready:
|
||||||
* If a non-null wrapper is specified, it is used to emit typemap-defined code in it and it also determines whether we're generating the prototype for the
|
* If a non-null wrapper is specified, it is used to emit typemap-defined code in it and it also determines whether we're generating the prototype for the
|
||||||
* declarations or the definitions, which changes the type used for the C++ objects.
|
* declarations or the definitions, which changes the type used for the C++ objects.
|
||||||
* ---------------------------------------------------------------------- */
|
* ---------------------------------------------------------------------- */
|
||||||
String *get_wrapper_func_proto(Node *n, Wrapper* wrapper = NULL)
|
scoped_dohptr get_wrapper_func_proto(Node *n, Wrapper* wrapper = NULL)
|
||||||
{
|
{
|
||||||
ParmList *parms = Getattr(n, "parms");
|
ParmList *parms = Getattr(n, "parms");
|
||||||
|
|
||||||
|
|
@ -887,7 +897,7 @@ ready:
|
||||||
}
|
}
|
||||||
|
|
||||||
Printv(proto, ")", NIL);
|
Printv(proto, ")", NIL);
|
||||||
return proto;
|
return scoped_dohptr(proto);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
|
@ -903,11 +913,10 @@ ready:
|
||||||
bool const is_global = IS_SET_TO_ONE(n, "c:globalfun");
|
bool const is_global = IS_SET_TO_ONE(n, "c:globalfun");
|
||||||
String *wname = is_global ? Swig_name_wrapper(name) : Copy(name);
|
String *wname = is_global ? Swig_name_wrapper(name) : Copy(name);
|
||||||
String *preturn_type = get_wrapper_func_return_type(output_wrapper_decl, n);
|
String *preturn_type = get_wrapper_func_return_type(output_wrapper_decl, n);
|
||||||
String *pproto = get_wrapper_func_proto(n);
|
|
||||||
String *wrapper_call = NewString("");
|
String *wrapper_call = NewString("");
|
||||||
|
|
||||||
// add function declaration to the proxy header file
|
// add function declaration to the proxy header file
|
||||||
Printv(f_wrappers_decl, preturn_type, " ", wname, pproto, ";\n\n", NIL);
|
Printv(f_wrappers_decl, preturn_type, " ", wname, get_wrapper_func_proto(n).get(), ";\n\n", NIL);
|
||||||
|
|
||||||
if (is_global) {
|
if (is_global) {
|
||||||
if (!f_wrappers_aliases) {
|
if (!f_wrappers_aliases) {
|
||||||
|
|
@ -921,7 +930,6 @@ ready:
|
||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
Delete(wname);
|
Delete(wname);
|
||||||
Delete(pproto);
|
|
||||||
Delete(wrapper_call);
|
Delete(wrapper_call);
|
||||||
Delete(preturn_type);
|
Delete(preturn_type);
|
||||||
}
|
}
|
||||||
|
|
@ -960,7 +968,7 @@ ready:
|
||||||
// create wrapper function prototype
|
// create wrapper function prototype
|
||||||
Printv(wrapper->def, "SWIGEXPORTC ", return_type, " ", wname, NIL);
|
Printv(wrapper->def, "SWIGEXPORTC ", return_type, " ", wname, NIL);
|
||||||
|
|
||||||
Printv(wrapper->def, (DOH*)scoped_dohptr(get_wrapper_func_proto(n, wrapper)), NIL);
|
Printv(wrapper->def, get_wrapper_func_proto(n, wrapper).get(), NIL);
|
||||||
Printv(wrapper->def, " {", NIL);
|
Printv(wrapper->def, " {", NIL);
|
||||||
|
|
||||||
if (Cmp(nodeType(n), "destructor") != 0) {
|
if (Cmp(nodeType(n), "destructor") != 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue