]> gitweb.factorcode.org Git - factor.git/commitdiff
VM: fixes a bug with the handling of 0 bignums, and declares bignum/mod
authorBjörn Lindqvist <bjourne@gmail.com>
Sat, 27 Jun 2015 12:56:17 +0000 (14:56 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Sat, 27 Jun 2015 14:14:58 +0000 (16:14 +0200)
to maybe output fixnums

basis/stack-checker/known-words/known-words.factor
vm/math.cpp

index 14211e7245d2264d981517644cea45ac17f981dc..48ab60795a43576fec84c34bc592c796f1a7abdf 100644 (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
index ed338861edd18c635a2ff94a075cf81fa36ca4b0..149009790f71c874a5a58a9d55623fc0c936be5f 100644 (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() {