static void ucs_ProcTail_setup(definition * defp, int split_flag);
static void ss_Proc_CodeGeneration(definition * defp);
static void ss_ProcName_setup(definition * defp);
-static void ss_ProcParams_setup(definition * defp, int *somefrees);
-static void ss_ProcSpecial_setup(definition * defp, int *somefrees);
+static void ss_ProcParams_setup(definition * defp);
+static void ss_ProcSpecial_setup(definition * defp);
static void ss_ProcUnmarshallInParams_setup(definition * defp);
static void ss_ProcCallRealProc_setup(definition * defp);
static void ss_ProcMarshallOutParams_setup(definition * defp);
-static void ss_ProcTail_setup(definition * defp, int somefrees);
+static void ss_ProcTail_setup(definition * defp);
static int opcode_holes_exist(void);
static void er_ProcDeclExterns_setup(void);
static void er_ProcProcsArray_setup(void);
static void
ss_Proc_CodeGeneration(definition * defp)
{
- int somefrees = 0;
-
defp->can_fail = 0;
ss_ProcName_setup(defp);
if (!cflag) {
- ss_ProcParams_setup(defp, &somefrees);
- ss_ProcSpecial_setup(defp, &somefrees);
+ ss_ProcParams_setup(defp);
+ ss_ProcSpecial_setup(defp);
ss_ProcUnmarshallInParams_setup(defp);
ss_ProcCallRealProc_setup(defp);
ss_ProcMarshallOutParams_setup(defp);
- ss_ProcTail_setup(defp, somefrees);
+ ss_ProcTail_setup(defp);
}
}
static void
-ss_ProcParams_setup(definition * defp, int *somefrees)
+ss_ProcParams_setup(definition * defp)
{
proc1_list *plist, *plist1;
list *listp;
plist->pl.param_name);
} else {
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
f_print(fout, "\t%s %s=(%s)0", plist->pl.param_type,
plist->pl.param_name, plist->pl.param_type);
}
f_print(fout, ", %s", plist1->pl.param_name);
} else {
plist1->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
f_print(fout, ", *%s=(%s)0", plist1->pl.param_name,
plist1->pl.param_type);
}
static void
-ss_ProcSpecial_setup(definition * defp, int *somefrees)
+ss_ProcSpecial_setup(definition * defp)
{
proc1_list *plist;
definition *defp1;
if (streq(string, structname(plist->pl.param_type))) {
plist->pl.string_name = spec->sdef.string_name;
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
fprintf(fout, "\n\t%s.%s = 0;", plist->pl.param_name,
spec->sdef.string_name);
}
}
}
}
- if (!*somefrees)
- fprintf(fout, "\n");
for (listp = typedef_defined; listp != NULL; listp = listp->next) {
defp1 = (definition *) listp->val;
for (plist = defp->pc.plists; plist; plist = plist->next) {
if (plist->component_kind == DEF_PARAM) {
if (streq(defp1->def_name, structname(plist->pl.param_type))) {
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
switch (defp1->pc.rel) {
case REL_ARRAY:
plist->pl.string_name = alloc(40);
if (plist->component_kind == DEF_PARAM) {
if (streq(defp1->def_name, structname(plist->pl.param_type))) {
plist->pl.param_flag |= FREETHIS_PARAM;
- *somefrees = 1;
fprintf(fout, "\n\tmemset(&%s, 0, sizeof(%s));",
plist->pl.param_name, defp1->def_name);
}
}
}
+static void
+ss_ProcTail_frees(char *xdrfunc, int *somefrees) {
+ if (!*somefrees) {
+ f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
+ f_print(fout, "\tif ((!%s)", xdrfunc);
+ *somefrees = 1;
+ } else {
+ f_print(fout, "\n\t || (!%s)", xdrfunc);
+ }
+}
+
static void
-ss_ProcTail_setup(definition * defp, int somefrees)
+ss_ProcTail_setup(definition * defp)
{
proc1_list *plist;
definition *defp1;
list *listp;
- int firsttime = 0;
+ int somefrees = 0;
if (defp->can_fail) {
f_print(fout, "fail:\n");
}
- for (plist = defp->pc.plists; plist; plist = plist->next) {
- if (plist->component_kind == DEF_PARAM
- && (plist->pl.param_flag & FREETHIS_PARAM))
- somefrees = 1;
- }
- if (somefrees)
- f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
+
for (plist = defp->pc.plists; plist; plist = plist->next) {
if (plist->component_kind == DEF_PARAM
&& (plist->pl.param_flag & FREETHIS_PARAM))
- f_print(fout, "\tif (!%s) goto fail1;\n", plist->scode);
+ ss_ProcTail_frees(plist->scode, &somefrees);
}
+
for (listp = typedef_defined; listp != NULL; listp = listp->next) {
defp1 = (definition *) listp->val;
for (plist = defp->pc.plists; plist; plist = plist->next) {
switch (defp1->pc.rel) {
case REL_ARRAY:
case REL_POINTER:
- if (!somefrees && !firsttime) {
- firsttime = 1;
- f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
- }
- somefrees = 1;
- f_print(fout, "\tif (!%s) goto fail1;\n",
- plist->scode);
+ ss_ProcTail_frees(plist->scode, &somefrees);
break;
default:
break;
}
}
}
+
for (listp = uniondef_defined; listp != NULL; listp = listp->next) {
defp1 = (definition *) listp->val;
for (plist = defp->pc.plists; plist; plist = plist->next) {
&& !(plist->pl.param_flag & FREETHIS_PARAM)) {
if (streq(defp1->def_name, structname(plist->pl.param_type))) {
if (plist->pl.param_flag & INDIRECT_PARAM) {
- if (!somefrees && !firsttime) {
- firsttime = 1;
- f_print(fout, "\tz_xdrs->x_op = XDR_FREE;\n");
- }
- somefrees = 1;
- f_print(fout, "\tif (!%s) goto fail1;\n",
- plist->scode);
+ ss_ProcTail_frees(plist->scode, &somefrees);
}
}
}
}
}
+ if (somefrees) {
+ f_print(fout, ")\n");
+ f_print(fout, "\t\tz_result = RXGEN_SS_XDRFREE;\n\n");
+ }
+
if (xflag) {
f_print(fout, "\tif (rx_enable_stats) {\n");
f_print(fout, "\t rx_RecordCallStatistics(z_call,");
}
f_print(fout, "\treturn z_result;\n");
- if (somefrees) {
- f_print(fout, "fail1:\n");
-
- if (xflag) {
- f_print(fout, "\tif (rx_enable_stats) {\n");
- f_print(fout,
- "\t rx_RecordCallStatistics(z_call,");
- if (PackageStatIndex[PackageIndex]) {
- f_print(fout, " %s,\n", PackageStatIndex[PackageIndex]);
- } else {
- f_print(fout,
- "\n\t\t(((afs_uint32)(ntohs(rx_ServiceIdOf(rx_ConnectionOf(z_call))) << 16)) |\n"
- "\t\t((afs_uint32)ntohs(rx_ServiceOf(rx_ConnectionOf(z_call))->servicePort))),\n");
- }
- f_print(fout, "\t\t%d, %sNO_OF_STAT_FUNCS, 0);\n",
- no_of_stat_funcs, PackagePrefix[PackageIndex]);
- f_print(fout, "\t}\n\n");
- }
-
- f_print(fout, "\treturn RXGEN_SS_XDRFREE;\n}\n\n");
- } else {
- f_print(fout, "}\n\n");
- }
+ f_print(fout, "}\n\n");
}