VM: fixes a bug with the handling of 0 bignums, and declares bignum/mod

to maybe output fixnums
db4
Björn Lindqvist 2015-06-27 14:56:17 +02:00
parent 0d02ff8e40
commit 35b04f8ec1
2 changed files with 4 additions and 2 deletions

View File

@ -336,7 +336,7 @@ M: object infer-call* \ call bad-macro-input ;
\ bignum-gcd { bignum bignum } { bignum } define-primitive \ bignum-gcd make-foldable
\ bignum-shift { bignum fixnum } { bignum } define-primitive \ bignum-shift make-foldable
\ bignum/i { bignum bignum } { bignum } define-primitive \ bignum/i make-foldable
\ bignum/mod { bignum bignum } { bignum bignum } define-primitive \ bignum/mod make-foldable
\ bignum/mod { bignum bignum } { bignum integer } define-primitive \ bignum/mod make-foldable
\ bignum< { bignum bignum } { object } define-primitive \ bignum< make-foldable
\ bignum<= { bignum bignum } { object } define-primitive \ bignum<= make-foldable
\ bignum= { bignum bignum } { object } define-primitive \ bignum= make-foldable

View File

@ -3,6 +3,8 @@
namespace factor {
cell bignum_maybe_to_fixnum(bignum* bn) {
if (BIGNUM_ZERO_P(bn))
return tag_fixnum(0);
fixnum len = BIGNUM_LENGTH(bn);
bignum_digit_type *digits = BIGNUM_START_PTR(bn);
if (len == 1 && digits[0] >= fixnum_min && digits[0] <= fixnum_max) {
@ -143,7 +145,7 @@ void factor_vm::primitive_bignum_divmod() {
bignum* q, *r;
bignum_divide(x, y, &q, &r);
*s1 = tag<bignum>(q);
*s0 = tag<bignum>(r);
*s0 = bignum_maybe_to_fixnum(r);
}
void factor_vm::primitive_bignum_mod() {