Использование rb_require с rb_protect для встраивания Ruby в C - PullRequest
2 голосов
/ 12 марта 2012

Я хочу использовать rb_require с rb_protect, как в следующем примере:

int error;
rb_protect( (VALUE (*)(VALUE))rb_require, (VALUE) "./test", &error);

Но когда я его компилирую, я получаю эту ошибку:

passing argument 1 of ‘rb_protect’ from incompatible pointer type [enabled by default]
/usr/include/ruby-1.9.1/ruby/intern.h:357:7: note: expected ‘VALUE (*)(VALUE)’ but argument is of type ‘VALUE (*)(VALUE,  VALUE)’

После поиска в Google, чтобы узнать, как использовать rb_require с rb_protect, я попытался:

int error;
rb_protect( RUBY_METHOD_FUNC(rb_require), (VALUE) "./test", &error);

или

VALUE require_wrap(VALUE arg)
{
return rb_require("./test");
}
/*in main:*/
rb_protect( require_wrap, 0, & error);

Но я всегда получаю одну и ту же ошибку. Эта ошибка не останавливает компиляцию, но бинарный segfault при запуске, тогда как все работает без rb_protect.

__ Редактировать __

произошла ошибка в моем исходном файле. На самом деле все решения, которые я протестировал, работают хорошо:

int error;
rb_protect( (VALUE (*)(VALUE))rb_require, (VALUE) "./test", &error);

или

int error;
rb_protect( RUBY_METHOD_FUNC(rb_require), (VALUE) "./test", &error);

или

VALUE require_wrap(VALUE arg)
{
  return rb_require("./test");
}
/*in main:*/
rb_protect( require_wrap, 0, & error);

Спасибо

1 Ответ

0 голосов
/ 06 апреля 2012

Решения, которые хорошо работают:

int error;
rb_protect( (VALUE (*)(VALUE))rb_require, (VALUE) "./test", &error);

или

int error;
rb_protect( RUBY_METHOD_FUNC(rb_require), (VALUE) "./test", &error);

или

VALUE require_wrap(VALUE arg)
{
  return rb_require("./test");
}
/*in main:*/
rb_protect( require_wrap, 0, & error);
...