module

RubyCall::Helpers

Constants

ARGV_BUF = 33
MAX_ARGS = 32
RB_PASS_KEYWORDS = 1

Class methods

call(recv_slot : Pointer(LibRuby::Value), name : String, args : Enumerable | Nil, kwargs : Hash(String, RbArg) | Nil = nil, block_id : Int64 = 0) : LibRuby::Value

--- главный драйвер вызова -------------------------------------------------------- data-массив: [recv, mid(fix), argc(fix), block_id(fix), *args, kw_hash|nil] Контейнер рутируется сам; все промежуточные VALUE — на стеке обычных методов воркера.

Source
call_tramp(data : LibRuby::Value) : LibRuby::Value

Трамплин rb_protect: локальные — на стеке воркера → видны GC MRI.

Source
eval_str(code : String) : LibRuby::Value

rb_eval_string_protect — protect встроен.

Source
fix2ll(v : LibRuby::Value) : Int64
Source
hash_from(kwargs : Hash(String, RbArg)) : LibRuby::Value

kwargs-хеш: в Ruby 3 ключевые слова обязаны иметь символьные ключи (строковые → ArgumentError: missing keywords).

Source
keep(v : LibRuby::Value) : Pointer(LibRuby::Value)

--- keep-слоты: временный корень для VALUE на время операции -----------------

Source
kind_of?(v : LibRuby::Value, klass : LibRuby::Value) : Bool
Source
ll2fix(x : Int64) : LibRuby::Value

--- fixnum-кодирование (immidiate, без GC) ------------------------------ LONG2FIX / FIX2LONG: fixnum = (x << 1) | 1

Source
mid_for(name : String) : LibRuby::Id
Source
num2ll_tramp(data : LibRuby::Value) : LibRuby::Value

rb_num2ll может кинуть RangeError (bignum > i64) — через protect, вызывающий при переполнении оставит объект обёрткой.

Source
protect(context : String, tramp : LibRuby::Value -> LibRuby::Value, data : LibRuby::Value) : LibRuby::Value

--- rb_protect-обёртка --------------------------------------------------------- tramp — нетипизированный трамплин (->Helpers.xxx); data — VALUE, уже укоренённый (контейнер/слот/стек). При state != 0 вытаскиваем rb_errinfo, чистим его и кидаем RubyError.

Source
qfalse
Source
qfalse=(qfalse : LibRuby::Value)
Source
qnil

Спец-константы определяем в рантайме (eval nil/true/false) — не хардкодим биты VALUE.

Source
qnil=(qnil : LibRuby::Value)

Спец-константы определяем в рантайме (eval nil/true/false) — не хардкодим биты VALUE.

Source
qtrue
Source
qtrue=(qtrue : LibRuby::Value)
Source
true?(v : LibRuby::Value) : Bool
Source
unkeep(slot : Pointer(LibRuby::Value)) : Nil
Source