summaryrefslogtreecommitdiff
path: root/marshal.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-01 12:02:36 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-09-01 12:02:36 +0000
commit2c8e7a50c1db8fea3fb012052828ad1eea51883f (patch)
tree9948c4ef01b8662c9d14a96cc228d7844af68b71 /marshal.c
parent0c5e6ab2bb6726b0d70e99db25d5369e196d8ddc (diff)
* 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.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/marshal.c b/marshal.c
index 79e559d7f3..f634e3f264 100644
--- a/marshal.c
+++ b/marshal.c
@@ -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;