64-bit fasl files can now be produced and read.
This commit is contained in:
		
							parent
							
								
									3c99e7d393
								
							
						
					
					
						commit
						341e53a36d
					
				|  | @ -5536,6 +5536,7 @@ cat >>confdefs.h <<_ACEOF | ||||||
| _ACEOF | _ACEOF | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | # remember to enable before release. | ||||||
| # if (test $ac_cv_sizeof_void_p != 4); then | # if (test $ac_cv_sizeof_void_p != 4); then | ||||||
| #   AC_MSG_ERROR([Ikarus can only run in 32-bit mode.]) | #   AC_MSG_ERROR([Ikarus can only run in 32-bit mode.]) | ||||||
| # fi | # fi | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ case "$target_os" in | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| AC_CHECK_SIZEOF(void *) | AC_CHECK_SIZEOF(void *) | ||||||
|  | # remember to enable before release. | ||||||
| # if (test $ac_cv_sizeof_void_p != 4); then | # if (test $ac_cv_sizeof_void_p != 4); then | ||||||
| #   AC_MSG_ERROR([Ikarus can only run in 32-bit mode.]) | #   AC_MSG_ERROR([Ikarus can only run in 32-bit mode.]) | ||||||
| # fi | # fi | ||||||
|  |  | ||||||
|  | @ -2059,7 +2059,11 @@ | ||||||
| 
 | 
 | ||||||
