Flowdock
method

marshal_load

Importance_0
v1_9_3_392 - Show latest stable - 0 notes - Class: Random
marshal_load(p1) public

No documentation

This method has no description. You can help the Ruby community by adding new notes.

Hide source
static VALUE
random_load(VALUE obj, VALUE dump)
{
    rb_random_t *rnd = get_rnd(obj);
    struct MT *mt = &rnd->mt;
    VALUE state, left = INT2FIX(1), seed = INT2FIX(0);
    VALUE *ary;
    unsigned long x;

    Check_Type(dump, T_ARRAY);
    ary = RARRAY_PTR(dump);
    switch (RARRAY_LEN(dump)) {
      case 3:
        seed = ary[2];
      case 2:
        left = ary[1];
      case 1:
        state = ary[0];
        break;
      default:
        rb_raise(rb_eArgError, "wrong dump data");
    }
    memset(mt->state, 0, sizeof(mt->state));
    if (FIXNUM_P(state)) {
        x = FIX2ULONG(state);
        mt->state[0] = (unsigned int)x;
#if SIZEOF_LONG / SIZEOF_INT >= 2
        mt->state[1] = (unsigned int)(x >> BITSPERDIG);
#endif
#if SIZEOF_LONG / SIZEOF_INT >= 3
        mt->state[2] = (unsigned int)(x >> 2 * BITSPERDIG);
#endif
#if SIZEOF_LONG / SIZEOF_INT >= 4
        mt->state[3] = (unsigned int)(x >> 3 * BITSPERDIG);
#endif
    }
    else {
        BDIGIT *d;
        long len;
        Check_Type(state, T_BIGNUM);
        len = RBIGNUM_LEN(state);
        if (len > roomof(sizeof(mt->state), SIZEOF_BDIGITS)) {
            len = roomof(sizeof(mt->state), SIZEOF_BDIGITS);
        }
#if SIZEOF_BDIGITS < SIZEOF_INT
        else if (len % DIGSPERINT) {
            d = RBIGNUM_DIGITS(state) + len;
# if DIGSPERINT == 2
            --len;
            x = *--d;
# else
            x = 0;
            do {
                x = (x << BITSPERDIG) | *--d;
            } while (--len % DIGSPERINT);
# endif
            mt->state[len / DIGSPERINT] = (unsigned int)x;
        }
#endif
        if (len > 0) {
            d = BDIGITS(state) + len;
            do {
                --len;
                x = *--d;
# if DIGSPERINT == 2
                --len;
                x = (x << BITSPERDIG) | *--d;
# elif SIZEOF_BDIGITS < SIZEOF_INT
                do {
                    x = (x << BITSPERDIG) | *--d;
                } while (--len % DIGSPERINT);
# endif
                mt->state[len / DIGSPERINT] = (unsigned int)x;
            } while (len > 0);
        }
    }
    x = NUM2ULONG(left);
    if (x > numberof(mt->state)) {
        rb_raise(rb_eArgError, "wrong value");
    }
    mt->left = (unsigned int)x;
    mt->next = mt->state + numberof(mt->state) - x + 1;
    rnd->seed = rb_to_int(seed);

    return obj;
}
Register or log in to add new notes.