------ art_9370_1627973.1128438877370
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Hello,
I will repost my comments here because I think here would be more suitable
than on the NG (comp.lang.ruby).
I'm interested in inserting certain profiling templates into ruby for some
experiments. This means that ruby must be c++-compileable. I started using
1.9 instead of 1.8 because I noticed a large effort had been made to step
away from K&R function syntax to ANSI C function syntax, for which I am
glad. After struggling with the compiler for a bit I finally managed to make
it compile in c++. The steps that were required to achieve this were:
1) make sure that all .c and .h files include something like
#if defined(__cplusplus)
extern "C" {
#endif
... code
#if defined(__cplusplus)
}
#endif
2) Make sure there are no typing errors. C++ is a lot stricter on types.
Therefore I made some changes here and there to functions that took no
arguments but were designated as /* ??? */ and made them take ANYARGS. I
then declared the following helper functions in ruby.h
#define VALUEFUNC(f) ((VALUE (*)(ANYARGS))f)
#define VOIDFUNC(f) ((void (*)(ANYARGS))f)
#define INTFUNC(f) ((int (*)(ANYARGS))f)
In hindsight I could probably reduce all these to a single macro. These were
then used to remove type-problems such as:
rb_define_method(rb_cArray, "==", rb_ary_equal, 1);
By transforming that into
rb_define_method(rb_cArray, "==", VALUEFUNC(rb_ary_equal), 1);
A few (I can't remember if it's 1 or 2) structs tables had to be changed to
take functions that take ANYARGS instead of no parameters.
3) The last major effort was in regular expressions where the usage of
unsigned char *, char* and UChar * flow through each other. I just followed
the compiler and added appropriate casts.
4) At certain points -1 is returned even though it's long, where I just
added a cast. Also in certain places K&R syntax was still used
If you would like I could send a patch with these changes. However someone
would have to look at the changes of point 1) and 4) to make sure they are
consequential, I was just trying to get it done, not to get it done cleanly.
I have only done this for ruby itself, not for the ext/ folder. I started
doing it but then there were some issues with the makefiles in regards to
bigdecimal which led to the failure of any further ext's being compiled.
As was mentioned, I could link in C++ code easily. But that is not the
point, I want to use my templates WITHIN the code of the interpreter to
measure certain things. That is why I wanted it C++ compileable. I think
this is a worthy effort that could be placed into CVS because it does
alleviate future problems.
One issue I had is that array test 37 and 38 (sample/test.rb 804 and 808)
failed. Is this due to my changes or is this due to ruby 1.9? I'll try to
compare but sadly I'm having issues keeping an active version of ruby on my
computer at work given the fact that I'm firewalled and hence can not access
your cvs port
With regards,
Christophe Poucet
------ art_9370_1627973.1128438877370--