diff --git a/include/mruby/internal.h b/include/mruby/internal.h index 5215d0e51..17e867d7b 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -95,6 +95,7 @@ mrb_value mrb_rational_add(mrb_state *mrb, mrb_value x, mrb_value y); mrb_value mrb_rational_sub(mrb_state *mrb, mrb_value x, mrb_value y); mrb_value mrb_rational_mul(mrb_state *mrb, mrb_value x, mrb_value y); mrb_value mrb_rational_div(mrb_state *mrb, mrb_value x, mrb_value y); +void mrb_rational_copy(mrb_state *mrb, mrb_value x, mrb_value y); #endif #ifdef MRUBY_PROC_H diff --git a/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c b/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c index 1ad628664..1513471c1 100644 --- a/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c +++ b/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c @@ -65,4 +65,7 @@ mrb_value mrb_rational_to_f(mrb_state *mrb, mrb_value x) { return mrb_nil_value(); } +void mrb_rational_copy(mrb_state *mrb, mrb_value x, mrb_value y) +{ +} #endif diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index 70b8cc451..511e002e8 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -110,6 +110,15 @@ mrb_rational_new(mrb_state *mrb, mrb_int numerator, mrb_int denominator) #define rational_new(mrb,n,d) mrb_rational_new(mrb, n, d) +void +mrb_rational_copy(mrb_state *mrb, mrb_value x, mrb_value y) +{ + struct mrb_rational *p1 = rational_ptr(mrb, x); + struct mrb_rational *p2 = rational_ptr(mrb, y); + p1->numerator = p2->numerator; + p1->denominator = p2->denominator; +} + inline static mrb_int i_gcd(mrb_int x, mrb_int y) { diff --git a/src/class.c b/src/class.c index b8a2268c2..581a1a859 100644 --- a/src/class.c +++ b/src/class.c @@ -2742,6 +2742,11 @@ init_copy(mrb_state *mrb, mrb_value dest, mrb_value obj) mrb_bint_copy(mrb, dest, obj); break; #endif +#ifdef MRB_USE_RATIONAL + case MRB_TT_RATIONAL: + mrb_rational_copy(mrb, dest, obj); + break; +#endif default: break;