[foreign] RFR 8220544: Jextract; library dependent header filtering
Jorn Vernee
jbvernee at xs4all.nl
Thu Mar 14 17:36:10 UTC 2019
I think you got it
With dlsym it seems to be recursive: [1] "The search performed by
dlsym() is breadth first through the dependency tree of these
libraries."
But, GetProcAdress on Windows [2] looks at the export table of the
library you give it, so AFAICT this is non-recursive.
Jorn
[1] : https://linux.die.net/man/3/dlsym
[2] :
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getprocaddress
Maurizio Cimadamore schreef op 2019-03-14 18:25:
> Nope - with this:
>
> $ cat foo.h
> #include <string.h>
>
> void foo(int f);
>
> $ cat foo.c
> #include "foo.h"
>
> void foo(int f) { }
>
> then,
>
> $ gcc -shared -o libfoo.so foo.c
>
> $ jextract -L . -l foo -d classes foo.h
>
>
> And then
>
> classes
> ├── clang_support
> │ ├── stddef.class
> │ ├── stddef_h.class
> │ └── stddef$size_t.class
> ├── foo.class
> ├── foo_h.class
> ├── META-INF
> │ └── jextract.properties
> └── usr
> └── include
> ├── string.class
> ├── string_h.class
> ├── xlocale.class
> ├── xlocale_h.class
> ├── xlocale.class
> ├── xlocale.class
> └── xlocale.class
>
> 4 directories, 13 files
>
>
> I wonder if some of the library lookup functions we have on linux
> (dlopen and co.) are doing a 'recursive' search into dependent libs as
> well, which might be disabled on Win.
>
>
> Maurizio
>
>
> On 14/03/2019 16:38, Maurizio Cimadamore wrote:
>> Ah ok
>>
>> will give that another try
>>
>> Maurizio
>>
>> On 14/03/2019 16:16, Jorn Vernee wrote:
>>> Sorry, that's with the v3 patch
>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8220544/webrev.03/
>>>
>>> I reverted back after the concerns raised about changing the
>>> implementation of TypedefTree::def You're right in that this
>>> incorrectly includes some trees.
>>>
>>> Sorry,
>>> Jorn
>>>
>>> Jorn Vernee schreef op 2019-03-14 17:08:
>>>> This produces test.class and test_h.class as expected, but nothing
>>>> else...
>>>>
>>>> Used command is: `jextract -L . -l test test.h`
>>>>
>>>> You would get stuff from string.h when the -l is omitted.
>>>>
>>>> Jorn
>>>>
>>>> Maurizio Cimadamore schreef op 2019-03-14 17:00:
>>>>> I think you can reproduce simply by having an header like this:
>>>>>
>>>>> #include <string.h>
>>>>>
>>>>> void foo(int i);
>>>>>
>>>>>
>>>>> if you extract that you would expect one symbol, but in reality you
>>>>> get also all the stuff from string.h.
>>>>>
>>>>> Maurizio
>>>>>
>>>>> On 14/03/2019 15:49, Jorn Vernee wrote:
>>>>>> The Windows jextract artifact for the OpenGL sample is a different
>>>>>> beast, because it relies on the standard Windows OpenGL libraries.
>>>>>> So, seeing some system headers is to be expected :) In the case of
>>>>>> python I'm also seeing some system headers, because python depends
>>>>>> on a hand full of corecrt types, so that's also correct. But,
>>>>>> neither one seems to be referencing imaxabs, so I'm not sure
>>>>>> what's going on...
>>>>>>
>>>>>> I'll try to see if I can find a repro example on Windows to see
>>>>>> about a fix. I'm not sure I see how the SymbolFilter could get to
>>>>>> the VM libraries? Though I remember seeing a similar case in the
>>>>>> past...
>>>>>>
>>>>>> Jorn
>>>>>>
>>>>>> Maurizio Cimadamore schreef op 2019-03-14 15:55:
>>>>>>> I think I got at the bottom of this. I tried debugging an
>>>>>>> extraction
>>>>>>> of opengl, and it eventually ends up adding inttypes.h to the
>>>>>>> rootset
>>>>>>> because of this symbol:
>>>>>>>
>>>>>>> imaxabs
>>>>>>>
>>>>>>> The library filter doesn't work here, because this is a function
>>>>>>> defined in the set of default libraries that comes with the VM,
>>>>>>> so
>>>>>>> jextract 'thinks' this symbol is genuinely part of one of the
>>>>>>> libraries specified in the command line - except is not.
>>>>>>>
>>>>>>> I tried an hacky fix which checks for absence of symbol in
>>>>>>> Libraries.getDefaultLibrary - and that seems to give the expected
>>>>>>> results - but I leave this to your consideration.
>>>>>>>
>>>>>>> Maurizio
>>>>>>>
>>>>>>> On 14/03/2019 14:27, Maurizio Cimadamore wrote:
>>>>>>>> Hi Jorn,
>>>>>>>> I gave this a try with our OpenGL and Python examples. The
>>>>>>>> extraction process works fine, and the generated jars are a bit
>>>>>>>> smaller - but I still see a lot of system-related headers.
>>>>>>>> Python has still lots of them, OpenGL less so, but even in the
>>>>>>>> GL case, I think it's interesting, because I can't see
>>>>>>>> references to types mentioned in these headers (nor in the
>>>>>>>> resulting classfiles). Do you know, on top of your head, as to
>>>>>>>> why this could be happening?
>>>>>>>>
>>>>>>>> Maurizio
>>>>>>>>
>>>>>>>>
>>>>>>>> On 14/03/2019 12:45, Jorn Vernee wrote:
>>>>>>>>> Updated webrev:
>>>>>>>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8220544/webrev.04/
>>>>>>>>> Changed Treemaker implementation to recurse to the 'root' type
>>>>>>>>> when creating TypdefTree::def, and using that in
>>>>>>>>> DependencyFinder.
>>>>>>>>>
>>>>>>>>> Jorn
>>>>>>>>>
>>>>>>>>> Jorn Vernee schreef op 2019-03-14 12:49:
>>>>>>>>>> Oh ok, sorry. I'll try that out.
>>>>>>>>>>
>>>>>>>>>> Jorn
>>>>>>>>>>
>>>>>>>>>> Maurizio Cimadamore schreef op 2019-03-14 12:43:
>>>>>>>>>>> On 14/03/2019 11:40, Jorn Vernee wrote:
>>>>>>>>>>>> I see what you mean.
>>>>>>>>>>>>
>>>>>>>>>>>> Well, `struct BAR` has a definition cursor, but `struct
>>>>>>>>>>>> BAR*` does not have a definition/declaration, it's a type
>>>>>>>>>>>> that's automatically derived from `struct BAR`. So for
>>>>>>>>>>>> `struct BAR*` there is no good value for TypedefTree::def.
>>>>>>>>>>>
>>>>>>>>>>> I know that there's no good value for struct BAR* - I was
>>>>>>>>>>> wondering if
>>>>>>>>>>> the parser should detect the pointer, and recurse down, then
>>>>>>>>>>> store
>>>>>>>>>>> 'struct BAR' into 'def'.
>>>>>>>>>>>
>>>>>>>>>>> Maurizio
>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> TypedefTree::def seems to be a helper method mostly targeted
>>>>>>>>>>>> at inline type definitions (looking at TypedefHandler [1]).
>>>>>>>>>>>>
>>>>>>>>>>>> I think for my use case using
>>>>>>>>>>>> TypedefTree.type().canonicalType() is good enough, but I
>>>>>>>>>>>> guess we could query that once in the parser and then store
>>>>>>>>>>>> it in a field in TypedefTree?
>>>>>>>>>>>>
>>>>>>>>>>>> Jorn
>>>>>>>>>>>>
>>>>>>>>>>>> [1] :
>>>>>>>>>>>> http://hg.openjdk.java.net/panama/dev/file/43ed53f40957/src/jdk.jextract/share/classes/com/sun/tools/jextract/TypedefHandler.java#l107
>>>>>>>>>>>>
>>>>>>>>>>>> Maurizio Cimadamore schreef op 2019-03-14 11:57:
>>>>>>>>>>>>> On 14/03/2019 00:23, Jorn Vernee wrote:
>>>>>>>>>>>>>> Sorry, bad example. The actual failure case is:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> struct BAR { int x; }
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> typedef struct BAR* FOO;
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> The TreeMaker code looks at the canonical type of the
>>>>>>>>>>>>>> typedef `struct BAR*` which is neither a type definition
>>>>>>>>>>>>>> or declaration, so TypedefTree::def is empty. But, in the
>>>>>>>>>>>>>> case of dependecy analysis, we still want to inspect that
>>>>>>>>>>>>>> type, get the pointee type and add it to the root set.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Right - and I think what I'm claiming is that this is
>>>>>>>>>>>>> probably some
>>>>>>>>>>>>> kind of a parser bug? That is, if Typedef::def (we should
>>>>>>>>>>>>> probably
>>>>>>>>>>>>> find another name, 'def' is not good enough IMHO) is set
>>>>>>>>>>>>> correctly for
>>>>>>>>>>>>>
>>>>>>>>>>>>> typedef struct BAR FOO;
>>>>>>>>>>>>>
>>>>>>>>>>>>> it should also be set for
>>>>>>>>>>>>>
>>>>>>>>>>>>> typedef struct BAR* FOO;
>>>>>>>>>>>>>
>>>>>>>>>>>>> That is, I claim that from the typedef tree you should
>>>>>>>>>>>>> always see a
>>>>>>>>>>>>> referenced type declaration w/o using the clang API.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Maurizio
>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Jorn
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Jorn Vernee schreef op 2019-03-14 01:14:
>>>>>>>>>>>>>>> Maurizio Cimadamore schreef op 2019-03-14 01:04:
>>>>>>>>>>>>>>>> So, if I understand correctly, the issue is that if you
>>>>>>>>>>>>>>>> have:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> typedef struct { int x; } FOO;
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> you want the struct to be added to the root set. Which
>>>>>>>>>>>>>>>> make sense.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Now, with respect to getUnderlyingType - I'm a bit at
>>>>>>>>>>>>>>>> odds; it seems
>>>>>>>>>>>>>>>> to me that the jextract tree should have the right info,
>>>>>>>>>>>>>>>> under
>>>>>>>>>>>>>>>> TypedefTree::def, at least that is set by the parser for
>>>>>>>>>>>>>>>> declarations/definitions.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> That exact case is covered by TypedefTree::def, but it
>>>>>>>>>>>>>>> doesn't cover a
>>>>>>>>>>>>>>> case like this:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> struct BAR { int x; }
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> typedef struct BAR FOO;
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> i.e. TypedefTree::def is only set when the typedef
>>>>>>>>>>>>>>> contains an inline
>>>>>>>>>>>>>>> definition or a prototype. But, if the type is just
>>>>>>>>>>>>>>> referenced,
>>>>>>>>>>>>>>> TypedefTree::def is an empty Optional.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Wouldn't visiting TypedefTree::def (if present) be
>>>>>>>>>>>>>>>> enough (and more in
>>>>>>>>>>>>>>>> sync with the rest of jextract) ? After all, that's the
>>>>>>>>>>>>>>>> kind of thing
>>>>>>>>>>>>>>>> you wanna be sure not to miss by the dependency analysis
>>>>>>>>>>>>>>>> -
>>>>>>>>>>>>>>>> getUnderlyingType seems a tad too noisy?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> This is what I had before, but it fell short in some
>>>>>>>>>>>>>>> cases.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> In other words, let's say that there's a typedef in an
>>>>>>>>>>>>>>>> header of a
>>>>>>>>>>>>>>>> library you want to jextract which is related, via a
>>>>>>>>>>>>>>>> chain of other 42
>>>>>>>>>>>>>>>> typedefs to something in some obscure system library.
>>>>>>>>>>>>>>>> Are you sure you
>>>>>>>>>>>>>>>> want the resulting artifact to have all the 42
>>>>>>>>>>>>>>>> intermediate typedefs?
>>>>>>>>>>>>>>>> After all, the library you wanna extract has just
>>>>>>>>>>>>>>>> defined 'its
>>>>>>>>>>>>>>>> version' of the name for that particular construct... so
>>>>>>>>>>>>>>>> it's very
>>>>>>>>>>>>>>>> likely that users of that library will prefer that name
>>>>>>>>>>>>>>>> to the other
>>>>>>>>>>>>>>>> 42 ones?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> 42 intermediate typedefs seems a bit extreme...
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> But, I think you have a point. Putting the typedef and
>>>>>>>>>>>>>>> the canonical
>>>>>>>>>>>>>>> type into the root set is probably enough.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Jorn
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Maurizio
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> On 13/03/2019 23:31, Jorn Vernee wrote:
>>>>>>>>>>>>>>>>> Update webrev:
>>>>>>>>>>>>>>>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8220544/webrev.02/
>>>>>>>>>>>>>>>>> This fixes an issue where typedef underlying types were
>>>>>>>>>>>>>>>>> not being added to the root set.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> It turns out I was using the wrong API to get the
>>>>>>>>>>>>>>>>> underlying type, and the needed API didn't have a
>>>>>>>>>>>>>>>>> binding yet :)
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> The changes with respect to the previous webrev;
>>>>>>>>>>>>>>>>> * added Cursor.getTypedefDeclUnderlyingType() binding
>>>>>>>>>>>>>>>>> * added TypdefTree.underlyingType() method
>>>>>>>>>>>>>>>>> * changed DependencyFinder to use this method instead
>>>>>>>>>>>>>>>>> of typeDefinition()
>>>>>>>>>>>>>>>>> * added test case for the failure case (also
>>>>>>>>>>>>>>>>> simplified test class to only run jextract once and
>>>>>>>>>>>>>>>>> reuse the result)
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>>>> Jorn
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Maurizio Cimadamore schreef op 2019-03-13 22:43:
>>>>>>>>>>>>>>>>>> On 13/03/2019 21:36, Jorn Vernee wrote:
>>>>>>>>>>>>>>>>>>>> Good questions. When no filter patterns are
>>>>>>>>>>>>>>>>>>>> specified that is the case
>>>>>>>>>>>>>>>>>>>> everything is outputted, but when filter patterns
>>>>>>>>>>>>>>>>>>>> are specified
>>>>>>>>>>>>>>>>>>>> headers are only added to the root set if they
>>>>>>>>>>>>>>>>>>>> contain a symbol that
>>>>>>>>>>>>>>>>>>>> passes the filter.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> FWIW, basically headers with symbols that pass both
>>>>>>>>>>>>>>>>>>> types of filter are added to the root set. There's
>>>>>>>>>>>>>>>>>>> 1.) Filtereing based on whether a symbol is found in
>>>>>>>>>>>>>>>>>>> a library, and 2.) based on the used filter patterns
>>>>>>>>>>>>>>>>>>> (--include-symbols & --exclude-symbols). I thought it
>>>>>>>>>>>>>>>>>>> would be better to exclude a header from the root set
>>>>>>>>>>>>>>>>>>> if all the symbols in it were filtered out by the
>>>>>>>>>>>>>>>>>>> filter patterns.
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Yep - I think that sounds sensible
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Maurizio
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Jorn
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Jorn Vernee schreef op 2019-03-13 22:30:
>>>>>>>>>>>>>>>>>>>> Maurizio Cimadamore schreef op 2019-03-13 22:08:
>>>>>>>>>>>>>>>>>>>>> Hi Jorn,
>>>>>>>>>>>>>>>>>>>>> this looks very good indeed. I'd like to play with
>>>>>>>>>>>>>>>>>>>>> it a bit before we
>>>>>>>>>>>>>>>>>>>>> go ahead with this, if that's ok.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Please do!
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Also, one question: if the user does not specify
>>>>>>>>>>>>>>>>>>>>> "-l" what happens? I
>>>>>>>>>>>>>>>>>>>>> guess the root set will then contain all the
>>>>>>>>>>>>>>>>>>>>> headers and we just get
>>>>>>>>>>>>>>>>>>>>> back the full output (which would be ok) ?
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Good questions. When no filter patterns are
>>>>>>>>>>>>>>>>>>>> specified that is the case
>>>>>>>>>>>>>>>>>>>> everything is outputted, but when filter patterns
>>>>>>>>>>>>>>>>>>>> are specified
>>>>>>>>>>>>>>>>>>>> headers are only added to the root set if they
>>>>>>>>>>>>>>>>>>>> contain a symbol that
>>>>>>>>>>>>>>>>>>>> passes the filter.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Maybe we should just fall back to
>>>>>>>>>>>>>>>>>>>> 'include-everything' when no "-l"
>>>>>>>>>>>>>>>>>>>> options are specified, regardless of filter?
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> Jorn
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> Maurizio
>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>> On 13/03/2019 18:06, Jorn Vernee wrote:
>>>>>>>>>>>>>>>>>>>>>> Updated webrev:
>>>>>>>>>>>>>>>>>>>>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8220544/webrev.01/
>>>>>>>>>>>>>>>>>>>>>> Fixed the bug, also added tests & ran all the
>>>>>>>>>>>>>>>>>>>>>> examples again to try and find other bugs (nothing
>>>>>>>>>>>>>>>>>>>>>> found).
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>> Jorn
>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>> Jorn Vernee schreef op 2019-03-13 17:50:
>>>>>>>>>>>>>>>>>>>>>>> Discovered a bug in this after posting :(
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> DependencyFinder also needs to look for pointee
>>>>>>>>>>>>>>>>>>>>>>> and array element type
>>>>>>>>>>>>>>>>>>>>>>> cursors (which it currently doesn't). I've tested
>>>>>>>>>>>>>>>>>>>>>>> a working fix, but
>>>>>>>>>>>>>>>>>>>>>>> will also add some tests for the particular
>>>>>>>>>>>>>>>>>>>>>>> cases. Updated webrev
>>>>>>>>>>>>>>>>>>>>>>> coming soon™
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Jorn
>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>> Jorn Vernee schreef op 2019-03-13 17:21:
>>>>>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> After some discussion:
>>>>>>>>>>>>>>>>>>>>>>>> https://mail.openjdk.java.net/pipermail/panama-dev/2019-March/004828.html
>>>>>>>>>>>>>>>>>>>>>>>> I've implemented the discussed approach to
>>>>>>>>>>>>>>>>>>>>>>>> header & declaration filtering.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Bug:
>>>>>>>>>>>>>>>>>>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8220544
>>>>>>>>>>>>>>>>>>>>>>>> Webrev:
>>>>>>>>>>>>>>>>>>>>>>>> http://cr.openjdk.java.net/~jvernee/panama/webrevs/8220544/webrev.00/
>>>>>>>>>>>>>>>>>>>>>>>> There are a few new implementation classes:
>>>>>>>>>>>>>>>>>>>>>>>> * PattertnFilter; a helper class that
>>>>>>>>>>>>>>>>>>>>>>>> encapsulates the Pattern based
>>>>>>>>>>>>>>>>>>>>>>>> filtering code previously found in SymbolFilter.
>>>>>>>>>>>>>>>>>>>>>>>> This code had to be
>>>>>>>>>>>>>>>>>>>>>>>> reused.
>>>>>>>>>>>>>>>>>>>>>>>> * Filters; a Context sub-component holding
>>>>>>>>>>>>>>>>>>>>>>>> PatternFilters for
>>>>>>>>>>>>>>>>>>>>>>>> different types of declarations.
>>>>>>>>>>>>>>>>>>>>>>>> * DependencyFinder; finds dependencies of the
>>>>>>>>>>>>>>>>>>>>>>>> root set of
>>>>>>>>>>>>>>>>>>>>>>>> declarations found in the root headers.
>>>>>>>>>>>>>>>>>>>>>>>> * ElementFilter; filters out non-library
>>>>>>>>>>>>>>>>>>>>>>>> symbol elements based on
>>>>>>>>>>>>>>>>>>>>>>>> whether they appear in a root header or are
>>>>>>>>>>>>>>>>>>>>>>>> required by something
>>>>>>>>>>>>>>>>>>>>>>>> therein.
>>>>>>>>>>>>>>>>>>>>>>>> * RootSet; a helper class for managing root
>>>>>>>>>>>>>>>>>>>>>>>> headers + required element Trees.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> I also encountered some crashes when debug
>>>>>>>>>>>>>>>>>>>>>>>> printing Trees, which I've
>>>>>>>>>>>>>>>>>>>>>>>> fixed/worked around accordingly.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> FWIW, I tried this out with the Windows registry
>>>>>>>>>>>>>>>>>>>>>>>> API and it's working
>>>>>>>>>>>>>>>>>>>>>>>> very nicely! Going from well over 100 headers to
>>>>>>>>>>>>>>>>>>>>>>>> under 10. Some room
>>>>>>>>>>>>>>>>>>>>>>>> for improvement still exists; some empty headers
>>>>>>>>>>>>>>>>>>>>>>>> and static forwarders
>>>>>>>>>>>>>>>>>>>>>>>> could still be omitted, but imho that should be
>>>>>>>>>>>>>>>>>>>>>>>> handled by a separate
>>>>>>>>>>>>>>>>>>>>>>>> patch.
>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>>>>>>>>>>>>> Jorn
More information about the panama-dev
mailing list