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 <[email protected]> wrote:
> 
> Hi, 
> 
>> On 21 Oct 2017, at 21:15, Stephane Ducasse <[email protected]> wrote:
>> 
>> Esteban will probably reply to this thread
> 
> yes, I will :)
> 
>> 
>> 
>> On Thu, Oct 19, 2017 at 10:34 PM, Todd Blanchard <[email protected]> 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 <[email protected]> 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 <[email protected]> wrote:
>>> 
>>> 
>>> 
>>> On Thu, Oct 19, 2017 at 1:05 AM, Todd Blanchard <[email protected]> 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 <[email protected]>
>>>> 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 <[email protected]>
>>>> 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 <[email protected]>
>>>>> wrote:
>>>>>> Wonderful!  Thanks.
>>>>>> 
>>>>>>> On Oct 17, 2017, at 3:45 PM, stephan <[email protected]> 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