]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Added deallocation of sequences of native types
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 4 Nov 2008 16:58:04 +0000 (17:58 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 4 Nov 2008 16:58:04 +0000 (17:58 +0100)
forb-idl/forb-idl-c-skels.c

index e3fbab3d66069976cd84f7c50e1137265b8706e8..d8be759b2b5501ff8e84769d33e45f9ae58b3f28 100644 (file)
@@ -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",