|   ;;; refer to the picture in src/ikarus-collect.c for details |   ;;; refer to the picture in src/ikarus-collect.c for details | ||||||
|   ;;; on how call-frames are laid out.  (search for livemask) |   ;;; on how call-frames are laid out.  (search for livemask) | ||||||
|   (define call-instruction-size 5) |   (define call-instruction-size  | ||||||
|  |     (case wordsize | ||||||
|  |       [(4) 5] | ||||||
|  |       [(8) 10] | ||||||
|  |       [else (die 'call-instruction-size "invalid" wordsize)])) | ||||||
|   (define disp-frame-size    (- (+ call-instruction-size (* 3 wordsize)))) |   (define disp-frame-size    (- (+ call-instruction-size (* 3 wordsize)))) | ||||||
|   (define disp-frame-offset  (- (+ call-instruction-size (* 2 wordsize)))) |   (define disp-frame-offset  (- (+ call-instruction-size (* 2 wordsize)))) | ||||||
|   (define disp-multivalue-rp (- (+ call-instruction-size (* 1 wordsize)))) |   (define disp-multivalue-rp (- (+ call-instruction-size (* 1 wordsize)))) | ||||||
|  |  | ||||||
|  | @ -64,18 +64,19 @@ | ||||||
|   (define (put-tag c p) |   (define (put-tag c p) | ||||||
|     (write-byte (char->integer c) p)) |     (write-byte (char->integer c) p)) | ||||||
|    |    | ||||||
|   (define write-int  |   (define write-int32  | ||||||
|     (lambda (x p) |     (lambda (x p) | ||||||
|       (unless (int? x) (die 'write-int "not a int" x)) |  | ||||||
|       (write-byte (bitwise-and x #xFF) p) |       (write-byte (bitwise-and x #xFF) p) | ||||||
|       (write-byte (bitwise-and (sra x 8) #xFF) p) |       (write-byte (bitwise-and (sra x 8) #xFF) p) | ||||||
|       (write-byte (bitwise-and (sra x 16) #xFF) p) |       (write-byte (bitwise-and (sra x 16) #xFF) p) | ||||||
|       (write-byte (bitwise-and (sra x 24) #xFF) p) |       (write-byte (bitwise-and (sra x 24) #xFF) p))) | ||||||
|  |   | ||||||
|  |   (define write-int  | ||||||
|  |     (lambda (x p) | ||||||
|  |       (unless (int? x) (die 'write-int "not a int" x)) | ||||||
|  |       (write-int32 x p) | ||||||
|       (when (eqv? wordsize 8) |       (when (eqv? wordsize 8) | ||||||
|         (write-byte (bitwise-and (sra x 32) #xFF) p) |         (write-int32 (sra x 32) p)))) | ||||||
|         (write-byte (bitwise-and (sra x 40) #xFF) p) |  | ||||||
|         (write-byte (bitwise-and (sra x 48) #xFF) p) |  | ||||||
|         (write-byte (bitwise-and (sra x 56) #xFF) p)))) |  | ||||||
| 
 | 
 | ||||||
|   (define fasl-write-immediate |   (define fasl-write-immediate | ||||||
|     (lambda (x p) |     (lambda (x p) | ||||||
|  | @ -92,7 +93,7 @@ | ||||||
|                  (write-byte n p)) |                  (write-byte n p)) | ||||||
|                (begin |                (begin | ||||||
|                  (put-tag #\C p) |                  (put-tag #\C p) | ||||||
|                  (write-int n p))))] |                  (write-int32 n p))))] | ||||||
|         [(boolean? x) |         [(boolean? x) | ||||||
|          (put-tag (if x #\T #\F) p)] |          (put-tag (if x #\T #\F) p)] | ||||||
|         [(eof-object? x) (put-tag #\E p)] |         [(eof-object? x) (put-tag #\E p)] | ||||||
|  | @ -164,7 +165,7 @@ | ||||||
|             (write-int (string-length x) p) |             (write-int (string-length x) p) | ||||||
|             (let f ([x x] [i 0] [n (string-length x)]) |             (let f ([x x] [i 0] [n (string-length x)]) | ||||||
|               (unless (= i n) |               (unless (= i n) | ||||||
|                 (write-int (char->integer (string-ref x i)) p) |                 (write-int32 (char->integer (string-ref x i)) p) | ||||||
|                 (f x (fxadd1 i) n)))]) |                 (f x (fxadd1 i) n)))]) | ||||||
|          m] |          m] | ||||||
|         [(gensym? x) |         [(gensym? x) | ||||||
|  | @ -269,11 +270,11 @@ | ||||||
|              [(fx> mark 0) ; marked but not written |              [(fx> mark 0) ; marked but not written | ||||||
|               (hashtable-set! h x (fx- 0 m)) |               (hashtable-set! h x (fx- 0 m)) | ||||||
|               (put-tag #\> p) |               (put-tag #\> p) | ||||||
|               (write-int m p) |               (write-int32 m p) | ||||||
|               (do-write x p h (fxadd1 m))] |               (do-write x p h (fxadd1 m))] | ||||||
|              [else |              [else | ||||||
|               (put-tag #\< p) |               (put-tag #\< p) | ||||||
|               (write-int (fx- 0 mark) p) |               (write-int32 (fx- 0 mark) p) | ||||||
|               m]))] |               m]))] | ||||||
|         [else (die 'fasl-write "BUG: not in hash table" x)])))  |         [else (die 'fasl-write "BUG: not in hash table" x)])))  | ||||||
|   (define make-graph |   (define make-graph | ||||||
|  |  | ||||||
|  | @ -23,6 +23,10 @@ | ||||||
|     (except (ikarus code-objects) procedure-annotation) |     (except (ikarus code-objects) procedure-annotation) | ||||||
|     (ikarus system $pairs)) |     (ikarus system $pairs)) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | (module (wordsize) | ||||||
|  |   (include "ikarus.config.ss")) | ||||||
|  | 
 | ||||||
| (define fold | (define fold | ||||||
|   (lambda (f init ls) |   (lambda (f init ls) | ||||||
|     (cond |     (cond | ||||||
|  | @ -710,9 +714,10 @@ | ||||||
|                 (case (car x) |                 (case (car x) | ||||||
|                   [(byte) (fx+ ac 1)] |                   [(byte) (fx+ ac 1)] | ||||||
|                   [(word reloc-word reloc-word+ label-addr foreign-label  |                   [(word reloc-word reloc-word+ label-addr foreign-label  | ||||||
|                     relative local-relative current-frame-offset) |                     local-relative) | ||||||
|                    (fx+ ac 4)] |                    (fx+ ac 4)] | ||||||
|                   [(label) ac] |                   [(label) ac] | ||||||
|  |                   [(relative current-frame-offset) (+ ac wordsize)] | ||||||
|                   [else (die 'compute-code-size "unknown instr" x)]))) |                   [else (die 'compute-code-size "unknown instr" x)]))) | ||||||
|           0  |           0  | ||||||
|           ls))) |           ls))) | ||||||
|  | @ -784,15 +789,17 @@ | ||||||
|                    (f (cdr ls) (fx+ idx 1) reloc)] |                    (f (cdr ls) (fx+ idx 1) reloc)] | ||||||
|                   [(reloc-word reloc-word+) |                   [(reloc-word reloc-word+) | ||||||
|                    (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] |                    (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] | ||||||
|                   [(local-relative relative label-addr foreign-label)  |                   [(local-relative label-addr foreign-label) | ||||||
|                    (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] |                    (f (cdr ls) (fx+ idx 4) (cons (cons idx a) reloc))] | ||||||
|  |                   [(relative) | ||||||
|  |                    (f (cdr ls) (fx+ idx wordsize) (cons (cons idx a) reloc))] | ||||||
|                   [(word) |                   [(word) | ||||||
|                    (let ([v (cdr a)]) |                    (let ([v (cdr a)]) | ||||||
|                       (set-code-word! x idx v) |                       (set-code-word! x idx v) | ||||||
|                       (f (cdr ls) (fx+ idx 4) reloc))] |                       (f (cdr ls) (fx+ idx 4) reloc))] | ||||||
|                   [(current-frame-offset) |                   [(current-frame-offset) | ||||||
|                    (set-code-word! x idx idx) |                    (set-code-word! x idx idx) ;;; FIXME 64bit | ||||||
|                    (f (cdr ls) (fx+ idx 4) reloc)] |                    (f (cdr ls) (fx+ idx wordsize) reloc)] | ||||||
|                   [(label) |                   [(label) | ||||||
|                    (set-label-loc! (cdr a) (list x idx)) |                    (set-label-loc! (cdr a) (list x idx)) | ||||||
|                    (f (cdr ls) idx reloc)] |                    (f (cdr ls) idx reloc)] | ||||||
|  | @ -800,8 +807,6 @@ | ||||||
|                    (die 'whack-instructions "unknown instr" a)])))]))) |                    (die 'whack-instructions "unknown instr" a)])))]))) | ||||||
|     (f ls 0 '()))) |     (f ls 0 '()))) | ||||||
| 
 | 
 | ||||||
| (define wordsize 4) |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| (define compute-reloc-size  | (define compute-reloc-size  | ||||||
|   (lambda (ls) |   (lambda (ls) | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| 1315 | 1316 | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| #!/usr/bin/env ikarus -b ikarus.boot --r6rs-script | #!../src/ikarus -b ikarus.boot --r6rs-script | ||||||
| ;;; Ikarus Scheme -- A compiler for R6RS Scheme. | ;;; Ikarus Scheme -- A compiler for R6RS Scheme. | ||||||
| ;;; Copyright (C) 2006,2007  Abdulaziz Ghuloum | ;;; Copyright (C) 2006,2007  Abdulaziz Ghuloum | ||||||
| ;;;  | ;;;  | ||||||
|  |  | ||||||
|  | @ -219,7 +219,8 @@ ikptr ik_safe_alloc(ikpcb* pcb, int size); | ||||||
| #define align(n) \ | #define align(n) \ | ||||||
|   ((((n) + align_size - 1) >>  align_shift) << align_shift) |   ((((n) + align_size - 1) >>  align_shift) << align_shift) | ||||||
| 
 | 
 | ||||||
| #define IK_FASL_HEADER "#@IK01" | #define IK_FASL_HEADER \ | ||||||
|  |   ((sizeof(ikptr) == 4) ? "#@IK01" : "#@IK02") | ||||||
| #define IK_FASL_HEADER_LEN (strlen(IK_FASL_HEADER)) | #define IK_FASL_HEADER_LEN (strlen(IK_FASL_HEADER)) | ||||||
| 
 | 
 | ||||||
| #define code_pri_tag vector_tag | #define code_pri_tag vector_tag | ||||||
|  | @ -351,7 +352,8 @@ ikptr ik_safe_alloc(ikpcb* pcb, int size); | ||||||
| #define align_to_prev_page(x) \ | #define align_to_prev_page(x) \ | ||||||
|   ((((unsigned long int)(x)) >> pageshift) << pageshift) |   ((((unsigned long int)(x)) >> pageshift) << pageshift) | ||||||
| 
 | 
 | ||||||
| #define call_instruction_size 5 | #define call_instruction_size \ | ||||||
|  |   ((wordsize == 4) ? 5 : 10) | ||||||
| #define disp_frame_size   (- (call_instruction_size + 3 * wordsize)) | #define disp_frame_size   (- (call_instruction_size + 3 * wordsize)) | ||||||
| #define disp_frame_offset (- (call_instruction_size + 2 * wordsize)) | #define disp_frame_offset (- (call_instruction_size + 2 * wordsize)) | ||||||
| #define disp_multivale_rp (- (call_instruction_size + 1 * wordsize)) | #define disp_multivale_rp (- (call_instruction_size + 1 * wordsize)) | ||||||
|  |  | ||||||
|  | @ -110,8 +110,12 @@ void ik_fasl_load(ikpcb* pcb, char* fasl_file){ | ||||||
|       } |       } | ||||||
|       close(fd); |       close(fd); | ||||||
|     } |     } | ||||||
|     ikptr val = ik_exec_code(pcb, v); |     ikptr val = void_object; | ||||||
|     val = void_object; |     if(wordsize == 4){ | ||||||
|  |       ik_exec_code(pcb, v); | ||||||
|  |     } else { | ||||||
|  |       fprintf(stderr, "NOT EXECING YET\n"); | ||||||
|  |     } | ||||||
|     if(val != void_object){ |     if(val != void_object){ | ||||||
|       /* this is from revision 1 
 |       /* this is from revision 1 
 | ||||||
|          and is no longer needed  |          and is no longer needed  | ||||||
|  | @ -123,6 +127,10 @@ void ik_fasl_load(ikpcb* pcb, char* fasl_file){ | ||||||
|     fprintf(stderr, "fasl-read did not reach eof!\n"); |     fprintf(stderr, "fasl-read did not reach eof!\n"); | ||||||
|     exit(-10); |     exit(-10); | ||||||
|   } |   } | ||||||
|  |   if(wordsize == 8){ | ||||||
|  |     fprintf(stderr, "DONE READING FASL, EXITING ...\n"); | ||||||
|  |     exit(-1); | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static ikptr  | static ikptr  | ||||||
|  | @ -269,7 +277,7 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|           ik_print(p->marks[idx]); |           ik_print(p->marks[idx]); | ||||||
|           exit(-1); |           exit(-1); | ||||||
|         } |         } | ||||||
|       }  |       } | ||||||
|     } |     } | ||||||
|     else { |     else { | ||||||
|       /* allocate marks */ |       /* allocate marks */ | ||||||
|  | @ -279,9 +287,9 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   if(c == 'x'){ |   if(c == 'x'){ | ||||||
|     int code_size; |     long int code_size; | ||||||
|     ikptr freevars; |     ikptr freevars; | ||||||
|     fasl_read_buf(p, &code_size, sizeof(int)); |     fasl_read_buf(p, &code_size, sizeof(long int)); | ||||||
|     fasl_read_buf(p, &freevars, sizeof(ikptr)); |     fasl_read_buf(p, &freevars, sizeof(ikptr)); | ||||||
|     ikptr annotation = do_read(pcb, p); |     ikptr annotation = do_read(pcb, p); | ||||||
|     ikptr code = alloc_code(align(code_size+disp_code_data), pcb, p); |     ikptr code = alloc_code(align(code_size+disp_code_data), pcb, p); | ||||||
|  | @ -317,16 +325,16 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|   } |   } | ||||||
|   else if(c == 's'){ |   else if(c == 's'){ | ||||||
|     /* ascii string */ |     /* ascii string */ | ||||||
|     int len; |     long int len; | ||||||
|     fasl_read_buf(p, &len, sizeof(int)); |     fasl_read_buf(p, &len, sizeof(long int)); | ||||||
|     int size = align(len*string_char_size + disp_string_data); |     long int size = align(len*string_char_size + disp_string_data); | ||||||
|     ikptr str = ik_unsafe_alloc(pcb, size) + string_tag; |     ikptr str = ik_unsafe_alloc(pcb, size) + string_tag; | ||||||
|     ref(str, off_string_length) = fix(len); |     ref(str, off_string_length) = fix(len); | ||||||
|     fasl_read_buf(p, (char*)(long)str+off_string_data, len); |     fasl_read_buf(p, (char*)(long)str+off_string_data, len); | ||||||
|     { |     { | ||||||
|       unsigned char* pi = (unsigned char*)(long)(str+off_string_data); |       unsigned char* pi = (unsigned char*)(long)(str+off_string_data); | ||||||
|       ikchar* pj = (ikchar*)(long)(str+off_string_data); |       ikchar* pj = (ikchar*)(long)(str+off_string_data); | ||||||
|       int i = len-1; |       long int i = len-1; | ||||||
|       for(i=len-1; i >= 0; i--){ |       for(i=len-1; i >= 0; i--){ | ||||||
|         pj[i] = integer_to_char(pi[i]); |         pj[i] = integer_to_char(pi[i]); | ||||||
|       } |       } | ||||||
|  | @ -339,9 +347,9 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|   } |   } | ||||||
|   else if(c == 'S'){ |   else if(c == 'S'){ | ||||||
|     /* string */ |     /* string */ | ||||||
|     int len; |     long int len; | ||||||
|     fasl_read_buf(p, &len, sizeof(int)); |     fasl_read_buf(p, &len, sizeof(long int)); | ||||||
|     int size = align(len*string_char_size + disp_string_data); |     long int size = align(len*string_char_size + disp_string_data); | ||||||
|     ikptr str = ik_unsafe_alloc(pcb, size) + string_tag; |     ikptr str = ik_unsafe_alloc(pcb, size) + string_tag; | ||||||
|     ref(str, off_string_length) = fix(len); |     ref(str, off_string_length) = fix(len); | ||||||
|     long int i; |     long int i; | ||||||
|  | @ -356,17 +364,16 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|     } |     } | ||||||
|     return str; |     return str; | ||||||
|   } |   } | ||||||
| 
 |  | ||||||
|   else if(c == 'V'){ |   else if(c == 'V'){ | ||||||
|     int len; |     long int len; | ||||||
|     fasl_read_buf(p, &len, sizeof(int)); |     fasl_read_buf(p, &len, sizeof(long int)); | ||||||
|     int size = align(len * wordsize + disp_vector_data); |     long int size = align(len * wordsize + disp_vector_data); | ||||||
|     ikptr vec = ik_unsafe_alloc(pcb, size) + vector_tag; |     ikptr vec = ik_unsafe_alloc(pcb, size) + vector_tag; | ||||||
|     if(put_mark_index){ |     if(put_mark_index){ | ||||||
|       p->marks[put_mark_index] = vec; |       p->marks[put_mark_index] = vec; | ||||||
|     } |     } | ||||||
|     ref(vec, off_vector_length) = fix(len); |     ref(vec, off_vector_length) = fix(len); | ||||||
|     int i; |     long int i; | ||||||
|     for(i=0; i<len; i++){ |     for(i=0; i<len; i++){ | ||||||
|       ref(vec, off_vector_data + i*wordsize) = do_read(pcb, p); |       ref(vec, off_vector_data + i*wordsize) = do_read(pcb, p); | ||||||
|     } |     } | ||||||
|  | @ -374,7 +381,7 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|   } |   } | ||||||
|   else if(c == 'I'){ |   else if(c == 'I'){ | ||||||
|     ikptr fixn; |     ikptr fixn; | ||||||
|     fasl_read_buf(p, &fixn, sizeof(int)); |     fasl_read_buf(p, &fixn, sizeof(ikptr)); | ||||||
|     return fixn; |     return fixn; | ||||||
|   } |   } | ||||||
|   else if(c == 'F'){ |   else if(c == 'F'){ | ||||||
|  | @ -404,8 +411,8 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|   else if(c == 'R'){ /* R is for RTD */ |   else if(c == 'R'){ /* R is for RTD */ | ||||||
|     ikptr name = do_read(pcb, p); |     ikptr name = do_read(pcb, p); | ||||||
|     ikptr symb = do_read(pcb, p); |     ikptr symb = do_read(pcb, p); | ||||||
|     int i, n; |     long int i, n; | ||||||
|     fasl_read_buf(p, &n, sizeof(int)); |     fasl_read_buf(p, &n, sizeof(long int)); | ||||||
|     ikptr fields; |     ikptr fields; | ||||||
|     if(n == 0){ |     if(n == 0){ | ||||||
|       fields = null_object; |       fields = null_object; | ||||||
|  | @ -471,9 +478,9 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|   } |   } | ||||||
|   else if(c == 'v'){ |   else if(c == 'v'){ | ||||||
|     /* bytevector */ |     /* bytevector */ | ||||||
|     int len; |     long int len; | ||||||
|     fasl_read_buf(p, &len, sizeof(int)); |     fasl_read_buf(p, &len, sizeof(long int)); | ||||||
|     int size = align(len + disp_bytevector_data + 1); |     long int size = align(len + disp_bytevector_data + 1); | ||||||
|     ikptr x = ik_unsafe_alloc(pcb, size) + bytevector_tag; |     ikptr x = ik_unsafe_alloc(pcb, size) + bytevector_tag; | ||||||
|     ref(x, off_bytevector_length) = fix(len); |     ref(x, off_bytevector_length) = fix(len); | ||||||
|     fasl_read_buf(p, (void*)(long)(x+off_bytevector_data), len); |     fasl_read_buf(p, (void*)(long)(x+off_bytevector_data), len); | ||||||
|  | @ -485,10 +492,6 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|   } |   } | ||||||
|   else if(c == 'l'){ |   else if(c == 'l'){ | ||||||
|     int len = (unsigned char) fasl_read_byte(p); |     int len = (unsigned char) fasl_read_byte(p); | ||||||
|     if(len < 0){ |  | ||||||
|       fprintf(stderr, "invalid len=%d\n", len); |  | ||||||
|       exit(-1); |  | ||||||
|     } |  | ||||||
|     ikptr pair = ik_unsafe_alloc(pcb, pair_size * (len+1)) + pair_tag; |     ikptr pair = ik_unsafe_alloc(pcb, pair_size * (len+1)) + pair_tag; | ||||||
|     if(put_mark_index){ |     if(put_mark_index){ | ||||||
|       p->marks[put_mark_index] = pair; |       p->marks[put_mark_index] = pair; | ||||||
|  | @ -504,17 +507,17 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|     return pair; |     return pair; | ||||||
|   } |   } | ||||||
|   else if(c == 'L'){ |   else if(c == 'L'){ | ||||||
|     int len; |     long int len; | ||||||
|     fasl_read_buf(p, &len, sizeof(int)); |     fasl_read_buf(p, &len, sizeof(long int)); | ||||||
|     if(len < 0){ |     if(len < 0){ | ||||||
|       fprintf(stderr, "invalid len=%d\n", len); |       fprintf(stderr, "invalid len=%ld\n", len); | ||||||
|       exit(-1); |       exit(-1); | ||||||
|     } |     } | ||||||
|     ikptr pair = ik_unsafe_alloc(pcb, pair_size * (len+1)) + pair_tag; |     ikptr pair = ik_unsafe_alloc(pcb, pair_size * (len+1)) + pair_tag; | ||||||
|     if(put_mark_index){ |     if(put_mark_index){ | ||||||
|       p->marks[put_mark_index] = pair; |       p->marks[put_mark_index] = pair; | ||||||
|     } |     } | ||||||
|     int i; ikptr pt = pair; |     long int i; ikptr pt = pair; | ||||||
|     for(i=0; i<len; i++){ |     for(i=0; i<len; i++){ | ||||||
|       ref(pt, off_car) = do_read(pcb, p); |       ref(pt, off_car) = do_read(pcb, p); | ||||||
|       ref(pt, off_cdr) = pt + pair_size; |       ref(pt, off_cdr) = pt + pair_size; | ||||||
|  | @ -539,15 +542,15 @@ static ikptr do_read(ikpcb* pcb, fasl_port* p){ | ||||||
|     return int_to_scheme_char(n); |     return int_to_scheme_char(n); | ||||||
|   } |   } | ||||||
|   else if(c == 'b'){ |   else if(c == 'b'){ | ||||||
|     int len; |     long int len; | ||||||
|     int sign = 0; |     long int sign = 0; | ||||||
|     fasl_read_buf(p, &len, sizeof(int)); |     fasl_read_buf(p, &len, sizeof(long int)); | ||||||
|     if(len < 0) { |     if(len < 0) { | ||||||
|       sign = 1; |       sign = 1; | ||||||
|       len = -len; |       len = -len; | ||||||
|     } |     } | ||||||
|     if(len & 3){ |     if(len & 3){ | ||||||
|       fprintf(stderr, "Error in fasl-read: invalid bignum length %d\n", len); |       fprintf(stderr, "Error in fasl-read: invalid bignum length %ld\n", len); | ||||||
|       exit(-1); |       exit(-1); | ||||||
|     } |     } | ||||||
|     unsigned long int tag = bignum_tag | (sign << bignum_sign_shift) |  |     unsigned long int tag = bignum_tag | (sign << bignum_sign_shift) |  | ||||||
|  |  | ||||||
|  | @ -42,8 +42,8 @@ int total_allocated_pages = 0; | ||||||
| extern char **environ; | extern char **environ; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| #define segment_size  (pagesize*pagesize/wordsize) | #define segment_size  (pagesize*pagesize/4) | ||||||
| #define segment_shift (pageshift+pageshift-wordshift) | #define segment_shift (pageshift+pageshift-2) | ||||||
| #define segment_index(x) (((unsigned long int)(x)) >> segment_shift) | #define segment_index(x) (((unsigned long int)(x)) >> segment_shift) | ||||||
| 
 | 
 | ||||||
| ikptr ik_mmap(int size); | ikptr ik_mmap(int size); | ||||||
|  | @ -328,9 +328,9 @@ ikpcb* ik_make_pcb(){ | ||||||
|       hi_mem = pcb->heap_base + pcb->heap_size + pagesize; |       hi_mem = pcb->heap_base + pcb->heap_size + pagesize; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     long int lo_seg = segment_index(lo_mem); |     unsigned long int lo_seg = segment_index(lo_mem); | ||||||
|     long int hi_seg = segment_index(hi_mem+segment_size-1); |     unsigned long int hi_seg = segment_index(hi_mem+segment_size-1); | ||||||
|     long int vec_size = (hi_seg - lo_seg) * pagesize; |     unsigned long int vec_size = (hi_seg - lo_seg) * pagesize; | ||||||
|     ikptr dvec = ik_mmap(vec_size); |     ikptr dvec = ik_mmap(vec_size); | ||||||
|     bzero((char*)(long)dvec, vec_size); |     bzero((char*)(long)dvec, vec_size); | ||||||
|     pcb->dirty_vector_base = (unsigned int*)(long) dvec; |     pcb->dirty_vector_base = (unsigned int*)(long) dvec; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum