module

RubyCall

Хелперы низкого уровня. ВСЁ здесь исполняется на воркер-треде (инвариант RubyCall.ruby); локальные переменные обычных методов живут на машинном стеке воркера → консервативный GC MRI их видит. VALUE в замыканиях/куче Crystal — запрещены (см. keep-слоты).

Constants

BLOCKS = {} of Int64 => Proc(Array(RbValue), RbValue)

Блоки Crystal → ruby-блоки (rb_block_call). Доступ только с воркера (под глобальным MUTEX) — обычный Hash без доп. блокировок.

MUTEX = Mutex.new

Глобальная блокировка на ВЕСЬ доступ к Ruby из Crystal (как PyCall::MUTEX в pycall.cr). Составные операции (funcall→convert→wrap) атомарны, interleaving фибер на разных тредах исключён.

VERSION = "0.1.0"

Class methods

block_tramp(first : LibRuby::Value, data2 : LibRuby::Value, argc : Int32, argv : Pointer(LibRuby::Value)) : LibRuby::Value

Трамплин rb_block_call: вызывается Ruby-ом (GIL/GVL уже на воркере). data2 = fixnum(id реестра). Исключение кристалла → rb_exc_raise — longjmp поймается внешним rb_protect драйвера.

Source
builtins
Source
callable?(obj : RbValue) : Bool
Source
do_init

На воркере: стек воркера = main-стек Ruby; снимок qnil/qtrue/qfalse.

Source
ensure_init!
Source
eval(code : String) : RbValue
Source
exec(code : String) : Nil
Source
import(name : String | Symbol) : RbValue

Константа/модуль верхнего уровня: Math, Object, GC...

Source
init!

Идемпотентна; VM поднимается ВНУТРИ воркер-треда: он же становится main-Ruby-тредом (один стек → консервативный GC MRI корректен, GVL никогда не переходит между тредами).

Source
initialized?
Source
on_worker?
Source
register_block(blk : Proc(Array(RbValue), RbValue)) : Int64
Source
release(slot : Pointer(LibRuby::Value)) : Nil

Снятие keep-слота из финалайзера (GC-тред Crystal): на воркере — сразу; иначе заявкой (MUTEX; тред просто ждёт — дедлока нет, цикла ожиданий не возникает). При мёртвом воркере — утечка лучше краша.

Source
ruby

Единая точка входа для ЛЮБОГО обращения к Ruby.

  • не на воркере: под глобальным MUTEX заявка уходит воркеру;
  • на воркере (вложенный вызов): исполнить напрямую — мьютекс нереентерабелен, быстрый путь обязателен (аналог PyGILState_Check).
Source
ruby_version

Ruby-строка версии: "3.4.5"

Source
unregister_block(id : Int64) : Nil
Source
worker_loop
Source

Nested types