• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: info.plist with DYLD_LIBRARY_PATH = ~/test
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: info.plist with DYLD_LIBRARY_PATH = ~/test


  • Subject: Re: info.plist with DYLD_LIBRARY_PATH = ~/test
  • From: Ken Thomases <email@hidden>
  • Date: Sat, 2 Oct 2010 06:20:57 -0500

On Oct 2, 2010, at 5:10 AM, Kurt Sutter wrote:

> Sorry to be obtuse, but it may be that I am overlooking something. Presently, we have calls such as
>
> n = PyNumber_Float(obj)
> s = PyString_AsString(obj)
>
> I understand that I would need to generate #defines for all those names, such as PyNumber_Float to map them to some table. I would have to initialize that table in a big for loop that goes through another table containing the name of each function (e.g. "PyNumber_Float". The loop then looks each name up with dlsym and initializes the table.
>
> Or can this be done more elegantly?

Declare function pointers:

typeof(PyNumber_Float) *pPyNumber_Float;
typeof(PyString_AsString) * pPyString_AsString;

This can be table-ized with a macro:

#define DOFUNC(f) typeof(f) *p##f
	DOFUNC(PyNumber_Float);
	DOFUNC(PyString_AsString);
	// ...
#undef DOFUNC


During initialization, dynamically load the Python framework with dlopen().  Then, load the function pointers by looking up the symbols:

pPyNumber_Float = dlsym(handle, "PyNumber_Float");
pPyString_AsString = dlsym(handle, "PyString_AsString");

This can be table-ized with a macro:

#define DOFUNC(f) do { if (!(p##f = dlsym(handle, #f))) { \
	fprintf(stderr, "Failed to load %s\n", #f); \
	goto bail; \
} while (0)
	DOFUNC(PyNumber_Float);
	DOFUNC(PyString_AsString);
	// ...
#undef DOFUNC


Notice that the table within the definitions of DOFUNC is identical in both cases.  So, you can extract it to a separate file and #include it between the DOFUNC #define and #undef:

#define DOFUNC(f) /* whatever */
#include "PythonFunctionDoFuncs.h"
#undef DOFUNC

That way there's just the one table for both purposes.


Then, you have two choices.  1) Throughout your code, call the functions with the function pointers.  This basically entails prepending a "p" to all the function names.  2) Use macros to do this for you:

#define PyNumber_Float pPyNumber_Float
#define PyString_AsString pPyString_AsString

I can't think of a technique to table-ize the above.  There may be one that I'm forgetting, but I don't think so.  Still, that's just two places to touch for each Python function you use.

If you want to get fancier, you could have a single file which just lists the Python functions you use, one per line.  Then, a script would generate both the PythonFunctionDoFuncs.h and a PythonFunctionRedefines.h (with the above macro definitions) from that list.

Regards,
Ken

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: info.plist with DYLD_LIBRARY_PATH = ~/test
      • From: Gwynne Raskind <email@hidden>
References: 
 >info.plist with DYLD_LIBRARY_PATH = ~/test (From: Kurt Sutter <email@hidden>)
 >Re: info.plist with DYLD_LIBRARY_PATH = ~/test (From: Ken Thomases <email@hidden>)
 >Re: info.plist with DYLD_LIBRARY_PATH = ~/test (From: Kurt Sutter <email@hidden>)
 >Re: info.plist with DYLD_LIBRARY_PATH = ~/test (From: Ken Thomases <email@hidden>)
 >Re: info.plist with DYLD_LIBRARY_PATH = ~/test (From: Kurt Sutter <email@hidden>)

  • Prev by Date: Re: info.plist with DYLD_LIBRARY_PATH = ~/test
  • Next by Date: Re: Seriously confused by behavior of NSAffineTransform
  • Previous by thread: Re: info.plist with DYLD_LIBRARY_PATH = ~/test
  • Next by thread: Re: info.plist with DYLD_LIBRARY_PATH = ~/test
  • Index(es):
    • Date
    • Thread