:)

Did you look at this project: 
https://github.com/estebanlm/libclang-pharo-bindings/ 
<https://github.com/estebanlm/libclang-pharo-bindings/> ?

it was using parseTranslationUnit (no 2)… there you can find how is being used 
(I just converted it to tonel format, but older versions are in filetree)

Esteban

> On 24 Oct 2017, at 19:17, Todd Blanchard <tblanch...@mac.com> wrote:
> 
> Hey Esteban,
> 
> Now that you have outed yourself as a maintainer of FFI, I have a question. 
> :-)
> 
> I want to call the libclang function:
> 
> /**
> * \brief Parse the given source file and the translation unit corresponding
> * to that file.
> *
> * This routine is the main entry point for the Clang C API, providing the
> * ability to parse a source file into a translation unit that can then be
> * queried by other functions in the API. This routine accepts a set of
> * command-line arguments so that the compilation can be configured in the same
> * way that the compiler is configured on the command line.
> *
> * \param CIdx The index object with which the translation unit will be 
> * associated.
> *
> * \param source_filename The name of the source file to load, or NULL if the
> * source file is included in \c command_line_args.
> *
> * \param command_line_args The command-line arguments that would be
> * passed to the \c clang executable if it were being invoked out-of-process.
> * These command-line options will be parsed and will affect how the 
> translation
> * unit is parsed. Note that the following options are ignored: '-c', 
> * '-emit-ast', '-fsyntax-only' (which is the default), and '-o \<output 
> file>'.
> *
> * \param num_command_line_args The number of command-line arguments in
> * \c command_line_args.
> *
> * \param unsaved_files the files that have not yet been saved to disk
> * but may be required for parsing, including the contents of
> * those files.  The contents and name of these files (as specified by
> * CXUnsavedFile) are copied when necessary, so the client only needs to
> * guarantee their validity until the call to this function returns.
> *
> * \param num_unsaved_files the number of unsaved file entries in \p
> * unsaved_files.
> *
> * \param options A bitmask of options that affects how the translation unit
> * is managed but not its compilation. This should be a bitwise OR of the
> * CXTranslationUnit_XXX flags.
> *
> * \param[out] out_TU A non-NULL pointer to store the created
> * \c CXTranslationUnit, describing the parsed code and containing any
> * diagnostics produced by the compiler.
> *
> * \returns Zero on success, otherwise returns an error code.
> */
> enum CXErrorCode
> clang_parseTranslationUnit2(CXIndex CIdx,
>                            const char *source_filename,
>                            const char *const *command_line_args,
>                            int num_command_line_args,
>                            struct CXUnsavedFile *unsaved_files,
>                            unsigned num_unsaved_files,
>                            unsigned options,
>                            CXTranslationUnit *out_TU);
> 
> The parts I'm not clear on are turning an array or ordered collection of 
> strings into an argv/argc, turning an array of CXUnsavedFile's 
> (FFIExternalStruct) into an array of pointers and count, and getting data 
> back in an output argument as CXTranslationUnit which is an opaque pointer to 
> a C++ object.
> 
> Any tips on these mappings would be great.  I've currently guessed it as:
> 
> clang_parseTranslationUnit__cxIndex: cxIndex source: sourceFile arguments: 
> argv unsavedFiles:unsaved options: opts
> 
>       | argc unsaved_files num_unsaved_files options error out_TU |
>       argc := argv size.
>       unsaved_files := unsaved ifNil: [ #() ] ifNotNil: [ unsaved ]. 
>       num_unsaved_files := unsaved_files ifNil: [ 0 ] ifNotNil: 
> [unsaved_files size].
>       options := opts sum.
>       
>       error := self ffiCall:  #(CXErrorCode 
> clang_parseTranslationUnit2(CXIndex cxIndex,
>                           String sourceFile,
>                           String *argv,
>                           uint argc,
>                           CXUnsavedFile *unsaved_files,
>                           uint num_unsaved_files,
>                           CXTranslationUnitFlag options,
>                                                                 
> CXTranslationUnit *out_TU)).
>                                                               
>       (error = CXError_Success) ifTrue: [ ^out_TU ].
>       self error: error
> 
> Thanks.
> 
> 
>> On Oct 22, 2017, at 2:42 AM, Esteban Lorenzano <esteba...@gmail.com> wrote:
>> 
>> Hi, 
>> 
>>> On 21 Oct 2017, at 21:15, Stephane Ducasse <stepharo.s...@gmail.com> wrote:
>>> 
>>> Esteban will probably reply to this thread
>> 
>> yes, I will :)
>> 
>>> 
>>> 
>>> On Thu, Oct 19, 2017 at 10:34 PM, Todd Blanchard <tblanch...@mac.com> wrote:
>>>> I have found the problem with VoidPointer3 generating accessors.
>> 
>> can you report that on fogbugz ?
>> (along with your solution)
>> 
>> thanks!
>> Esteban
>> 
>>>> 
>>>> No idea how to contribute back a fix but this is what I've found.
>>>> 
>>>> FFITypeArrayType>>annonymousClassCreator
>>>> ^ String streamContents: [ :stream |
>>>> stream
>>>> nextPutAll: '(FFITypeArray ofType: ';
>>>> print: (self objectClass type isPointer ifTrue: [self externalTypeWithArity
>>>> printString] ifFalse: ['#',self objectClass type class]);
>>>> nextPutAll: ' size: ';
>>>> print: self objectClass numberOfElements;
>>>> nextPutAll: ')' ]
>>>> 
>>>> Recalling that we are trying to come up with an accessor that can pull out 
>>>> a
>>>> void*[3], this produces
>>>> 
>>>> '(FFITypeArray ofType: #FFIVoid size: 3)'
>>>> 
>>>> which produces an error as FFIVoid's size is undefined.  In general, this
>>>> will be wrong for any pointer type and will probably get the size
>>>> calculation wrong.
>>>> 
>>>> Doing a little digging I find that
>>>> 
>>>> FFITypeArray>>ofType: aType size: aSize
>>>> 
>>>> delegates resolution of aType to FFIExternalType>>resolveType:aType and 
>>>> this
>>>> can take all kinds of different things including the native type name.
>>>> 
>>>> It would be better if this generated the native name for pointers.
>>>> 
>>>> (FFITypeArray ofType: 'void*' size: 3)
>>>> 
>>>> So I changed it to:
>>>> 
>>>> FFITypeArrayType>>annonymousClassCreator
>>>> ^ String streamContents: [ :stream |
>>>> stream
>>>> nextPutAll: '(FFITypeArray ofType: ';
>>>> print: (self objectClass type isPointer
>>>> ifTrue: [self externalTypeWithArity printString]
>>>> ifFalse: ['#',self objectClass type class]);
>>>> nextPutAll: ' size: ';
>>>> print: self objectClass numberOfElements;
>>>> nextPutAll: ')' ]
>>>> 
>>>> and this seems to work fine.
>>>> 
>>>> Onwards...
>>>> 
>>>> On Oct 19, 2017, at 7:18 AM, Todd Blanchard <tblanch...@mac.com> wrote:
>>>> 
>>>> That’s great - it’s been kind of magical but a couple things have changed
>>>> since you wrote it and some bugs have crept into ffi.
>>>> 
>>>> Right now I’m finding the generated accessor for the VoidPointer3 is
>>>> actually generating a void 3 accessor and that doesn’t work. I spent all 
>>>> day
>>>> yesterday tracking it to the accessor generating code.
>>>> 
>>>> Sent from the road
>>>> 
>>>> On Oct 18, 2017, at 22:29, Ben Coman <b...@openinworld.com> wrote:
>>>> 
>>>> 
>>>> 
>>>> On Thu, Oct 19, 2017 at 1:05 AM, Todd Blanchard <tblanch...@mac.com> wrote:
>>>>> 
>>>>> I'm working through Ben's great blog post about playing with libclang and
>>>>> I am puzzled by something.
>>>> 
>>>> 
>>>> Thx Todd. Knowing someone is looking at it encourages me to expand it.
>>>> I'm interested in looking at your specific questions, but it might not be
>>>> until next week after this stint of long work days.
>>>> 
>>>> cheers -ben
>>>> 
>>>> 
>>>>> 
>>>>> 
>>>>> invalidateSessionData
>>>>> handle atAllPut: 0.
>>>>> 
>>>>> zero;s out the handle.  Cool.  However,
>>>>> 
>>>>> handle isNull
>>>>> 
>>>>> does not return true despite it being used in the getString method as
>>>>> 
>>>>> ^ handle isNull
>>>>>       ifTrue: ['external memory invalidated by session restart']
>>>>>       ifFalse:[LibClang clang_getCString__cxString: self].
>>>>> 
>>>>> Looks like there should be an isNull on ByteArray that returns true if all
>>>>> bytes are zero but it isn't  there.  Was it dropped for some reason?
>>>>> 
>>>>> 
>>>>> 
>>>>> On Oct 18, 2017, at 2:58 AM, Dimitris Chloupis <kilon.al...@gmail.com>
>>>>> wrote:
>>>>> 
>>>>> Sure the documentation could be better, that is definetly important, but
>>>>> is already good enough and UFFI is a very technical subject much more 
>>>>> suited
>>>>> to a mailing list . Its not physical possible to cover the massive 
>>>>> potential
>>>>> of UFFI.
>>>>> 
>>>>> On Wed, Oct 18, 2017 at 9:32 AM Stephane Ducasse <stepharo.s...@gmail.com>
>>>>> wrote:
>>>>>> 
>>>>>> Please do not hesitate to do Pull Requests.
>>>>>> Luc told me that he wants to do a pass on it and Esteban promises that to
>>>>>> me
>>>>>> but he is super busy.
>>>>>> 
>>>>>> Stef
>>>>>> 
>>>>>> 
>>>>>> On Wed, Oct 18, 2017 at 5:54 AM, Todd Blanchard <tblanch...@mac.com>
>>>>>> wrote:
>>>>>>> Wonderful!  Thanks.
>>>>>>> 
>>>>>>>> On Oct 17, 2017, at 3:45 PM, stephan <step...@stack.nl> wrote:
>>>>>>>> 
>>>>>>>> On 17-10-17 23:06, Todd Blanchard wrote:
>>>>>>>>> Anyone know what happened to this?
>>>>>>>>> 
>>>>>>>>> https://ci.inria.fr/pharo-contribution/view/Books/job/PharoBookWorkInProgress/lastSuccessfulBuild/artifact/book-result/UnifiedFFI/UnifiedFFI.pdf
>>>>>>>> 
>>>>>>>> https://github.com/SquareBracketAssociates/Booklet-uFFI
>>>>>>>> 
>>>>>>>> has a link to a bintray pdf download
>>>>>>>> 
>>>>>>>> Stephan
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>>> 
>>> 
>> 
>> 
> 

Reply via email to