Strange 'require' side-effects with rubygems

A

Avdi B. Grimm

I'm trying to use the ruby-serialport library
(http://rubyforge.org/projects/ruby-serialport/) under Ruby 1.8.2 on Windows
XP, and I ran into some odd behaviour. Perhaps someone here can explain
what's going on.

First, here's a much-elided excerpt from serialport.c:

....
void Init_serialport() {
...
cSerialPort = rb_define_class("SerialPort", rb_cIO);
rb_define_singleton_method(cSerialPort, "create", sp_create, 1);
...
rb_eval_string(
"class SerialPort\n"

"private_class_method:)create)\n"
...
"end\n"
);
}

When serialport.so is 'require'd normally, the following error is reported:

"(eval):1: (eval):1:in `private_class_method': undefined method `create' for
class `Class' (NameError)
from (eval):1
from
c:/lang/ruby/ruby1.8.2/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:18:
in `require'
from -e:1"

As you can see from the error, the 'require' that is being called is really
rubygems' 'custom_require', which is aliased to 'require' by rubygems.
Rubygems is being loaded automatically due to it's default inclusion in
RUBYOPT.

When I bypass the rubygems 'require' however, either by passing -rserialport
on the command line or by calling 'require__ "serialport"', the library
loads successfully.

I've looked at the require_custom code, and it's pretty straightforward.
Why is that eval failing under custom_require, but succeeding under Ruby's
vanilla 'require'?

Any help would be appreciated,

Avdi Grimm
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top