/* * call-seq: * onum / integer -> oranumber * onum / numeric -> numeric * * Returns the result of dividing <i>onum</i> by <i>other</i>. */ static VALUE onum_div(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; boolean is_zero; switch (rboci8_type(rhs)) { case T_FIXNUM: if (rhs == INT2FIX(0)) { rb_num_zerodiv(); } case T_BIGNUM: if (set_oci_number_from_num(&n, rhs, 0, errhp)) { chkerr(OCINumberDiv(errhp, _NUMBER(lhs), &n, &r)); return oci8_make_ocinumber(&r, errhp); } break; case RBOCI8_T_ORANUMBER: chkerr(OCINumberIsZero(errhp, _NUMBER(rhs), &is_zero)); if (is_zero) { rb_num_zerodiv(); } chkerr(OCINumberDiv(errhp, _NUMBER(lhs), _NUMBER(rhs), &r)); return oci8_make_ocinumber(&r, errhp); case T_FLOAT: return rb_funcall(onum_to_f(lhs), oci8_id_div_op, 1, rhs); case RBOCI8_T_RATIONAL: return rb_funcall(onum_to_r(lhs), oci8_id_div_op, 1, rhs); case RBOCI8_T_BIGDECIMAL: return rb_funcall(onum_to_d(lhs), oci8_id_div_op, 1, rhs); } return rb_num_coerce_bin(lhs, rhs, oci8_id_div_op); }
/* * call-seq: * onum % other -> oranumber * * Returns the modulo after division of <i>onum</i> by <i>other</i>. */ static VALUE onum_mod(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; boolean is_zero; /* change to OCINumber */ if (!set_oci_number_from_num(&n, rhs, 0, errhp)) return rb_num_coerce_bin(lhs, rhs, '%'); /* check whether argument is not zero. */ chkerr(OCINumberIsZero(errhp, &n, &is_zero)); if (is_zero) rb_num_zerodiv(); /* modulo */ chkerr(OCINumberMod(errhp, _NUMBER(lhs), &n, &r)); return oci8_make_ocinumber(&r, errhp); }
static VALUE numeric_spec_rb_num_zerodiv(VALUE self) { rb_num_zerodiv(); }
static VALUE numeric_spec_rb_num_zerodiv(VALUE self) { rb_num_zerodiv(); return Qnil; }