summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2015-09-17 19:36:48 +0100
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2015-09-25 22:57:59 +0100
commitfaeaacf112fefdd0b23d397b1933733d51c473c9 (patch)
tree6fe5625b6cbb3fd406f716fe5e95f6a1b5877fc3 /Source
parent4677dbb7963f17ab046dcfa9be091f69168de990 (diff)
downloadswig-faeaacf112fefdd0b23d397b1933733d51c473c9.tar.gz
smartptr feature support - factor out common code
Diffstat (limited to 'Source')
-rw-r--r--Source/CParse/cparse.h1
-rw-r--r--Source/CParse/util.c22
-rw-r--r--Source/Modules/csharp.cxx46
-rw-r--r--Source/Modules/d.cxx55
-rw-r--r--Source/Modules/java.cxx58
-rw-r--r--Source/Modules/octave.cxx19
-rw-r--r--Source/Modules/python.cxx23
-rw-r--r--Source/Modules/typepass.cxx11
8 files changed, 103 insertions, 132 deletions
diff --git a/Source/CParse/cparse.h b/Source/CParse/cparse.h
index 84a486fb7..ab5f74b19 100644
--- a/Source/CParse/cparse.h
+++ b/Source/CParse/cparse.h
@@ -57,6 +57,7 @@ extern "C" {
/* util.c */
extern void Swig_cparse_replace_descriptor(String *s);
+ extern SwigType *Swig_cparse_smartptr(Node *n);
extern void cparse_normalize_void(Node *);
extern Parm *Swig_cparse_parm(String *s);
extern ParmList *Swig_cparse_parms(String *s, Node *file_line_node);
diff --git a/Source/CParse/util.c b/Source/CParse/util.c
index 320671d9a..0e2136a49 100644
--- a/Source/CParse/util.c
+++ b/Source/CParse/util.c
@@ -71,6 +71,28 @@ void Swig_cparse_replace_descriptor(String *s) {
}
/* -----------------------------------------------------------------------------
+ * Swig_cparse_smartptr()
+ *
+ * Parse the type in smartptr feature and convert into a SwigType.
+ * Error out if the parsing fails as this is like a parser syntax error.
+ * ----------------------------------------------------------------------------- */
+
+SwigType *Swig_cparse_smartptr(Node *n) {
+ SwigType *smart = 0;
+ String *smartptr = Getattr(n, "feature:smartptr");
+ if (smartptr) {
+ SwigType *cpt = Swig_cparse_type(smartptr);
+ if (cpt) {
+ smart = SwigType_typedef_resolve_all(cpt);
+ Delete(cpt);
+ } else {
+ Swig_error(Getfile(n), Getline(n), "Invalid type (%s) in 'smartptr' feature for class %s.\n", smartptr, SwigType_namestr(Getattr(n, "name")));
+ }
+ }
+ return smart;
+}
+
+/* -----------------------------------------------------------------------------
* cparse_normalize_void()
*
* This function is used to replace arguments of the form (void) with empty
diff --git a/Source/Modules/csharp.cxx b/Source/Modules/csharp.cxx
index 9193cd34b..baed0c260 100644
--- a/Source/Modules/csharp.cxx
+++ b/Source/Modules/csharp.cxx
@@ -1854,8 +1854,8 @@ public:
// Add code to do C++ casting to base class (only for classes in an inheritance hierarchy)
if (derived) {
- String *smartptr = Getattr(n, "feature:smartptr");
- String *upcast_method = Swig_name_member(getNSpace(), getClassPrefix(), smartptr != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast");
+ SwigType *smart = Swig_cparse_smartptr(n);
+ String *upcast_method = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast");
String *wname = Swig_name_wrapper(upcast_method);
Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL);
@@ -1863,29 +1863,22 @@ public:
Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name);
- if (smartptr) {
- SwigType *spt = Swig_cparse_type(smartptr);
- if (spt) {
- SwigType *smart = SwigType_typedef_resolve_all(spt);
- Delete(spt);
- SwigType *bsmart = Copy(smart);
- SwigType *rclassname = SwigType_typedef_resolve_all(c_classname);
- SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass);
- Replaceall(bsmart, rclassname, rbaseclass);
- Delete(rclassname);
- Delete(rbaseclass);
- String *smartnamestr = SwigType_namestr(smart);
- String *bsmartnamestr = SwigType_namestr(bsmart);
- Printv(upcasts_code,
- "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n",
- " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n"
- "}\n", "\n", NIL);
- Delete(bsmartnamestr);
- Delete(smartnamestr);
- Delete(bsmart);
- } else {
- Swig_error(Getfile(n), Getline(n), "Invalid type (%s) in 'smartptr' feature for class %s.\n", smartptr, c_classname);
- }
+ if (smart) {
+ SwigType *bsmart = Copy(smart);
+ SwigType *rclassname = SwigType_typedef_resolve_all(c_classname);
+ SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass);
+ Replaceall(bsmart, rclassname, rbaseclass);
+ Delete(rclassname);
+ Delete(rbaseclass);
+ String *smartnamestr = SwigType_namestr(smart);
+ String *bsmartnamestr = SwigType_namestr(bsmart);
+ Printv(upcasts_code,
+ "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n",
+ " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n"
+ "}\n", "\n", NIL);
+ Delete(bsmartnamestr);
+ Delete(smartnamestr);
+ Delete(bsmart);
} else {
Printv(upcasts_code,
"SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n",
@@ -1894,6 +1887,7 @@ public:
}
Delete(wname);
Delete(upcast_method);
+ Delete(smart);
}
Delete(baseclass);
}
@@ -3469,7 +3463,7 @@ public:
Wrapper *code_wrap = NewWrapper();
Printf(code_wrap->def, "SWIGEXPORT void SWIGSTDCALL %s(void *objarg", wname);
- if (Len(smartptr)) {
+ if (smartptr) {
Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", smartptr, smartptr);
Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n");
Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n");
diff --git a/Source/Modules/d.cxx b/Source/Modules/d.cxx
index 8b0bdded1..267dd8c03 100644
--- a/Source/Modules/d.cxx
+++ b/Source/Modules/d.cxx
@@ -3329,45 +3329,33 @@ private:
/* ---------------------------------------------------------------------------
* D::writeClassUpcast()
* --------------------------------------------------------------------------- */
- void writeClassUpcast(Node *n, const String* d_class_name,
- String* c_class_name, String* c_base_name) {
-
- String *smartptr = Getattr(n, "feature:smartptr");
- String *upcast_name = Swig_name_member(getNSpace(), d_class_name,
- (smartptr != 0 ? "SmartPtrUpcast" : "Upcast"));
+ void writeClassUpcast(Node *n, const String* d_class_name, String* c_class_name, String* c_base_name) {
+ SwigType *smart = Swig_cparse_smartptr(n);
+ String *upcast_name = Swig_name_member(getNSpace(), d_class_name, (smart != 0 ? "SmartPtrUpcast" : "Upcast"));
String *upcast_wrapper_name = Swig_name_wrapper(upcast_name);
writeImDModuleFunction(upcast_name, "void*", "(void* objectRef)",
upcast_wrapper_name);
- if (smartptr) {
- SwigType *spt = Swig_cparse_type(smartptr);
- if (spt) {
- SwigType *smart = SwigType_typedef_resolve_all(spt);
- Delete(spt);
- SwigType *bsmart = Copy(smart);
- SwigType *rclassname = SwigType_typedef_resolve_all(c_class_name);
- SwigType *rbaseclass = SwigType_typedef_resolve_all(c_base_name);
- Replaceall(bsmart, rclassname, rbaseclass);
- Delete(rclassname);
- Delete(rbaseclass);
- String *smartnamestr = SwigType_namestr(smart);
- String *bsmartnamestr = SwigType_namestr(bsmart);
- Printv(upcasts_code,
- "SWIGEXPORT ", bsmartnamestr, " * ", upcast_wrapper_name,
- "(", smartnamestr, " *objectRef) {\n",
- " return objectRef ? new ", bsmartnamestr, "(*objectRef) : 0;\n"
- "}\n",
- "\n", NIL);
- Delete(bsmartnamestr);
- Delete(smartnamestr);
- Delete(bsmart);
- } else {
- Swig_error(Getfile(n), Getline(n),
- "Invalid type (%s) in 'smartptr' feature for class %s.\n",
- smartptr, c_class_name);
- }
+ if (smart) {
+ SwigType *bsmart = Copy(smart);
+ SwigType *rclassname = SwigType_typedef_resolve_all(c_class_name);
+ SwigType *rbaseclass = SwigType_typedef_resolve_all(c_base_name);
+ Replaceall(bsmart, rclassname, rbaseclass);
+ Delete(rclassname);
+ Delete(rbaseclass);
+ String *smartnamestr = SwigType_namestr(smart);
+ String *bsmartnamestr = SwigType_namestr(bsmart);
+ Printv(upcasts_code,
+ "SWIGEXPORT ", bsmartnamestr, " * ", upcast_wrapper_name,
+ "(", smartnamestr, " *objectRef) {\n",
+ " return objectRef ? new ", bsmartnamestr, "(*objectRef) : 0;\n"
+ "}\n",
+ "\n", NIL);
+ Delete(bsmartnamestr);
+ Delete(smartnamestr);
+ Delete(bsmart);
} else {
Printv(upcasts_code,
"SWIGEXPORT ", c_base_name, " * ", upcast_wrapper_name,
@@ -3382,6 +3370,7 @@ private:
Delete(upcast_name);
Delete(upcast_wrapper_name);
+ Delete(smart);
}
/* ---------------------------------------------------------------------------
diff --git a/Source/Modules/java.cxx b/Source/Modules/java.cxx
index 0109bf41a..636189989 100644
--- a/Source/Modules/java.cxx
+++ b/Source/Modules/java.cxx
@@ -1875,40 +1875,33 @@ public:
// Add code to do C++ casting to base class (only for classes in an inheritance hierarchy)
if (derived) {
- String *smartptr = Getattr(n, "feature:smartptr");
- String *upcast_method = Swig_name_member(getNSpace(), getClassPrefix(), smartptr != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast");
+ SwigType *smart = Swig_cparse_smartptr(n);
+ String *upcast_method = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast");
String *jniname = makeValidJniName(upcast_method);
String *wname = Swig_name_wrapper(jniname);
Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method);
- if (smartptr) {
- SwigType *spt = Swig_cparse_type(smartptr);
- if (spt) {
- SwigType *smart = SwigType_typedef_resolve_all(spt);
- Delete(spt);
- SwigType *bsmart = Copy(smart);
- SwigType *rclassname = SwigType_typedef_resolve_all(c_classname);
- SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass);
- Replaceall(bsmart, rclassname, rbaseclass);
- Delete(rclassname);
- Delete(rbaseclass);
- String *smartnamestr = SwigType_namestr(smart);
- String *bsmartnamestr = SwigType_namestr(bsmart);
- Printv(upcasts_code,
- "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n",
- " jlong baseptr = 0;\n"
- " ", smartnamestr, " *argp1;\n"
- " (void)jenv;\n"
- " (void)jcls;\n"
- " argp1 = *(", smartnamestr, " **)&jarg1;\n"
- " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n"
- " return baseptr;\n"
- "}\n", "\n", NIL);
- Delete(bsmartnamestr);
- Delete(smartnamestr);
- Delete(bsmart);
- } else {
- Swig_error(Getfile(n), Getline(n), "Invalid type (%s) in 'smartptr' feature for class %s.\n", smartptr, c_classname);
- }
+ if (smart) {
+ SwigType *bsmart = Copy(smart);
+ SwigType *rclassname = SwigType_typedef_resolve_all(c_classname);
+ SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass);
+ Replaceall(bsmart, rclassname, rbaseclass);
+ Delete(rclassname);
+ Delete(rbaseclass);
+ String *smartnamestr = SwigType_namestr(smart);
+ String *bsmartnamestr = SwigType_namestr(bsmart);
+ Printv(upcasts_code,
+ "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n",
+ " jlong baseptr = 0;\n"
+ " ", smartnamestr, " *argp1;\n"
+ " (void)jenv;\n"
+ " (void)jcls;\n"
+ " argp1 = *(", smartnamestr, " **)&jarg1;\n"
+ " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n"
+ " return baseptr;\n"
+ "}\n", "\n", NIL);
+ Delete(bsmartnamestr);
+ Delete(smartnamestr);
+ Delete(bsmart);
} else {
Printv(upcasts_code,
"SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n",
@@ -1922,6 +1915,7 @@ public:
Delete(wname);
Delete(jniname);
Delete(upcast_method);
+ Delete(smart);
}
Delete(baseclass);
}
@@ -3486,7 +3480,7 @@ public:
"SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jswig_mem_own, "
"jboolean jweak_global) {\n", jnipackage, jni_imclass_name, swig_director_connect_jni);
- if (Len(smartptr)) {
+ if (smartptr) {
Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", smartptr, smartptr);
Printf(code_wrap->code, " (void)jcls;\n");
Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n");
diff --git a/Source/Modules/octave.cxx b/Source/Modules/octave.cxx
index e5f18cae8..0e3e16cbb 100644
--- a/Source/Modules/octave.cxx
+++ b/Source/Modules/octave.cxx
@@ -966,25 +966,13 @@ public:
SwigType *t = Copy(Getattr(n, "name"));
SwigType_add_pointer(t);
- String *smartptr = Getattr(n, "feature:smartptr"); // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers)
- SwigType *smart = 0;
- if (smartptr) {
- SwigType *cpt = Swig_cparse_type(smartptr);
- if (cpt) {
- smart = SwigType_typedef_resolve_all(cpt);
- Delete(cpt);
- } else {
- // TODO: report line number of where the feature comes from
- Swig_error(Getfile(n), Getline(n), "Invalid type (%s) in 'smartptr' feature for class %s.\n", smartptr, class_name);
- }
- }
+ // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers)
+ SwigType *smart = Swig_cparse_smartptr(n);
String *wrap_class = NewStringf("&_wrap_class_%s", class_name);
- if(smart){
+ if (smart) {
SwigType_add_pointer(smart);
SwigType_remember_clientdata(smart, wrap_class);
}
- Delete(smart);
- Delete(smartptr);
//String *wrap_class = NewStringf("&_wrap_class_%s", class_name);
SwigType_remember_clientdata(t, wrap_class);
@@ -1064,6 +1052,7 @@ public:
Delete(base_class);
Delete(base_class_names);
+ Delete(smart);
Delete(t);
Delete(s_members_tab);
s_members_tab = 0;
diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx
index e0306d746..7bc565871 100644
--- a/Source/Modules/python.cxx
+++ b/Source/Modules/python.cxx
@@ -4161,15 +4161,11 @@ public:
Printf(clientdata, "&%s_clientdata", templ);
SwigType_remember_mangleddata(pmname, clientdata);
- String *smartptr = Getattr(n, "feature:smartptr");
- if (smartptr) {
- SwigType *spt = Swig_cparse_type(smartptr);
- SwigType *smart = SwigType_typedef_resolve_all(spt);
+ SwigType *smart = Swig_cparse_smartptr(n);
+ if (smart) {
SwigType_add_pointer(smart);
String *smart_pmname = SwigType_manglestr(smart);
SwigType_remember_mangleddata(smart_pmname, clientdata);
- Delete(spt);
- Delete(smart);
Delete(smart_pmname);
}
@@ -4195,6 +4191,7 @@ public:
Printv(f_init, " d = md;\n", NIL);
Delete(clientdata);
+ Delete(smart);
Delete(rname);
Delete(pname);
Delete(mname);
@@ -4392,18 +4389,8 @@ public:
/* Complete the class */
if (shadow) {
/* Generate a class registration function */
- String *smartptr = Getattr(n, "feature:smartptr"); // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers)
- SwigType *smart = 0;
- if (smartptr) {
- SwigType *cpt = Swig_cparse_type(smartptr);
- if (cpt) {
- smart = SwigType_typedef_resolve_all(cpt);
- Delete(cpt);
- } else {
- // TODO: report line number of where the feature comes from
- Swig_error(Getfile(n), Getline(n), "Invalid type (%s) in 'smartptr' feature for class %s.\n", smartptr, real_classname);
- }
- }
+ // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers)
+ SwigType *smart = Swig_cparse_smartptr(n);
SwigType *ct = Copy(smart ? smart : real_classname);
SwigType_add_pointer(ct);
SwigType *realct = Copy(real_classname);
diff --git a/Source/Modules/typepass.cxx b/Source/Modules/typepass.cxx
index 3e323f910..2aa1b03e6 100644
--- a/Source/Modules/typepass.cxx
+++ b/Source/Modules/typepass.cxx
@@ -256,11 +256,8 @@ class TypePass:private Dispatcher {
SwigType_inherit(clsname, bname, cast, 0);
String *smartptr = Getattr(first, "feature:smartptr");
if (smartptr) {
- SwigType *smart = 0;
- SwigType *spt = Swig_cparse_type(smartptr);
- if (spt) {
- smart = SwigType_typedef_resolve_all(spt);
- Delete(spt);
+ SwigType *smart = Swig_cparse_smartptr(first);
+ if (smart) {
/* Record a (fake) inheritance relationship between smart pointer
and smart pointer to base class, so that smart pointer upcasts
are automatically generated. */
@@ -282,10 +279,8 @@ class TypePass:private Dispatcher {
Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Base class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(bclass, "name")), SwigType_namestr(Getattr(first, "name")));
Delete(convcode);
Delete(bsmart);
- Delete(smart);
- } else {
- Swig_error(Getfile(first), Getline(first), "Invalid type (%s) in 'smartptr' feature for class %s.\n", SwigType_namestr(smartptr), SwigType_namestr(clsname));
}
+ Delete(smart);
} else {
if (GetFlag(bclass, "feature:smartptr"))
Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Derived class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(first, "name")), SwigType_namestr(Getattr(bclass, "name")));