[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:
Ian Lance Taylor 2015-02-09 11:21:58 -08:00
commit 1863b191bf

View file

@ -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;
} }
/* ------------------------------------------------------------ /* ------------------------------------------------------------