Вопросы об API расширений Ruby C

Итак, недавно у меня возникла досадная необходимость сделать расширение C для Ruby (из-за производительности). Поскольку у меня были проблемы с пониманием VALUE (и все еще есть), поэтому я заглянул в исходный код Ruby и обнаружил: typedef unsigned long VALUE; ( Ссылка на источник ], но вы заметите, что есть несколько других «способов», но я думаю, что это, по сути, long ; поправьте меня, если я ошибаюсь). Итак, исследуя это дальше, я обнаружил интересную запись в блоге , в которой говорится:

«... в некоторых случаях объект VALUE может БЫТЬ данными вместо УКАЗАНИЯ НА данные»

. Меня смущает то, что когда я пытаюсь передать строку в C из Ruby и использую RSTRING_PTR (); для VALUE (передано в C-функцию из Ruby), и попробуйте «отладить» его с помощью strlen (); он возвращает 4. Всегда 4.

пример кода:

VALUE test(VALUE inp) {
    unsigned char* c = RSTRING_PTR(inp);
    //return rb_str_new2(c); //this returns some random gibberish
    return INT2FIX(strlen(c));
}

В этом примере всегда возвращается 1 в качестве длины строки:

VALUE test(VALUE inp) {
    unsigned char* c = (unsigned char*) inp;
    //return rb_str_new2(c); // Always "\x03" in Ruby.
    return INT2FIX(strlen(c));
}

Иногда в Ruby я вижу исключение с сообщением «Невозможно преобразовать модуль в строку» (или что-то в этом роде, , однако я так сильно возился с кодом, пытаясь понять это, что не могу воспроизвести ошибка сейчас ошибка может произойти, когда я попробую StringValuePtr (); [Я немного не понимаю, что именно это делает. В документации говорится, что он изменяет переданный параметр на char * ] на i np):

VALUE test(VALUE inp) {
    StringValuePtr(inp);
    return rb_str_new2((char*)inp); //Without the cast, I would get compiler warnings
} 

Итак, рассматриваемый код Ruby: MyMod :: test ("blahblablah")

EDIT : исправлено несколько опечаток и немного обновлено сообщение.


вопросы

  1. Что именно содержит VALUE imp ? Указатель на объект / значение? Само значение?
  2. Если он содержит само значение: когда он это делает и есть ли способ его проверить?
  3. Как мне на самом деле получить доступ к значению (поскольку, похоже, я получаю доступ почти ко всему но значение)?

P.S: Я не очень хорошо понимаю C, но работа над ним еще не завершена; кроме того, прочтите комментарии во фрагментах кода, чтобы получить дополнительное описание (если это поможет).

Спасибо!

16
задан omninonsense 8 September 2013 в 00:55
поделиться