Sha256: 15f98ebf0bc947ff1622c7d9893e3294ee67ae59f9fc1ead74371034ed1c2b8c

Contents?: true

Size: 1.25 KB

Versions: 1

Compression:

Stored size: 1.25 KB

Contents

#include "cruby.h"

static inline VALUE
vm_setivar(VALUE obj, ID id, VALUE val, IC ic, struct rb_call_cache *cc, int is_attr)
{
  rb_check_frozen(obj);

  if (LIKELY(RB_TYPE_P(obj, T_OBJECT))) {
    VALUE klass = RBASIC(obj)->klass;
    st_data_t index;

    if (LIKELY(
      (!is_attr && ic->ic_serial == RCLASS_SERIAL(klass)) ||
      (is_attr && cc->aux.index > 0))) {
      VALUE *ptr = ROBJECT_IVPTR(obj);
      index = !is_attr ? ic->ic_value.index : cc->aux.index-1;

      if (index < ROBJECT_NUMIV(obj)) {
        RB_OBJ_WRITE(obj, &ptr[index], val);
        return val; /* inline cache hit */
      }
    }
    else {
      struct st_table *iv_index_tbl = ROBJECT_IV_INDEX_TBL(obj);

      if (iv_index_tbl && st_lookup(iv_index_tbl, (st_data_t)id, &index)) {
        if (!is_attr) {
          ic->ic_value.index = index;
          ic->ic_serial = RCLASS_SERIAL(klass);
        }
        else if (index >= INT_MAX) {
          rb_raise(rb_eArgError, "too many instance variables");
        }
        else {
          cc->aux.index = (int)(index + 1);
        }
      }
      /* fall through */
    }
  }
  return rb_ivar_set(obj, id, val);
}

void
llrb_insn_setinstancevariable(VALUE obj, ID id, VALUE val, VALUE ic_v)
{
  vm_setivar(obj, id, val, (IC)ic_v, 0, 0);
}

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
llrb-0.0.1 ext/llrb_insn_setinstancevariable.c