diff options
Diffstat (limited to 'source4/build/pidl')
-rw-r--r-- | source4/build/pidl/swig.pm | 64 |
1 files changed, 49 insertions, 15 deletions
diff --git a/source4/build/pidl/swig.pm b/source4/build/pidl/swig.pm index 9fb08c49c9..7d2621a9b8 100644 --- a/source4/build/pidl/swig.pm +++ b/source4/build/pidl/swig.pm @@ -8,8 +8,8 @@ package IdlSwig; use strict; use Data::Dumper; -my($res); -my($name); +my(%interfaces, %functions, %structs, %unions); +my($res, $name); sub DebugElement($) { @@ -75,7 +75,7 @@ sub XFromPython($$) # Non-scalar type, no pointer $result .= DebugElement($e); } elsif ($e->{POINTERS} == 1) { - $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_from_python(mem_ctx, $obj);\n"; + $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, $obj);\n"; } else { # Non-scalar type, multiple pointers $result .= DebugElement($e); @@ -122,7 +122,7 @@ sub XToPython($$) # Non-scalar type, no pointer $result .= DebugElement($e); } elsif ($e->{POINTERS} == 1) { - $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_from_python(mem_ctx, obj);\n"; + $result .= "\ts->$prefix$e->{NAME} = $e->{TYPE}_ptr_from_python(mem_ctx, obj);\n"; } else { # Non-scalar type, multiple pointers $result .= DebugElement($e); @@ -140,7 +140,7 @@ sub ParseFunction($) $res .= "/* Convert Python dict to struct $fn->{NAME}.in */\n\n"; - $res .= "struct $fn->{NAME} *$fn->{NAME}_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n"; + $res .= "struct $fn->{NAME} *$fn->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n"; $res .= "{\n"; $res .= "\tstruct $fn->{NAME} *s = talloc(mem_ctx, sizeof(struct $fn->{NAME}));\n\n"; @@ -177,7 +177,7 @@ sub ParseFunction($) $res .= "%typemap(in) struct $fn->{NAME} * {\n"; $res .= "\tTALLOC_CTX *mem_ctx = talloc_init(\"typemap(int) $fn->{NAME}\");\n\n"; - $res .= "\t\$1 = $fn->{NAME}_from_python(mem_ctx, \$input);\n"; + $res .= "\t\$1 = $fn->{NAME}_ptr_from_python(mem_ctx, \$input);\n"; $res .= "}\n\n"; # Output typemap @@ -208,9 +208,9 @@ sub ParseStruct($) my($s) = shift; $res .= "%{\n\n"; - $res .= "/* Convert Python dict to struct $s->{NAME} */\n\n"; + $res .= "/* Convert Python dict to struct $s->{NAME} pointer */\n\n"; - $res .= "struct $s->{NAME} *$s->{NAME}_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n"; + $res .= "struct $s->{NAME} *$s->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n"; $res .= "{\n"; $res .= "\tstruct $s->{NAME} *s = talloc(mem_ctx, sizeof(struct $s->{NAME}));\n\n"; @@ -222,6 +222,17 @@ sub ParseStruct($) $res .= "\treturn s;\n"; $res .= "}\n\n"; + $res .= "/* Convert Python dict to struct $s->{NAME} */\n\n"; + + $res .= "void $s->{NAME}_from_python(TALLOC_CTX *mem_ctx, struct $s->{NAME} *s, PyObject *obj)\n"; + $res .= "{\n"; + + foreach my $e (@{$s->{DATA}{ELEMENTS}}) { + $res .= XFromPython($e, ""); + } + + $res .= "}\n\n"; + $res .= "/* Convert struct $s->{NAME} to Python dict */\n\n"; $res .= "PyObject *$s->{NAME}_to_python(TALLOC_CTX *mem_ctx, struct $s->{NAME} *s)\n"; @@ -247,20 +258,22 @@ sub ParseUnion($) $res .= "%{\n\n"; $res .= "/* Convert Python dict to union $u->{NAME} */\n\n"; - $res .= "union $u->{NAME} *$u->{NAME}_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n"; + $res .= "union $u->{NAME} *$u->{NAME}_ptr_from_python(TALLOC_CTX *mem_ctx, PyObject *obj)\n"; $res .= "{\n"; - $res .= "\tunion $u->{NAME} *u = talloc(mem_ctx, sizeof(struct $u->{NAME}));\n"; + $res .= "\tunion $u->{NAME} *u = talloc(mem_ctx, sizeof(union $u->{NAME}));\n"; $res .= "\tPyObject *dict;\n\n"; for my $e (@{$u->{DATA}{DATA}}) { $res .= "\tif ((dict = PyDict_GetItem(obj, PyString_FromString(\"$e->{DATA}{NAME}\")))) {\n"; -# if ($e->{DATA}{POINTERS} == 0) { -# $res .= "\t\t// $e->{TYPE} pointers=$e->{DATA}{POINTERS}\n"; -# } else { -# $res .= "\t\t// $e->{TYPE} pointers=$e->{DATA}{POINTERS}\n"; -# } + if ($e->{DATA}{POINTERS} == 0) { + $res .= "\t\t$e->{DATA}{TYPE}_from_python(mem_ctx, &u->$e->{DATA}{NAME}, dict);\n"; + } elsif ($e->{DATA}{POINTERS} == 1) { + $res .= "\t\tu->$e->{DATA}{NAME} = $e->{DATA}{TYPE}_ptr_from_python(mem_ctx, dict);\n"; + } else { + $res .= "\t\t// $e->{DATA}{TYPE} pointers=$e->{DATA}{POINTERS}\n"; + } $res .= "\t\treturn u;\n"; $res .= "\t}\n\n"; @@ -316,6 +329,27 @@ sub Parse($) { my($idl) = shift; + # Make index of functions, structs and unions + + %interfaces = (); + %functions = (); + %structs = (); + %unions = (); + + foreach my $x (@{$idl}) { + my($iname) = $x->{NAME}; + $interfaces{$iname} = $x->{PROPERTIES}; + foreach my $i (@{$x->{INHERITED_DATA}}) { + $functions{$iname}{$i->{NAME}} = $i if $i->{TYPE} eq "FUNCTION"; + if ($i->{TYPE} eq "TYPEDEF") { + $structs{$iname}{$i->{NAME}} = $i->{DATA} if $i->{DATA}{TYPE} eq "STRUCT"; + $unions{$iname}{$i->{NAME}} = $i->{DATA} if $i->{DATA}{TYPE} eq "UNION"; + } + } + } + + # Generate interface + $res = "/* auto-generated by pidl */\n\n"; foreach my $x (@{$idl}) { |