Richard W.M. Jones
2009-Aug-14 15:57 UTC
[Libguestfs] Code snippet to work out which RStruct/RStructList structs are used and how
-- Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones virt-p2v converts physical machines to virtual machines. Boot with a live CD or over the network (PXE) and turn machines into Xen guests. http://et.redhat.com/~rjones/virt-p2v -------------- next part -------------->From 9efa77d717bd9bba5f61965eb6920429b7ae5d8e Mon Sep 17 00:00:00 2001From: Richard W.M. Jones <rjones at redhat.com> Date: Fri, 14 Aug 2009 16:54:55 +0100 Subject: [PATCH] Work out which RStruct/RStructList structs are really used, and how. --- src/generator.ml | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 58 insertions(+), 0 deletions(-) diff --git a/src/generator.ml b/src/generator.ml index b8f9ace..b76f502 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -3645,6 +3645,64 @@ let java_structs = [ "inotify_event", "INotifyEvent"; ] +(* What structs are actually returned. *) +type rstructs_used_t = RStructOnly | RStructListOnly | RStructAndList + +(* Returns a list of RStruct/RStructList structs that are returned + * by any function. Each element of returned list is a pair: + * + * (structname, RStructOnly) + * == there exists function which returns RStruct (_, structname) + * (structname, RStructListOnly) + * == there exists function which returns RStructList (_, structname) + * (structname, RStructAndList) + * == there are functions returning both RStruct (_, structname) + * and RStructList (_, structname) + *) +let rstructs_used + (* ||| is a "logical OR" for rstructs_used_t *) + let (|||) a b + match a, b with + | RStructAndList, _ + | _, RStructAndList -> RStructAndList + | RStructOnly, RStructListOnly + | RStructListOnly, RStructOnly -> RStructAndList + | RStructOnly, RStructOnly -> RStructOnly + | RStructListOnly, RStructListOnly -> RStructListOnly + in + + let h = Hashtbl.create 13 in + + (* if elem->oldv exists, update entry using ||| operator, + * else just add elem->newv to the hash + *) + let update elem newv + try let oldv = Hashtbl.find h elem in + Hashtbl.replace h elem (newv ||| oldv) + with Not_found -> Hashtbl.add h elem newv + in + + List.iter ( + fun (_, style, _, _, _, _, _) -> + match fst style with + | RStruct (_, structname) -> update structname RStructOnly + | RStructList (_, structname) -> update structname RStructListOnly + | _ -> () + ) all_functions; + + (* return key->values as a list of (key,value) *) + Hashtbl.fold (fun key value xs -> (key, value) :: xs) h [] + +(* debug: +let () + List.iter ( + function + | sn, RStructOnly -> printf "%s RStructOnly\n" sn + | sn, RStructListOnly -> printf "%s RStructListOnly\n" sn + | sn, RStructAndList -> printf "%s RStructAndList\n" sn + ) rstructs_used +*) + (* Used for testing language bindings. *) type callt | CallString of string -- 1.6.2.5
Jim Meyering
2009-Aug-14 17:46 UTC
[Libguestfs] Code snippet to work out which RStruct/RStructList structs are used and how
Richard W.M. Jones wrote:> Subject: [PATCH] Work out which RStruct/RStructList structs are really used, and how.Thanks. That was just what I needed. When I apply that along with the following two patches, the four unused functions are no longer emitted.>From 71b6bb79fbae53f1f4f2465e693a2c3e9f1a6faa Mon Sep 17 00:00:00 2001From: Jim Meyering <meyering at redhat.com> Date: Fri, 14 Aug 2009 19:12:18 +0200 Subject: [PATCH libguestfs 1/2] generator.ml: factor out a function * src/generator.ml (emit_print_list_function): New function. --- src/generator.ml | 28 ++++++++++++++++------------ 1 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/generator.ml b/src/generator.ml index b76f502..3dc2ae5 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -7445,6 +7445,21 @@ py_guestfs_close (PyObject *self, PyObject *args) "; + let emit_print_list_function typ + pr "static PyObject *\n"; + pr "put_%s_list (struct guestfs_%s_list *%ss)\n" typ typ typ; + pr "{\n"; + pr " PyObject *list;\n"; + pr " int i;\n"; + pr "\n"; + pr " list = PyList_New (%ss->len);\n" typ; + pr " for (i = 0; i < %ss->len; ++i)\n" typ; + pr " PyList_SetItem (list, i, put_%s (&%ss->val[i]));\n" typ typ; + pr " return list;\n"; + pr "};\n"; + pr "\n" + in + (* Structures, turned into Python dictionaries. *) List.iter ( fun (typ, cols) -> @@ -7501,18 +7516,7 @@ py_guestfs_close (PyObject *self, PyObject *args) pr "};\n"; pr "\n"; - pr "static PyObject *\n"; - pr "put_%s_list (struct guestfs_%s_list *%ss)\n" typ typ typ; - pr "{\n"; - pr " PyObject *list;\n"; - pr " int i;\n"; - pr "\n"; - pr " list = PyList_New (%ss->len);\n" typ; - pr " for (i = 0; i < %ss->len; ++i)\n" typ; - pr " PyList_SetItem (list, i, put_%s (&%ss->val[i]));\n" typ typ; - pr " return list;\n"; - pr "};\n"; - pr "\n" + emit_print_list_function typ ) structs; (* Python wrapper functions. *) -- 1.6.4.357.gfd68c>From bf64b6fa512012e2a15fa5b40037218b5159d659 Mon Sep 17 00:00:00 2001From: Jim Meyering <meyering at redhat.com> Date: Fri, 14 Aug 2009 19:33:35 +0200 Subject: [PATCH libguestfs 2/2] generator.ml: don't emit unused functions * src/generator.ml: Use "rstructs_used" to emit definitions only for put_TYPE_list functions that are used. --- src/generator.ml | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/src/generator.ml b/src/generator.ml index 3dc2ae5..01a4436 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -7516,9 +7516,17 @@ py_guestfs_close (PyObject *self, PyObject *args) pr "};\n"; pr "\n"; - emit_print_list_function typ ) structs; + (* Emit a put_TYPE_list function definition only if that function is used. *) + List.iter ( + function + | typ, (RStructListOnly | RStructAndList) -> + (* generate the function for typ *) + emit_print_list_function typ + | typ, _ -> () (* empty *) + ) rstructs_used; + (* Python wrapper functions. *) List.iter ( fun (name, style, _, _, _, _, _) -> -- 1.6.4.357.gfd68c
Seemingly Similar Threads
- [PATCH libguestfs] generator.ml: do not emit unused print_*_list functions
- [PATCH libguestfs] tests: increase likelihood that heap abuse triggers failure
- [PATCH 3/3] python: Allow bindings to be compiled with different version of libguestfs (RHBZ#1262983).
- total warning-removal for daemon/
- [PATCH 0/23] factor and const-correctness