Bug #6625 ยป 0001-compatible-marshal-loader.patch
| 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); | ||
|     /* --- */ | ||