[ 
https://issues.apache.org/jira/browse/LUCY-231?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13259335#comment-13259335
 ] 

Marvin Humphrey commented on LUCY-231:
--------------------------------------

> Hmm, "cfish_Method" would clash with the name of a real Method class once
> it's introduced.  Although we could create Method objects without using the
> struct then, it might be worth to keep the struct for initialization. It's
> more compact memory-wise than to unroll everything into function arguments.

My main concern is that we avoid publishing the struct definition.

I think both of our objectives can be met by scope-limiting the method data
struct def to the source file, defining an array of structs and looping over
the array to feed a constructor.  That way, we can e.g. add a member var to
Clownfish::Method without breaking extensions.

> "cfish_MetaData" doesn't tell that the metadata is about methods.

Sorry, that was a brain-o. :(

That suggestion should have read "cfish_MethodMetadata".

> We have to exchange CHY_EXPORT for CHY_IMPORT in headers of included classes
> because of the way DLL symbols are handled on Windows.
>
> The reason I went with my approach is that we'd have to introduce per-parcel
> #defines if we want to make the CFC output deterministic. That's more
> complicated.

OK, you've persuaded me.  The more I think about it the more I like it!

> It would also mean that an extension could never use the same
> parcel as the project it extends.

Well, that's actually the intent -- no two extensions should ever have the
same parcel.  The parcel is the Clownfish unit of distribution.  If you had
two distros with the same parcel, they would collide, both at installation
time and at runtime.

> We could also autogenerate a #define in parcel.h for every parcel.

> This would mean to keep track of every parcel encountered during compilation.

That's a lot of bookkeeping, all right.

I believe that under your system, developers will expend less effort and get
more reliable results. :)  And if something goes wrong, it will be easy to
tell -- there will massive catastrophic link errors.
                
> Symbol visibility
> -----------------
>
>                 Key: LUCY-231
>                 URL: https://issues.apache.org/jira/browse/LUCY-231
>             Project: Lucy
>          Issue Type: Task
>          Components: Clownfish
>            Reporter: Nick Wellnhofer
>            Assignee: Nick Wellnhofer
>         Attachments: 
> 0001-Preliminary-Charmonizer-support-for-symbol-export.patch, 
> 0002-Switch-to-fvisibility-hidden-and-start-using-CHY_EXP.patch, 
> 0003-Unify-method-data-for-initialization-and-callbacks.patch, 
> 0004-Preliminary-Charmonizer-support-for-symbol-export.patch, 
> 0005-Switch-to-fvisibility-hidden-and-start-using-CHY_EXP.patch, 
> 0006-Install-import-library-on-Windows.patch, bad_encapsulation.pl, 
> bad_encapsulation_report.txt
>
>
> In order to get compiled extension working on Windows, we'll have to define 
> the visibility of our extern variables and functions. On Windows every 
> exported symbol of a DLL has to be marked with __declspec(dllexport) when 
> compiling the DLL. If you're linking against a DLL, every symbol imported 
> from the DLL has to be marked __declspec(dllimport)
> On UNIX, every symbol is exported by default, so defining visibility is not 
> strictly necessary. But hiding symbols that don't have to be exported has the 
> benefit of reducing size and speeding up loading of a DLL. Hidden symbols 
> also allow the compiler to generate more optimized code.
> The standard approach is to compile with the GCC option -fvisibility=hidden 
> which emulates the Windows behavior. Then a macro is defined roughly like 
> that (should probably be handled by charmonizer):
> {noformat}
> #if defined __GNUC__
> #  if defined _WIN32 || defined __CYGWIN__
> #    define CHY_EXPORT __attribute__ ((dllexport))
> #  elif __GNUC__ >= 4
> #    define CHY_EXPORT __attribute__ ((visibility ("default")))
> #  else
> #    define CHY_EXPORT
> #  endif
> #elif defined _MFC_VER
> #  define CHY_EXPORT __declspec(dllexport)
> #else
> #  define CHY_EXPORT
> #endif
> {noformat}
> This macro can then be used like that:
> {noformat}
> CHY_EXPORT void
> exported_function();
> extern CHY_EXPORT int exported_variable;
> {noformat}
> When compiling an extension, we also have to handle __declspec(dllimport) on 
> Windows. For the generated headers, we could define CHY_IMPORT and use it 
> instead of CHY_EXPORT for "included" headers. For the code in XSBind.[ch], we 
> could define BUILDING_XSBIND only during compilation of XSBind.c and then use 
> something like that:
> {noformat}
> #if defined __GNUC__
> #  if defined _WIN32 || defined __CYGWIN__
> #    if BUILDING_XSBIND
> #      define XSBIND_EXPORT __attribute__ ((dllexport))
> #    else
> #      define XSBIND_EXPORT __attribute__ ((dllimport))
> #    endif
> #  elif __GNUC__ >= 4
> #    define XSBIND_EXPORT __attribute__ ((visibility ("default")))
> #  else
> #    define XSBIND_EXPORT
> #  endif
> #elif defined _MFC_VER
> #  if BUILDING_XSBIND
> #    define XSBIND_EXPORT __declspec(dllexport)
> #  else
> #    define XSBIND_EXPORT __declspec(dllimport)
> #  endif
> #else
> #  define XSBIND_EXPORT
> #endif
> XSBIND_EXPORT cfish_Obj*
> cfish_XSBind_new_blank_obj(SV *either_sv);
> {noformat}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to