Skip to content
  • John Hawthorn's avatar
    0b81a484
    Initialize new T_OBJECT as ROBJECT_EMBED · 0b81a484
    John Hawthorn authored
    Previously, when an object is first initialized, ROBJECT_EMBED isn't
    set. This means that for brand new objects, ROBJECT_NUMIV(obj) is 0 and
    ROBJECT_IV_INDEX_TBL(obj) is NULL.
    
    Previously, this combination meant that the inline cache would never be
    initialized when setting an ivar on an object for the first time since
    iv_index_tbl was NULL, and if it were it would never be used because
    ROBJECT_NUMIV was 0. Both cases always fell through to the generic
    rb_ivar_set which would then set the ROBJECT_EMBED flag and initialize
    the ivar array.
    
    This commit changes rb_class_allocate_instance to set the ROBJECT_EMBED
    flag on the object initially and to initialize all members of the
    embedded array to Qundef. This allows the inline cache to be set
    correctly on first use and to be used on future uses.
    
    This moves rb_class_allocate_instance to gc.c, so that it has access to
    newobj_of. This seems appropriate given that there are other allocating
    methods in this file (ex. rb_data_object_wrap, rb_imemo_new).
    0b81a484
    Initialize new T_OBJECT as ROBJECT_EMBED
    John Hawthorn authored
    Previously, when an object is first initialized, ROBJECT_EMBED isn't
    set. This means that for brand new objects, ROBJECT_NUMIV(obj) is 0 and
    ROBJECT_IV_INDEX_TBL(obj) is NULL.
    
    Previously, this combination meant that the inline cache would never be
    initialized when setting an ivar on an object for the first time since
    iv_index_tbl was NULL, and if it were it would never be used because
    ROBJECT_NUMIV was 0. Both cases always fell through to the generic
    rb_ivar_set which would then set the ROBJECT_EMBED flag and initialize
    the ivar array.
    
    This commit changes rb_class_allocate_instance to set the ROBJECT_EMBED
    flag on the object initially and to initialize all members of the
    embedded array to Qundef. This allows the inline cache to be set
    correctly on first use and to be used on future uses.
    
    This moves rb_class_allocate_instance to gc.c, so that it has access to
    newobj_of. This seems appropriate given that there are other allocating
    methods in this file (ex. rb_data_object_wrap, rb_imemo_new).
Loading