From ab801dbdb7ff8a99b5e0976516b879b27bcf3e1b Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 3 Jul 1998 07:06:51 +0000 Subject: 1.1b9_29 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@260 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- marshal.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'marshal.c') diff --git a/marshal.c b/marshal.c index 73ae8a69f8..4234c98981 100644 --- a/marshal.c +++ b/marshal.c @@ -207,10 +207,6 @@ w_object(obj, arg, limit) if (limit == 0) { Fail("exceed depth limit"); } - limit--; - c_arg.limit = limit; - c_arg.arg = arg; - if (obj == Qnil) { w_byte(TYPE_NIL, arg); } @@ -225,19 +221,23 @@ w_object(obj, arg, limit) w_byte(TYPE_FIXNUM, arg); w_long(FIX2INT(obj), arg); #else - if (RSHIFT(obj, 32) == 0 || RSHIFT(obj, 32) == -1) { + if (RSHIFT((long)obj, 32) == 0 || RSHIFT((long)obj, 32) == -1) { w_byte(TYPE_FIXNUM, arg); - w_long(FIX2INT(obj), arg); + w_long(FIX2LONG(obj), arg); } else { - obj = int2big(FIX2INT(obj)); - goto write_bignum; + w_object(int2big(FIX2LONG(obj)), arg, limit); + return; } #endif } else { int num; + limit--; + c_arg.limit = limit; + c_arg.arg = arg; + if (st_lookup(arg->data, obj, &num)) { w_byte(TYPE_LINK, arg); w_long(num, arg); @@ -339,7 +339,7 @@ w_object(obj, arg, limit) Fatal("non-initialized struct"); } for (i=0; iptr[i]), arg); + w_symbol(FIX2LONG(RARRAY(mem)->ptr[i]), arg); w_object(RSTRUCT(obj)->ptr[i], arg, limit); } } @@ -456,7 +456,7 @@ r_byte(arg) struct load_arg *arg; { if (arg->fp) return getc(arg->fp); - if (arg->ptr < arg->end) return *arg->ptr++; + if (arg->ptr < arg->end) return *(unsigned char*)arg->ptr++; return EOF; } @@ -511,8 +511,9 @@ r_long(arg) return x; } +static long blen; /* hidden length register */ #define r_bytes(s, arg) \ - (s = (char*)r_long(arg), r_bytes0(&s,ALLOCA_N(char,(long)s),(long)s,arg)) + (blen = r_long(arg), r_bytes0(&s,ALLOCA_N(char,blen),blen,arg)) static int r_bytes0(sp, s, len, arg) -- cgit v1.2.3