Project

General

Profile

Bug #6625 ยป 0001-compatible-marshal-loader.patch

nobu (Nobuyoshi Nakada), 06/22/2012 02:08 PM

View differences:

complex.c
static ID id_abs, id_abs2, id_arg, id_cmp, id_conj, id_convert,
id_denominator, id_divmod, id_eqeq_p, id_expt, id_fdiv, id_floor,
id_idiv, id_imag, id_inspect, id_negate, id_numerator, id_quo,
id_real, id_real_p, id_to_f, id_to_i, id_to_r, id_to_s;
id_real, id_real_p, id_to_f, id_to_i, id_to_r, id_to_s,
id_i_real, id_i_imag;
#define f_boolcast(x) ((x) ? Qtrue : Qfalse)
......
/* :nodoc: */
static VALUE
nucomp_dumper(VALUE self)
{
return self;
}
/* :nodoc: */
static VALUE
nucomp_loader(VALUE self, VALUE a)
{
get_dat1(self);
dat->real = rb_ivar_get(a, id_i_real);
dat->imag = rb_ivar_get(a, id_i_imag);
return self;
}
/* :nodoc: */
static VALUE
nucomp_marshal_dump(VALUE self)
{
VALUE a;
get_dat1(self);
a = rb_assoc_new(dat->real, dat->imag);
rb_copy_generic_ivar(a, self);
return a;
}
......
static VALUE
nucomp_marshal_load(VALUE self, VALUE a)
{
get_dat1(self);
rb_check_frozen(self);
rb_check_trusted(self);
Check_Type(a, T_ARRAY);
if (RARRAY_LEN(a) != 2)
rb_raise(rb_eArgError, "marshaled complex must have an array whose length is 2 but %ld", RARRAY_LEN(a));
dat->real = RARRAY_PTR(a)[0];
dat->imag = RARRAY_PTR(a)[1];
rb_copy_generic_ivar(self, a);
rb_ivar_set(self, id_i_real, RARRAY_PTR(a)[0]);
rb_ivar_set(self, id_i_imag, RARRAY_PTR(a)[1]);
return self;
}
......
void
Init_Complex(void)
{
VALUE compat;
#undef rb_intern
#define rb_intern(str) rb_intern_const(str)
......
id_to_i = rb_intern("to_i");
id_to_r = rb_intern("to_r");
id_to_s = rb_intern("to_s");
id_i_real = rb_intern("@real");
id_i_imag = rb_intern("@image");
rb_cComplex = rb_define_class("Complex", rb_cNumeric);
......
rb_define_method(rb_cComplex, "inspect", nucomp_inspect, 0);
rb_define_method(rb_cComplex, "marshal_dump", nucomp_marshal_dump, 0);
rb_define_method(rb_cComplex, "marshal_load", nucomp_marshal_load, 1);
compat = rb_define_class_under(rb_cComplex, "compatible", rb_cObject);
rb_define_method(compat, "marshal_load", nucomp_marshal_load, 1);
rb_marshal_define_compat(rb_cComplex, compat, nucomp_dumper, nucomp_loader);
/* --- */
rational.c
static ID id_abs, id_cmp, id_convert, id_eqeq_p, id_expt, id_fdiv,
id_floor, id_idiv, id_inspect, id_integer_p, id_negate, id_to_f,
id_to_i, id_to_s, id_truncate;
id_to_i, id_to_s, id_truncate, id_i_num, id_i_den;
#define f_boolcast(x) ((x) ? Qtrue : Qfalse)
......
/* :nodoc: */
static VALUE
nurat_dumper(VALUE self)
{
return self;
}
/* :nodoc: */
static VALUE
nurat_loader(VALUE self, VALUE a)
{
get_dat1(self);
dat->num = rb_ivar_get(a, id_i_num);
dat->den = rb_ivar_get(a, id_i_den);
return self;
}
/* :nodoc: */
static VALUE
nurat_marshal_dump(VALUE self)
{
VALUE a;
get_dat1(self);
a = rb_assoc_new(dat->num, dat->den);
rb_copy_generic_ivar(a, self);
return a;
}
......
static VALUE
nurat_marshal_load(VALUE self, VALUE a)
{
get_dat1(self);
rb_check_frozen(self);
rb_check_trusted(self);
Check_Type(a, T_ARRAY);
if (RARRAY_LEN(a) != 2)
rb_raise(rb_eArgError, "marshaled rational must have an array whose length is 2 but %ld", RARRAY_LEN(a));
dat->num = RARRAY_PTR(a)[0];
dat->den = RARRAY_PTR(a)[1];
rb_copy_generic_ivar(self, a);
if (f_zero_p(dat->den))
if (f_zero_p(RARRAY_PTR(a)[1]))
rb_raise_zerodiv();
rb_ivar_set(self, id_i_num, RARRAY_PTR(a)[0]);
rb_ivar_set(self, id_i_den, RARRAY_PTR(a)[1]);
return self;
}
......
void
Init_Rational(void)
{
VALUE compat;
#undef rb_intern
#define rb_intern(str) rb_intern_const(str)
......
id_to_i = rb_intern("to_i");
id_to_s = rb_intern("to_s");
id_truncate = rb_intern("truncate");
id_i_num = rb_intern("@numerator");
id_i_den = rb_intern("@denominator");
rb_cRational = rb_define_class("Rational", rb_cNumeric);
......
rb_define_method(rb_cRational, "inspect", nurat_inspect, 0);
rb_define_method(rb_cRational, "marshal_dump", nurat_marshal_dump, 0);
rb_define_method(rb_cRational, "marshal_load", nurat_marshal_load, 1);
compat = rb_define_class_under(rb_cRational, "compatible", rb_cObject);
rb_define_method(compat, "marshal_load", nurat_marshal_load, 1);
rb_marshal_define_compat(rb_cRational, compat, nurat_dumper, nurat_loader);
/* --- */
    (1-1/1)