fx- now checks for overflow.
This commit is contained in:
parent
1683997a12
commit
bde9000c06
Binary file not shown.
|
@ -26,13 +26,13 @@
|
||||||
fixnum->string
|
fixnum->string
|
||||||
fxarithmetic-shift-left fxarithmetic-shift-right fxarithmetic-shift
|
fxarithmetic-shift-left fxarithmetic-shift-right fxarithmetic-shift
|
||||||
fxmin fxmax
|
fxmin fxmax
|
||||||
error@fx+ error@fx*)
|
error@fx+ error@fx* error@fx-)
|
||||||
(import
|
(import
|
||||||
(ikarus system $fx)
|
(ikarus system $fx)
|
||||||
(ikarus system $chars)
|
(ikarus system $chars)
|
||||||
(ikarus system $pairs)
|
(ikarus system $pairs)
|
||||||
(ikarus system $strings)
|
(ikarus system $strings)
|
||||||
(prefix (only (ikarus) fx+ fx*) sys:)
|
(prefix (only (ikarus) fx+ fx* fx-) sys:)
|
||||||
(except (ikarus) fxzero? fxadd1 fxsub1 fxlognot fx+ fx- fx*
|
(except (ikarus) fxzero? fxadd1 fxsub1 fxlognot fx+ fx- fx*
|
||||||
fxquotient fxremainder fxmodulo fxlogor fxlogand
|
fxquotient fxremainder fxmodulo fxlogor fxlogand
|
||||||
fxlogxor fxsll fxsra fx= fx< fx<= fx> fx>=
|
fxlogxor fxsll fxsra fx= fx< fx<= fx> fx>=
|
||||||
|
@ -76,38 +76,29 @@
|
||||||
(die 'fxnot "not a fixnum" x))
|
(die 'fxnot "not a fixnum" x))
|
||||||
($fxlognot x)))
|
($fxlognot x)))
|
||||||
|
|
||||||
|
(define (make-fx-error who msg)
|
||||||
|
(lambda (x y)
|
||||||
|
(if (fixnum? x)
|
||||||
|
(if (fixnum? y)
|
||||||
|
(die who msg x y)
|
||||||
|
(die who "not a fixnum" y))
|
||||||
|
(die who "not a fixnum" x))))
|
||||||
|
|
||||||
(define error@fx+
|
(define error@fx+
|
||||||
(lambda (x y)
|
(make-fx-error 'fx+ "overflow when adding numbers"))
|
||||||
(if (fixnum? x)
|
|
||||||
(if (fixnum? y)
|
(define error@fx-
|
||||||
(die 'fx+ "overflow when adding numbers" x y)
|
(make-fx-error 'fx- "overflow when subtracting numbers"))
|
||||||
(die 'fx+ "not a fixnum" y))
|
|
||||||
(die 'fx+ "not a fixnum" x))))
|
|
||||||
|
|
||||||
(define error@fx*
|
(define error@fx*
|
||||||
(lambda (x y)
|
(make-fx-error 'fx* "overflow when multiplying numbers"))
|
||||||
(if (fixnum? x)
|
|
||||||
(if (fixnum? y)
|
|
||||||
(die 'fx* "overflow when multiplying numbers" x y)
|
|
||||||
(die 'fx* "not a fixnum" y))
|
|
||||||
(die 'fx* "not a fixnum" x))))
|
|
||||||
|
|
||||||
(define fx+
|
(define (fx+ x y) (sys:fx+ x y))
|
||||||
(lambda (x y)
|
|
||||||
(sys:fx+ x y)))
|
|
||||||
|
|
||||||
(define fx-
|
(define (fx* x y) (sys:fx* x y))
|
||||||
(lambda (x y)
|
|
||||||
(unless (fixnum? x)
|
(define (fx- x y) (sys:fx- x y))
|
||||||
(die 'fx- "not a fixnum" x))
|
|
||||||
(unless (fixnum? y)
|
|
||||||
(die 'fx- "not a fixnum" y))
|
|
||||||
($fx- x y)))
|
|
||||||
|
|
||||||
(define fx*
|
|
||||||
(lambda (x y)
|
|
||||||
(sys:fx* x y)))
|
|
||||||
|
|
||||||
|
|
||||||
(define false-loop
|
(define false-loop
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
1379
|
1380
|
||||||
|
|
|
@ -566,6 +566,7 @@
|
||||||
[make-traced-procedure i]
|
[make-traced-procedure i]
|
||||||
[error@fx+ ]
|
[error@fx+ ]
|
||||||
[error@fx* ]
|
[error@fx* ]
|
||||||
|
[error@fx- ]
|
||||||
[fasl-write i]
|
[fasl-write i]
|
||||||
[lambda i r ba se ne]
|
[lambda i r ba se ne]
|
||||||
[and i r ba se ne]
|
[and i r ba se ne]
|
||||||
|
|
|
@ -1247,6 +1247,8 @@
|
||||||
|
|
||||||
(define-primop fx+ safe
|
(define-primop fx+ safe
|
||||||
[(V x y) (cogen-value-+ x y)])
|
[(V x y) (cogen-value-+ x y)])
|
||||||
|
(define-primop fx- safe
|
||||||
|
[(V x y) (cogen-value-- x y)])
|
||||||
|
|
||||||
(define-primop fx* safe
|
(define-primop fx* safe
|
||||||
[(V a b)
|
[(V a b)
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
(define (primop-interrupt-handler x)
|
(define (primop-interrupt-handler x)
|
||||||
(case x
|
(case x
|
||||||
[(fx+) 'error@fx+]
|
[(fx+) 'error@fx+]
|
||||||
|
[(fx-) 'error@fx-]
|
||||||
[(fx*) 'error@fx*]
|
[(fx*) 'error@fx*]
|
||||||
[else x]))
|
[else x]))
|
||||||
(define (make-interrupt-call op args)
|
(define (make-interrupt-call op args)
|
||||||
|
|
Loading…
Reference in New Issue