Come funziona il codice operativo putspecialobject nel RubyVM funziona?
-
23-08-2019 - |
Domanda
Sto lavorando a un'implementazione del RubyVM e ho cercato in tutto per un po 'di documentazione sui codici operativi, ma senza alcun risultato.
Se qualcuno sa precisamente come funziona il codice operativo putspecialobject
, o anche solo un link ad una certa documentazione fullish avevo molto grato!
Soluzione
Da insns.def:
DEFINE_INSN putspecialobject (rb_num_t value_type) () (VALUE val) { switch (value_type) { case VM_SPECIAL_OBJECT_VMCORE: val = rb_mRubyVMFrozenCore; break; case VM_SPECIAL_OBJECT_CBASE: val = vm_get_cbase(GET_ISEQ(), GET_LFP(), GET_DFP()); break; default: rb_bug("putspecialobject insn: unknown value_type"); } }
dove:
VM_SPECIAL_OBJECT_VMCORE = 1 VM_SPECIAL_OBJECT_CBASE = 2
In altre parole, se l'argomento è 1, rb_mRubyVMFrozenCore
viene spinto sullo stack, che è un oggetto creato nelle prime fasi di avvio VM che implementa alcune funzionalità del linguaggio come metodi:
set_method_alias(klass,:new,:old) alias new old set_variable_alias(:$new,:$old) alias $new $old undef_method(klass,:foo) undef foo define_method(klass,:foo,&block) def foo ... end define_singleton_method(obj,:foo,&block) def obj.foo ... end set_postexe(&block) END { ... }
Se l'argomento è 2, la classe / modulo per il corrente contesto classe è spinto in pila. Questo è l'ambito lessicale in cui le costanti sono risolti e def
e alias
abbiano effetto. E 'anche la classe passata come 'Klass' per i metodi di cui sopra.
def foo ... end
compila a questo:
[:putspecialobject, 1], [:putspecialobject, 2], [:putobject, :foo], [:putiseq, [...]], [:send, :"core#define_method", 3, nil, 0, nil]
Questo è quanto ho potuto decodificare, che non è facile con questo codice.