diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-01 12:02:36 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-09-01 12:02:36 +0000 |
commit | 2c8e7a50c1db8fea3fb012052828ad1eea51883f (patch) | |
tree | 9948c4ef01b8662c9d14a96cc228d7844af68b71 /marshal.c | |
parent | 0c5e6ab2bb6726b0d70e99db25d5369e196d8ddc (diff) | |
download | ruby-2c8e7a50c1db8fea3fb012052828ad1eea51883f.tar.gz |
* include/ruby/ruby.h (struct RBignum): embed digits in RBignum for
small bignums.
* bignum.c: RBignum embeded digits implemented.
* include/ruby/intern.h: declare rb_big_resize.
* gc.c: don't free embedded digits.
* numeric.c: replace direct bignum field accessor by abstract field
accessor such as RBIGNUM(val)->sign to RBIGNUM_SIGN(val).
* sprintf.c: ditto.
* compar.c: ditto.
* marshal.c: ditto.
* random.c: ditto.
* .gdbinit: support embedded small bignums.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13330 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r-- | marshal.c | 18 |
1 files changed, 9 insertions, 9 deletions
@@ -514,9 +514,9 @@ w_object(VALUE obj, struct dump_arg *arg, int limit) case T_BIGNUM: w_byte(TYPE_BIGNUM, arg); { - char sign = RBIGNUM(obj)->sign ? '+' : '-'; - long len = RBIGNUM(obj)->len; - BDIGIT *d = RBIGNUM(obj)->digits; + char sign = RBIGNUM_SIGN(obj) ? '+' : '-'; + long len = RBIGNUM_LEN(obj); + BDIGIT *d = RBIGNUM_DIGITS(obj); w_byte(sign, arg); w_long(SHORTLEN(len), arg); /* w_short? */ @@ -1060,21 +1060,21 @@ r_object0(struct load_arg *arg, int *ivp, VALUE extmod) NEWOBJ(big, struct RBignum); OBJSETUP(big, rb_cBignum, T_BIGNUM); - big->sign = (r_byte(arg) == '+'); + RBIGNUM_SET_SIGN(big, (r_byte(arg) == '+')); len = r_long(arg); data = r_bytes0(len * 2, arg); #if SIZEOF_BDIGITS == SIZEOF_SHORT - big->len = len; + rb_big_resize((VALUE)big, len); #else - big->len = (len + 1) * 2 / sizeof(BDIGIT); + rb_big_resize((VALUE)big, (len + 1) * 2 / sizeof(BDIGIT)); #endif - big->digits = digits = ALLOC_N(BDIGIT, big->len); + digits = RBIGNUM_DIGITS(big); MEMCPY(digits, RSTRING_PTR(data), char, len * 2); #if SIZEOF_BDIGITS > SIZEOF_SHORT MEMZERO((char *)digits + len * 2, char, - big->len * sizeof(BDIGIT) - len * 2); + RBIGNUM_LEN(big) * sizeof(BDIGIT) - len * 2); #endif - len = big->len; + len = RBIGNUM_LEN(big); while (len > 0) { unsigned char *p = (unsigned char *)digits; BDIGIT num = 0; |