On Wed, Aug 16, 2006 at 12:06:39AM -0500, John Lenz wrote: > On 08/15/06 23:14, Chris Shoemaker wrote: > > > > And I was wrong about that last part. G-wrap does it right from C. > > > > So, SWIG uses scm_c_define_gsubr() to convert the enum value to a > > _function_ returning the enum value. > > > > Is there some reason why it doesn't include: > > > > scm_c_define("GNC-OWNER-EMPLOYEE", > > scm_long2_num(gswig_const_GNC_OWNER_EMPLOYEE)); > > > > inside the scm_init_FOO_module() function? That treatment of enum > > values would allow: (eq? GNC-OWNER-EMPLOYEE (gncOwnerGetType employee)) > > > > which seems more natural to me. > > > > I've looked at the "enum SWIGTYPE" typemaps for guile, but I didn't > > see any mechanism for generating code into the scm_init_FOO_module() > > function. Is that even possible? Thanks. > > Not from a typemap (because typemaps assume a function around them), but > it is possible. The way it would have to work is Source/Lib/guile.cxx > would have to be modified to either produce a constant directly in a > static variable, and then insert the code to register it into the %init > section, or leave the enum function generated as is in the wrapper > function, and then add code that does > > (define GNC-OWNER-EMPLOYEE (GNC-OWNER-EMPLOYEE)) > > This is the easist solution, you just need to add that code into the > %scheme { } section of the .i file. There are two ways I see to do that > > 1) Run swig -xml or swig -sexp (probably want sexp) and parse the output > to generate all the (define ...) statements into a file, and then > include that generated file in the .i file > > 2) Modify SWIG to (optionally) emit the code itself (like on an > enumasvar feature). This wouldn't be too difficult... just override the > enumvalueDeclaration(Node *n) function in guile.cxx. Just copy it from > lang.cxx, and add a few lines like > > if (Getflag(n, "feature:enumasvar") { > Printf(scmtext, "(define %s (%s))", name); > } >
3?) [Possible short-term solution for the lazy and impatient] Manually insert "scm_c_eval_string("(set! GNC-OWNER-EMPLOYEE (GNC-OWNER-EMPLOYEE))" into %init {} section of .i files for all enum values. (To explain why not %scheme {}, I should note that I'm not using -scmstub.) > If you are interested, I could add this feature to guile (and probably > add it to chicken at the same time). This solution would require you to > use the CVS version of SWIG until the next release is made... Assuming this behavior makes as much sense to other people as it does to me, I think the idea of using a static variable and a scm_c_define() is a good change. And we can wait for a formal release by using the short-term solution above. The only thing I wonder about is... wouldn't that be a not-backward-compatible change to swig? -chris _______________________________________________ gnucash-devel mailing list gnucash-devel@gnucash.org https://lists.gnucash.org/mailman/listinfo/gnucash-devel