From 7e651c7ef3afb4effa045fa84ee3a87ab8226995 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 21 Dec 2008 21:10:40 +0100 Subject: Simplify customization of pidl-generated Python modules. --- pidl/lib/Parse/Pidl/Samba4/Python.pm | 49 ++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 19 deletions(-) (limited to 'pidl/lib/Parse/Pidl') diff --git a/pidl/lib/Parse/Pidl/Samba4/Python.pm b/pidl/lib/Parse/Pidl/Samba4/Python.pm index 69365416a5..73ae8350b1 100644 --- a/pidl/lib/Parse/Pidl/Samba4/Python.pm +++ b/pidl/lib/Parse/Pidl/Samba4/Python.pm @@ -24,7 +24,7 @@ sub new($) { my ($class) = @_; my $self = { res => "", res_hdr => "", tabs => "", constants => {}, module_methods => [], module_objects => [], ready_types => [], - readycode => [] }; + patch_type_calls => [], readycode => [] }; bless($self, $class); } @@ -38,7 +38,9 @@ sub pidl($$) { my ($self, $d) = @_; if ($d) { - $self->{res} .= $self->{tabs}; + if ((!($d =~ /^#/))) { + $self->{res} .= $self->{tabs}; + } $self->{res} .= $d; } $self->{res} .= "\n"; @@ -279,11 +281,6 @@ sub PythonStruct($$$$$$) $self->indent; $self->pidl("{ \"__ndr_pack__\", (PyCFunction)py_$name\_ndr_pack, METH_NOARGS, \"S.pack() -> blob\\nNDR pack\" },"); $self->pidl("{ \"__ndr_unpack__\", (PyCFunction)py_$name\_ndr_unpack, METH_VARARGS, \"S.unpack(blob) -> None\\nNDR unpack\" },"); - $self->deindent; - $self->pidl("#ifdef ".uc("py_$name\_extra_methods")); - $self->pidl("\t" .uc("py_$name\_extra_methods")); - $self->pidl("#endif"); - $self->indent; $self->pidl("{ NULL, NULL, 0, NULL }"); $self->deindent; $self->pidl("};"); @@ -294,11 +291,8 @@ sub PythonStruct($$$$$$) $self->pidl_hdr("#define $name\_Check(op) PyObject_TypeCheck(op, &$name\_Type)\n"); $self->pidl_hdr("#define $name\_CheckExact(op) ((op)->ob_type == &$name\_Type)\n"); $self->pidl_hdr("\n"); - $self->pidl("#ifndef ".uc("py_$name\_repr")); - $self->pidl("#define ".uc("py_$name\_repr") . " py_talloc_default_repr"); - $self->pidl("#endif"); $self->pidl(""); - my $docstring = ($self->DocString($d, $name) or "NULL"); + my $docstring = $self->DocString($d, $name); my $typeobject = "$name\_Type"; $self->pidl("PyTypeObject $typeobject = {"); $self->indent; @@ -307,8 +301,10 @@ sub PythonStruct($$$$$$) $self->pidl(".tp_basicsize = sizeof(py_talloc_Object),"); $self->pidl(".tp_dealloc = py_talloc_dealloc,"); $self->pidl(".tp_getset = $getsetters,"); - $self->pidl(".tp_repr = ".uc("py_$name\_repr").","); - $self->pidl(".tp_doc = $docstring,"); + $self->pidl(".tp_repr = py_talloc_default_repr,"); + if ($docstring) { + $self->pidl(".tp_doc = $docstring,"); + } $self->pidl(".tp_methods = $py_methods,"); $self->pidl(".tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,"); $self->pidl(".tp_new = py_$name\_new,"); @@ -815,6 +811,8 @@ sub register_module_typeobject($$$) $self->register_module_object($name, "(PyObject *)$py_name"); $self->check_ready_type($py_name); + + $self->register_patch_type_call($name, $py_name); } sub check_ready_type($$) @@ -823,6 +821,14 @@ sub check_ready_type($$) push (@{$self->{ready_types}}, $py_name) unless (grep(/^$py_name$/,@{$self->{ready_types}})); } +sub register_patch_type_call($$$) +{ + my ($self, $typename, $cvar) = @_; + + push(@{$self->{patch_type_calls}}, [$typename, $cvar]); + +} + sub register_module_readycode($$) { my ($self, $code) = @_; @@ -1184,12 +1190,6 @@ sub Parse($$$$$) $self->pidl("{ \"$fn_name\", (PyCFunction)$pyfn_name, $flags, $doc },"); } - $self->deindent; - $self->pidl("#ifdef ".uc("py_mod_$basename\_extra_methods")); - $self->pidl("\t" .uc("py_mod_$basename\_extra_methods")); - $self->pidl("#endif"); - $self->indent; - $self->pidl("{ NULL, NULL, 0, NULL }"); $self->deindent; $self->pidl("};"); @@ -1209,6 +1209,13 @@ sub Parse($$$$$) $self->pidl($_) foreach (@{$self->{readycode}}); + foreach (@{$self->{patch_type_calls}}) { + my ($typename, $cvar) = @$_; + $self->pidl("#ifdef PY_".uc($typename)."_PATCH"); + $self->pidl("PY_".uc($typename)."_PATCH($cvar);"); + $self->pidl("#endif"); + } + $self->pidl(""); $self->pidl("m = Py_InitModule3(\"$basename\", $basename\_methods, \"$basename DCE/RPC\");"); @@ -1235,6 +1242,10 @@ sub Parse($$$$$) $self->pidl("PyModule_AddObject(m, \"$object_name\", $c_name);"); } + $self->pidl("#ifdef PY_MOD_".uc($basename)."_PATCH"); + $self->pidl("PY_MOD_".uc($basename)."_PATCH(m);"); + $self->pidl("#endif"); + $self->pidl(""); $self->deindent; $self->pidl("}"); -- cgit