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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top