Skip to content
  • Koichi Sasada's avatar
    df48db98
    `mandatory_only_cme` should not be in `def` · df48db98
    Koichi Sasada authored
    `def` (`rb_method_definition_t`) is shared by multiple callable
    method entries (cme, `rb_callable_method_entry_t`).
    
    There are two issues:
    
    * old -> young reference: `cme1->def->mandatory_only_cme = monly_cme`
      if `cme1` is young and `monly_cme` is young, there is no problem.
      Howevr, another old `cme2` can refer `def`, in this case, old `cme2`
      points young `monly_cme` and it violates gengc assumption.
    * cme can have different `defined_class` but `monly_cme` only has
      one `defined_class`. It does not make sense and `monly_cme`
      should be created for a cme (not `def`).
    
    To solve these issues, this patch allocates `monly_cme` per `cme`.
    `cme` does not have another room to store a pointer to the `monly_cme`,
    so this patch introduces `overloaded_cme_table`, which is weak key map
    `[cme] -> [monly_cme]`.
    
    `def::body::iseqptr::monly_cme` is deleted.
    
    The first issue is reported by Alan Wu.
    df48db98
    `mandatory_only_cme` should not be in `def`
    Koichi Sasada authored
    `def` (`rb_method_definition_t`) is shared by multiple callable
    method entries (cme, `rb_callable_method_entry_t`).
    
    There are two issues:
    
    * old -> young reference: `cme1->def->mandatory_only_cme = monly_cme`
      if `cme1` is young and `monly_cme` is young, there is no problem.
      Howevr, another old `cme2` can refer `def`, in this case, old `cme2`
      points young `monly_cme` and it violates gengc assumption.
    * cme can have different `defined_class` but `monly_cme` only has
      one `defined_class`. It does not make sense and `monly_cme`
      should be created for a cme (not `def`).
    
    To solve these issues, this patch allocates `monly_cme` per `cme`.
    `cme` does not have another room to store a pointer to the `monly_cme`,
    so this patch introduces `overloaded_cme_table`, which is weak key map
    `[cme] -> [monly_cme]`.
    
    `def::body::iseqptr::monly_cme` is deleted.
    
    The first issue is reported by Alan Wu.
Loading