From: <ma...@go...> - 2007-01-22 05:03:19
|
Hello Fabian, Just to let you know, the changes to carrays.i & lua.cxx are now in SVN. I found that your patch for reducing the polution of the namespace accidentally stopped static member functions from appearing as well, but I copied an idea from the ruby code & got a working set of code. Please check it out and keep any other patches coming. Thanks Again, Mark William S Fulton <ws...@fu...> wrote : > You are welcome to change what you need for Lua. You'd need to add in a > carrays.i file in Lib/lua which will contain something like: > > %rename(__getitem) *::getitem; // the v=X[i] (get operator) > %rename(__setitem) *::setitem; // the X[i]=v (set operator) > > %include <../carrays.i> > > William > > mark gossage wrote: > > Hello Fabian, > > Thanks for the feedback, keep it > coming. > > > > 1: the global rename of getitem. > > I am a little hesitant to do this, as it will > effect all classes, and not just the carrays. > > I will consider adding a __getitem__ and > __setitem__ to carrays.i, as this works for lua and python (an possibly some > other languages). > > So any of the wider swig developers have any > objection to adding a couple of new methods to the carrays.i? > > > > 2: adding a new constructor instead of a > frompointer > > This one I an not keen on, as anything that it > constructred, ends up destructed, and this will cause a double free issue. I > haven't seem it in lua, which makes me wonder if there is a bug in the memory > managment code somewhere. > > (But you can certainly use your patch for > yourself, which is a nice feature of SWIG) > > > > 3: reducing the pollution of the > module > > Guilty as charged, I never bothered to tidy it > up. > > i will check the code & test it, if there > are no problems it will be in SVN before the end of the week. > Thanks. > > > > Any of the SWIG depelopers have any issue with > adding a couple of new methods to carrays.i?? Please let me know. > > > > Regards, > > Mark Gossage > > > >> Hi, > >> > >> first of all I'm new to swig and I like it > very much, but there were some > >> things I did really dislike. And almost all > have to do with carrays.i. > >> > >> And as I'm a good open source boy, I'm > sharing them with you. > >> > >> For lua that carrays.i works correctly I use > the following: > >> > >> #ifdef SWIGLUA > >> %rename(__getitem) > *::getitem; // the v=X[i] (get > >> operator) > >> %rename(__setitem) > *::setitem; // the X[i]=v (set > >> operator) > >> #endif > >> > >> This should be added somewhere (lua.swg?) or > "fixed". > >> > >> As I did not like the frompointer function I > removed it and added a constructor > >> instead: > >> > >> %define %array_myclass(TYPE,NAME) > >> > >> %ignore NAME::frompointer(TYPE > *t); > >> > >> %array_class(TYPE, NAME) > >> > >> %nonewobject NAME::NAME(TYPE *t); > >> > >> %extend NAME { > >> > >> NAME(TYPE *t) { > >> return (NAME *) t; > >> } > >> > >> }; > >> > >> %enddef > >> > >> So with %array_myclass(int, intA) I can work > with my functions and then from > >> lua just do: > >> > >>> x=intA(a_int_p) > >> This feels much more natural for > me. > >> > >> Last but not least swig pollutes the lua > namespace with lots of functions > >> like: > >> > >> intA_cast, new_intA, delete_intA and so on > ... > >> > >> I know that this functions _are_ needed, but > not directly. > >> > >> Solution was to add to lua.cxx at the start > of functionWrapper: > >> > >> virtual int functionWrapper(Node *n) > { > >> > >> char *cname, *ciname; > >> String *name = > Getattr(n,"name"); > >> String *iname = > Getattr(n,"sym:name"); > >> SwigType *d = > Getattr(n,"type"); > >> + cname=Char(name); > >> + ciname=Char(iname); > >> + int add_to_function_table = > 0; > >> + > >> + if (strcmp(cname,ciname) == > 0) > >> + add_to_function_table=1; > >> + > >> > >> and later on: > >> > >> +if (add_to_function_table) > >> Printv(s_cmd_tab, tab4, "{ > \"", iname, "\", > >> ", Swig_name_wrapper(iname), > "},\n", NIL); > >> > >> and: > >> > >> changed: dispatchFunction(n, > add_to_function_table); > >> > >> changed: dispatchFunction(Node *n, int > add_to_function_table) { > >> > >> and > >> > >> + if (add_to_function_table) > >> Printv(s_cmd_tab, tab4, "{ > \"", symname, > >> "\",", wname, > "},\n", NIL); > >> > >> The idea is quite simple. > >> > >> Any function, where sym:name is not equal to > name is just not added to the > >> function table as the metatable does all the > hard work and the functions are > >> not necessary. > >> > >> Note: Namespace pollution is especially bad > if you use tab completion. > >> > >> I've done some tests and it seems to work > great. > >> > >> Comments to all 3 things > appreciated. > >> > >> cu > >> > >> Fabian > >> > >> PS: Again and again: Great work! I'm > currently working on making snes9x > >> scriptable via swig and I already have one > working "patch". |