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