pidl/Python: fix talloc hierachy in FromPythonToUnionFunction()
[metze/samba/wip.git] / pidl / lib / Parse / Pidl / Samba4 / Python.pm
index a46bebe51d0814ab0f6dec0bcf5252536b0818dc..70cb7d5eee2bd683429ad444a446388a74ee1b1b 100644 (file)
@@ -123,14 +123,16 @@ sub FromUnionToPythonFunction($$$$)
 {
        my ($self, $mem_ctx, $type, $switch, $name) = @_;
 
-       $self->pidl("PyObject *ret;");
+       my $has_default = 0;
+
+       $self->pidl("PyObject *ret = NULL;");
        $self->pidl("");
 
        $self->pidl("switch ($switch) {");
-       $self->indent;
 
        foreach my $e (@{$type->{ELEMENTS}}) {
                $self->pidl("$e->{CASE}:");
+               if ($e->{CASE} eq "default") { $has_default = 1; }
 
                $self->indent;
 
@@ -141,17 +143,24 @@ sub FromUnionToPythonFunction($$$$)
                        $self->pidl("Py_INCREF(ret);");
                }
 
-               $self->pidl("return ret;");
+               $self->pidl("break;");
                $self->pidl("");
 
                $self->deindent;
        }
 
-       $self->deindent;
-       $self->pidl("}");
+       if (!$has_default) {
+               $self->pidl("default:");
+               $self->indent;
+               $self->pidl("PyErr_SetString(PyExc_TypeError, \"unknown union level\");");
+               $self->pidl("ret = NULL;");
+               $self->pidl("break;");
+               $self->deindent;
+       }
 
-       $self->pidl("PyErr_SetString(PyExc_TypeError, \"unknown union level\");");
-       $self->pidl("return NULL;");
+       $self->pidl("}");
+       $self->pidl("");
+       $self->pidl("return ret;");
 }
 
 sub FromPythonToUnionFunction($$$$$)
@@ -170,7 +179,7 @@ sub FromPythonToUnionFunction($$$$$)
                if ($e->{CASE} eq "default") { $has_default = 1; }
                $self->indent;
                if ($e->{NAME}) {
-                       $self->ConvertObjectFromPython({}, $mem_ctx, $e, $name, "ret->$e->{NAME}", "talloc_free(ret); return NULL;");
+                       $self->ConvertObjectFromPython({}, "ret", $e, $name, "ret->$e->{NAME}", "talloc_free(ret); return NULL;");
                }
                $self->pidl("break;");
                $self->deindent;