From: Michal Sojka Date: Tue, 4 Nov 2008 16:58:04 +0000 (+0100) Subject: Added deallocation of sequences of native types X-Git-Url: https://rtime.felk.cvut.cz/gitweb/frescor/forb.git/commitdiff_plain/a2323e724b8c5f3561d51caa694a9d3900e24141 Added deallocation of sequences of native types --- diff --git a/forb-idl/forb-idl-c-skels.c b/forb-idl/forb-idl-c-skels.c index e3fbab3..d8be759 100644 --- a/forb-idl/forb-idl-c-skels.c +++ b/forb-idl/forb-idl-c-skels.c @@ -226,15 +226,28 @@ static void free_memory_if_needed(IDL_tree type_spec, const char *name, int n, O break; case IDLN_TYPE_ARRAY: break; - case IDLN_TYPE_SEQUENCE: - fprintf(ci->fh, " "); - fprintf(ci->fh, "if (CORBA_sequence_get_release(%s%s)) { forb_free(%s%s_buffer); }\n", - n==2?"":"&",name, name, n==2?"->":"."); + case IDLN_TYPE_SEQUENCE: { + char *dot = n==2?"->":"."; + IDL_tree simple_type = forb_cbe_get_typespec(IDL_TYPE_SEQUENCE(type_spec).simple_type_spec); + + fprintf(ci->fh, " if (CORBA_sequence_get_release(%s%s)) {\n", + n==2?"":"&",name); + if (IDLN_NATIVE == IDL_NODE_TYPE(simple_type)) { + char *typename = forb_cbe_get_typespec_str(IDL_NATIVE(type_spec).ident); + fprintf(ci->fh, " int i;\n" + " for (i=0; i<%s%s_length; i++)\n" + " %s_free(%s%s_buffer[i]);\n", + name, dot, forb_cbe_get_typespec_str(IDL_NATIVE(type_spec).ident), + name, dot); + } + fprintf(ci->fh, " forb_free(%s%s_buffer);\n" + " }\n", name, dot); if (n==2) { fprintf(ci->fh, " "); fprintf(ci->fh, "forb_free(%s);\n", name); } break; + } case IDLN_NATIVE: fprintf(ci->fh, " "); fprintf(ci->fh, "%s_free(%s);\n",