[Go] Refactor some functions to make it easier to move to a new
approach for generating Go interfaces. No functional changes.
This commit is contained in:
parent
0a021a938e
commit
1863b191bf
1 changed files with 280 additions and 255 deletions
|
|
@ -3146,9 +3146,6 @@ private:
|
||||||
// Go code is keeping a pointer to the C++ object, we need to call
|
// Go code is keeping a pointer to the C++ object, we need to call
|
||||||
// back to the Go code to let it know that the C++ object is gone.
|
// back to the Go code to let it know that the C++ object is gone.
|
||||||
|
|
||||||
String *wname = NewString("_swiggo_wrap_DeleteDirector_");
|
|
||||||
Append(wname, class_name);
|
|
||||||
|
|
||||||
String *go_name = NewString("Swiggo_DeleteDirector_");
|
String *go_name = NewString("Swiggo_DeleteDirector_");
|
||||||
Append(go_name, class_name);
|
Append(go_name, class_name);
|
||||||
|
|
||||||
|
|
@ -3166,25 +3163,58 @@ private:
|
||||||
|
|
||||||
Printv(f_c_directors_h, ";\n", NULL);
|
Printv(f_c_directors_h, ";\n", NULL);
|
||||||
|
|
||||||
|
String *director_sig = NewString("");
|
||||||
|
|
||||||
|
Printv(director_sig, "SwigDirector_", class_name, "::~SwigDirector_", class_name, "()", NULL);
|
||||||
|
|
||||||
|
if (throws) {
|
||||||
|
Printv(director_sig, " ", throws, NULL);
|
||||||
|
Delete(throws);
|
||||||
|
}
|
||||||
|
|
||||||
|
Printv(director_sig, "\n", NULL);
|
||||||
|
Printv(director_sig, "{\n", NULL);
|
||||||
|
|
||||||
if (!is_ignored) {
|
if (!is_ignored) {
|
||||||
|
makeDirectorDestructorWrapper(go_name, director_sig);
|
||||||
|
|
||||||
|
Printv(f_c_directors, " delete swig_mem;\n", NULL);
|
||||||
|
|
||||||
|
Printv(f_go_wrappers, "func ", go_name, "(p *", director_struct_name, ") {\n", NULL);
|
||||||
|
Printv(f_go_wrappers, "\tp.", class_receiver, " = 0\n", NULL);
|
||||||
|
Printv(f_go_wrappers, "}\n\n", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
Printv(f_c_directors, "}\n\n", NULL);
|
||||||
|
|
||||||
|
Delete(director_sig);
|
||||||
|
Delete(go_name);
|
||||||
|
Delete(cn);
|
||||||
|
Delete(director_struct_name);
|
||||||
|
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------
|
||||||
|
* makeDirectorDestructorWrapper
|
||||||
|
*
|
||||||
|
* Emit the function wrapper for the destructor of a director class.
|
||||||
|
* This writes director_sig to f_c_directors and leaves the function
|
||||||
|
* unfinished.
|
||||||
|
* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
void makeDirectorDestructorWrapper(String *go_name, String *director_sig) {
|
||||||
|
String *wname = NewString("_swiggo_wrap_DeleteDirector_");
|
||||||
|
Append(wname, class_name);
|
||||||
|
|
||||||
if (!gccgo_flag) {
|
if (!gccgo_flag) {
|
||||||
Printv(f_c_directors, "extern \"C\" void ", wname, "(void*, int);\n", NULL);
|
Printv(f_c_directors, "extern \"C\" void ", wname, "(void*, int);\n", NULL);
|
||||||
} else {
|
} else {
|
||||||
Printv(f_c_directors, "extern \"C\" void ", wname, "(void*) __asm__(\"", go_prefix, ".", go_name, "\");\n", NULL);
|
Printv(f_c_directors, "extern \"C\" void ", wname, "(void*) __asm__(\"", go_prefix, ".", go_name, "\");\n", NULL);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Printv(f_c_directors, "SwigDirector_", class_name, "::~SwigDirector_", class_name, "()", NULL);
|
Printv(f_c_directors, director_sig, NULL);
|
||||||
|
|
||||||
if (throws) {
|
|
||||||
Printv(f_c_directors, " ", throws, NULL);
|
|
||||||
Delete(throws);
|
|
||||||
}
|
|
||||||
|
|
||||||
Printv(f_c_directors, "\n", NULL);
|
|
||||||
Printv(f_c_directors, "{\n", NULL);
|
|
||||||
|
|
||||||
if (!is_ignored) {
|
|
||||||
if (!gccgo_flag) {
|
if (!gccgo_flag) {
|
||||||
Printv(f_c_directors, " struct { void *p; } a;\n", NULL);
|
Printv(f_c_directors, " struct { void *p; } a;\n", NULL);
|
||||||
Printv(f_c_directors, " a.p = go_val;\n", NULL);
|
Printv(f_c_directors, " a.p = go_val;\n", NULL);
|
||||||
|
|
@ -3202,23 +3232,8 @@ private:
|
||||||
} else {
|
} else {
|
||||||
Printv(f_c_directors, " ", wname, "(go_val);\n", NULL);
|
Printv(f_c_directors, " ", wname, "(go_val);\n", NULL);
|
||||||
}
|
}
|
||||||
Printv(f_c_directors, " delete swig_mem;\n", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
Printv(f_c_directors, "}\n\n", NULL);
|
|
||||||
|
|
||||||
if (!is_ignored) {
|
|
||||||
Printv(f_go_wrappers, "func ", go_name, "(p *", director_struct_name, ") {\n", NULL);
|
|
||||||
Printv(f_go_wrappers, "\tp.", class_receiver, " = 0\n", NULL);
|
|
||||||
Printv(f_go_wrappers, "}\n\n", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
Delete(wname);
|
Delete(wname);
|
||||||
Delete(go_name);
|
|
||||||
Delete(cn);
|
|
||||||
Delete(director_struct_name);
|
|
||||||
|
|
||||||
return SWIG_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
/* ------------------------------------------------------------
|
||||||
|
|
@ -3377,9 +3392,6 @@ private:
|
||||||
Append(callback_name, overname);
|
Append(callback_name, overname);
|
||||||
}
|
}
|
||||||
|
|
||||||
String *callback_wname = Swig_name_wrapper(callback_name);
|
|
||||||
Append(callback_wname, unique_id);
|
|
||||||
|
|
||||||
String *upcall_name = Copy(director_struct_name);
|
String *upcall_name = Copy(director_struct_name);
|
||||||
Append(upcall_name, "_upcall_");
|
Append(upcall_name, "_upcall_");
|
||||||
Append(upcall_name, go_name);
|
Append(upcall_name, go_name);
|
||||||
|
|
@ -3981,44 +3993,6 @@ private:
|
||||||
|
|
||||||
Delete(upcall_wname);
|
Delete(upcall_wname);
|
||||||
Delete(upcall_gc_name);
|
Delete(upcall_gc_name);
|
||||||
|
|
||||||
// Build the C++ functions.
|
|
||||||
|
|
||||||
if (!gccgo_flag) {
|
|
||||||
Printv(f_c_directors, "extern \"C\" void ", callback_wname, "(void*, int);\n", NULL);
|
|
||||||
} else {
|
|
||||||
Printv(f_c_directors, "extern \"C\" ", NULL);
|
|
||||||
|
|
||||||
String *fnname = NewString("");
|
|
||||||
Printv(fnname, callback_wname, "(void*", NULL);
|
|
||||||
|
|
||||||
p = parms;
|
|
||||||
while (p) {
|
|
||||||
while (checkAttribute(p, "tmap:directorin:numinputs", "0")) {
|
|
||||||
p = Getattr(p, "tmap:directorin:next");
|
|
||||||
}
|
|
||||||
String *cg = gccgoCTypeForGoValue(p, Getattr(p, "type"),
|
|
||||||
Getattr(p, "lname"));
|
|
||||||
Printv(fnname, ", ", cg, NULL);
|
|
||||||
Delete(cg);
|
|
||||||
p = Getattr(p, "tmap:directorin:next");
|
|
||||||
}
|
|
||||||
|
|
||||||
Printv(fnname, ")", NULL);
|
|
||||||
|
|
||||||
if (SwigType_type(result) == T_VOID) {
|
|
||||||
Printv(f_c_directors, "void ", fnname, NULL);
|
|
||||||
} else {
|
|
||||||
String *tm = gccgoCTypeForGoValue(n, result, fnname);
|
|
||||||
Printv(f_c_directors, tm, NULL);
|
|
||||||
Delete(tm);
|
|
||||||
}
|
|
||||||
|
|
||||||
Delete(fnname);
|
|
||||||
|
|
||||||
Printv(f_c_directors, " __asm__(\"", go_prefix, ".", callback_name, "\");\n", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
Delete(go_with_over_name);
|
Delete(go_with_over_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4053,11 +4027,86 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_ignored) {
|
if (!is_ignored) {
|
||||||
|
makeDirectorMethodWrapper(n, w, callback_name);
|
||||||
|
} else {
|
||||||
|
assert(is_pure_virtual);
|
||||||
|
Printv(w->code, " _swig_gopanic(\"call to pure virtual function ", Getattr(parent, "sym:name"), name, "\");\n", NULL);
|
||||||
|
if (SwigType_type(result) != T_VOID) {
|
||||||
|
String *retstr = SwigType_rcaststr(result, "c_result");
|
||||||
|
Printv(w->code, " return ", retstr, ";\n", NULL);
|
||||||
|
Delete(retstr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Printv(w->code, "}", NULL);
|
||||||
|
|
||||||
|
Replaceall(w->code, "$symname", symname);
|
||||||
|
Wrapper_print(w, f_c_directors);
|
||||||
|
}
|
||||||
|
|
||||||
|
Delete(cn);
|
||||||
|
Delete(go_type_name);
|
||||||
|
Delete(director_struct_name);
|
||||||
|
Delete(interface_name);
|
||||||
|
Delete(upcall_name);
|
||||||
|
Delete(go_name);
|
||||||
|
DelWrapper(w);
|
||||||
|
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------
|
||||||
|
* makeDirectorMethodWrapper
|
||||||
|
*
|
||||||
|
* Emit the function wrapper for a director method.
|
||||||
|
* ------------------------------------------------------------ */
|
||||||
|
void makeDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) {
|
||||||
|
ParmList *parms = Getattr(n, "wrap:parms");
|
||||||
|
SwigType *result = Getattr(n, "type");
|
||||||
|
|
||||||
|
String *callback_wname = Swig_name_wrapper(callback_name);
|
||||||
|
Append(callback_wname, unique_id);
|
||||||
|
|
||||||
|
if (!gccgo_flag) {
|
||||||
|
Printv(f_c_directors, "extern \"C\" void ", callback_wname, "(void*, int);\n", NULL);
|
||||||
|
} else {
|
||||||
|
Printv(f_c_directors, "extern \"C\" ", NULL);
|
||||||
|
|
||||||
|
String *fnname = NewString("");
|
||||||
|
Printv(fnname, callback_wname, "(void*", NULL);
|
||||||
|
|
||||||
|
Parm *p = parms;
|
||||||
|
while (p) {
|
||||||
|
while (checkAttribute(p, "tmap:directorin:numinputs", "0")) {
|
||||||
|
p = Getattr(p, "tmap:directorin:next");
|
||||||
|
}
|
||||||
|
String *cg = gccgoCTypeForGoValue(p, Getattr(p, "type"),
|
||||||
|
Getattr(p, "lname"));
|
||||||
|
Printv(fnname, ", ", cg, NULL);
|
||||||
|
Delete(cg);
|
||||||
|
p = Getattr(p, "tmap:directorin:next");
|
||||||
|
}
|
||||||
|
|
||||||
|
Printv(fnname, ")", NULL);
|
||||||
|
|
||||||
|
if (SwigType_type(result) == T_VOID) {
|
||||||
|
Printv(f_c_directors, "void ", fnname, NULL);
|
||||||
|
} else {
|
||||||
|
String *tm = gccgoCTypeForGoValue(n, result, fnname);
|
||||||
|
Printv(f_c_directors, tm, NULL);
|
||||||
|
Delete(tm);
|
||||||
|
}
|
||||||
|
|
||||||
|
Delete(fnname);
|
||||||
|
|
||||||
|
Printv(f_c_directors, " __asm__(\"", go_prefix, ".", callback_name, "\");\n", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (!gccgo_flag) {
|
if (!gccgo_flag) {
|
||||||
Printv(w->code, " struct {\n", NULL);
|
Printv(w->code, " struct {\n", NULL);
|
||||||
Printv(w->code, " void *go_val;\n", NULL);
|
Printv(w->code, " void *go_val;\n", NULL);
|
||||||
|
|
||||||
p = parms;
|
Parm *p = parms;
|
||||||
while (p) {
|
while (p) {
|
||||||
while (checkAttribute(p, "tmap:directorin:numinputs", "0")) {
|
while (checkAttribute(p, "tmap:directorin:numinputs", "0")) {
|
||||||
p = Getattr(p, "tmap:directorin:next");
|
p = Getattr(p, "tmap:directorin:next");
|
||||||
|
|
@ -4161,7 +4210,7 @@ private:
|
||||||
|
|
||||||
String *args = NewString("");
|
String *args = NewString("");
|
||||||
|
|
||||||
p = parms;
|
Parm *p = parms;
|
||||||
while (p) {
|
while (p) {
|
||||||
while (checkAttribute(p, "tmap:directorin:numinputs", "0")) {
|
while (checkAttribute(p, "tmap:directorin:numinputs", "0")) {
|
||||||
p = Getattr(p, "tmap:directorin:next");
|
p = Getattr(p, "tmap:directorin:next");
|
||||||
|
|
@ -4231,32 +4280,8 @@ private:
|
||||||
Delete(result_str);
|
Delete(result_str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
assert(is_pure_virtual);
|
|
||||||
Printv(w->code, " _swig_gopanic(\"call to pure virtual function ", Getattr(parent, "sym:name"), name, "\");\n", NULL);
|
|
||||||
if (SwigType_type(result) != T_VOID) {
|
|
||||||
String *retstr = SwigType_rcaststr(result, "c_result");
|
|
||||||
Printv(w->code, " return ", retstr, ";\n", NULL);
|
|
||||||
Delete(retstr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Printv(w->code, "}", NULL);
|
|
||||||
|
|
||||||
Replaceall(w->code, "$symname", symname);
|
|
||||||
Wrapper_print(w, f_c_directors);
|
|
||||||
}
|
|
||||||
|
|
||||||
Delete(cn);
|
|
||||||
Delete(go_type_name);
|
|
||||||
Delete(director_struct_name);
|
|
||||||
Delete(interface_name);
|
|
||||||
Delete(upcall_name);
|
|
||||||
Delete(callback_wname);
|
Delete(callback_wname);
|
||||||
Delete(go_name);
|
|
||||||
DelWrapper(w);
|
|
||||||
|
|
||||||
return SWIG_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------
|
/* ------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue