VM: fixes a bug with the handling of 0 bignums, and declares bignum/mod
to maybe output fixnumsdb4
parent
0d02ff8e40
commit
35b04f8ec1
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue