From: Christophe Poucet Date: 2005-10-05T00:14:40+09:00 Subject: c++ Compileability and bugs in 1.9 ------=_Part_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 mak= e 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 wer= e then used to remove type-problems such as: rb_define_method(rb_cArray, "=3D=3D", rb_ary_equal, 1); By transforming that into rb_define_method(rb_cArray, "=3D=3D", 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 acces= s your cvs port With regards, Christophe Poucet ------=_Part_9370_1627973.1128438877370--