0
@@ -94,56 +94,82 @@ class ShotgunPrimitives
0
GUARD(FIXNUM_P(msg->recv));
0
- RET(fixnum_add(state, msg->recv, t1));
0
+ OBJECT t1 = stack_pop();
0
+ RET(fixnum_add(state, msg->recv, t1));
0
+ } else if(BIGNUM_P(t1)) {
0
+ RET(bignum_add(state, bignum_new(state, N2I(msg->recv)), t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ OBJECT t2 = float_coerce(state, msg->recv);
0
+ RET(float_new(state, FLOAT_TO_DOUBLE(t2) + FLOAT_TO_DOUBLE(t1)));
0
GUARD(BIGNUM_P(msg->recv));
0
- RET(bignum_add(state, msg->recv, t1));
0
+ OBJECT t1 = stack_pop();
0
+ if(BIGNUM_P(t1) || FIXNUM_P(t1)) {
0
+ RET(bignum_add(state, msg->recv, t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ double a = bignum_to_double(state, msg->recv);
0
+ RET(float_new(state, a + FLOAT_TO_DOUBLE(t1)));
0
GUARD(FIXNUM_P(msg->recv));
0
- RET(fixnum_sub(state, msg->recv, t1));
0
+ OBJECT t1 = stack_pop();
0
+ RET(fixnum_sub(state, msg->recv, t1));
0
+ } else if(BIGNUM_P(t1)) {
0
+ RET(bignum_sub(state, bignum_new(state, N2I(msg->recv)), t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ OBJECT t2 = float_coerce(state, msg->recv);
0
+ RET(float_new(state, FLOAT_TO_DOUBLE(t2) - FLOAT_TO_DOUBLE(t1)));
0
GUARD(BIGNUM_P(msg->recv));
0
- RET(bignum_sub(state, msg->recv, t1));
0
+ OBJECT t1 = stack_pop();
0
+ if(BIGNUM_P(t1) || FIXNUM_P(t1)) {
0
+ RET(bignum_sub(state, msg->recv, t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ double a = bignum_to_double(state, msg->recv);
0
+ RET(float_new(state, a - FLOAT_TO_DOUBLE(t1)));
0
GUARD(FIXNUM_P(msg->recv));
0
- RET(fixnum_mul(state, msg->recv, t1));
0
+ OBJECT t1 = stack_pop();
0
+ RET(fixnum_mul(state, msg->recv, t1));
0
+ } else if(BIGNUM_P(t1)) {
0
+ RET(bignum_mul(state, bignum_new(state, N2I(msg->recv)), t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ OBJECT t2 = float_coerce(state, msg->recv);
0
+ RET(float_new(state, FLOAT_TO_DOUBLE(t2) * FLOAT_TO_DOUBLE(t1)));
0
@@ -155,39 +181,55 @@ class ShotgunPrimitives
0
GUARD(BIGNUM_P(msg->recv));
0
- RET(bignum_mul(state, msg->recv, t1));
0
+ OBJECT t1 = stack_pop();
0
+ if(BIGNUM_P(t1) || FIXNUM_P(t1)) {
0
+ RET(bignum_mul(state, msg->recv, t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ double a = bignum_to_double(state, msg->recv);
0
+ RET(float_new(state, a * FLOAT_TO_DOUBLE(t1)));
0
GUARD(FIXNUM_P(msg->recv));
0
- GUARD( N2I(t1) != 0 ) // no divide by zero
0
- t3 = fixnum_divmod(state, msg->recv, t1);
0
- RET(array_get(state, t3, 0));
0
+ OBJECT t1 = stack_pop();
0
+ GUARD(N2I(t1) != 0) // no divide by zero
0
+ RET(I2N(fixnum_div(state, msg->recv, t1, &mod)));
0
+ } else if(BIGNUM_P(t1)) {
0
+ GUARD(!bignum_is_zero(state, t1));
0
+ RET(bignum_div(state, bignum_new(state, N2I(msg->recv)), t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ OBJECT t2 = float_coerce(state, msg->recv);
0
+ RET(float_new(state, FLOAT_TO_DOUBLE(t2) / FLOAT_TO_DOUBLE(t1)));
0
GUARD(BIGNUM_P(msg->recv));
0
- // Can this ever happen since bignum will always be > zero?
0
- GUARD(!bignum_is_zero(state, t1));
0
- RET(bignum_div(state, msg->recv, t1));
0
+ OBJECT t1 = stack_pop();
0
+ GUARD(!bignum_is_zero(state, t1));
0
+ RET(bignum_div(state, msg->recv, t1));
0
+ } else if(FIXNUM_P(t1)) {
0
+ GUARD(N2I(t1) != 0) // no divide by zero
0
+ RET(bignum_div(state, msg->recv, t1));
0
+ } else if(FLOAT_P(t1)) {
0
+ double a = bignum_to_double(state, msg->recv);
0
+ RET(float_new(state, a / FLOAT_TO_DOUBLE(t1)));
0
@@ -1696,15 +1738,15 @@ class ShotgunPrimitives
0
GUARD(FIXNUM_P(msg->recv));
0
- GUARD( N2I(t1) != 0 ) // no divide by zero
0
- t3 = fixnum_divmod(state, msg->recv, t1);
0
- RET(array_get(state, t3, 1));
0
+ GUARD(N2I(t1) != 0) // no divide by zero
0
+ fixnum_div(state, msg->recv, t1, &mod);
Comments
No one has commented yet.