fixes for boehm compatibility
This commit is contained in:
		
							parent
							
								
									23b728155f
								
							
						
					
					
						commit
						6bf5aa0c72
					
				| 
						 | 
				
			
			@ -43,12 +43,11 @@ static size_t nfinalizers=0;
 | 
			
		|||
static size_t maxfinalizers=0;
 | 
			
		||||
static size_t malloc_pressure = 0;
 | 
			
		||||
 | 
			
		||||
#ifndef BOEHM_GC
 | 
			
		||||
void add_finalizer(cvalue_t *cv)
 | 
			
		||||
{
 | 
			
		||||
    if (nfinalizers == maxfinalizers) {
 | 
			
		||||
        size_t nn = (maxfinalizers==0 ? 256 : maxfinalizers*2);
 | 
			
		||||
        cvalue_t **temp = (cvalue_t**)realloc(Finalizers, nn*sizeof(value_t));
 | 
			
		||||
        cvalue_t **temp = (cvalue_t**)LLT_REALLOC(Finalizers, nn*sizeof(value_t));
 | 
			
		||||
        if (temp == NULL)
 | 
			
		||||
            lerror(MemoryError, "out of memory");
 | 
			
		||||
        Finalizers = temp;
 | 
			
		||||
| 
						 | 
				
			
			@ -82,7 +81,7 @@ static void sweep_finalizers()
 | 
			
		|||
#ifndef NDEBUG
 | 
			
		||||
                memset(cv_data(tmp), 0xbb, cv_len(tmp));
 | 
			
		||||
#endif
 | 
			
		||||
                LLT_FREE(cv_data(tmp));
 | 
			
		||||
                free(cv_data(tmp));
 | 
			
		||||
            }
 | 
			
		||||
            ndel++;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -96,12 +95,6 @@ static void sweep_finalizers()
 | 
			
		|||
 | 
			
		||||
    malloc_pressure = 0;
 | 
			
		||||
}
 | 
			
		||||
#else // BOEHM_GC
 | 
			
		||||
void add_finalizer(cvalue_t *cv)
 | 
			
		||||
{
 | 
			
		||||
    (void)cv;
 | 
			
		||||
}
 | 
			
		||||
#endif // BOEHM_GC
 | 
			
		||||
 | 
			
		||||
// compute the size of the metadata object for a cvalue
 | 
			
		||||
static size_t cv_nwords(cvalue_t *cv)
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +153,7 @@ value_t cvalue(fltype_t *type, size_t sz)
 | 
			
		|||
            gc(0);
 | 
			
		||||
        pcv = (cvalue_t*)alloc_words(CVALUE_NWORDS);
 | 
			
		||||
        pcv->type = type;
 | 
			
		||||
        pcv->data = LLT_ALLOC(sz);
 | 
			
		||||
        pcv->data = malloc(sz);
 | 
			
		||||
        autorelease(pcv);
 | 
			
		||||
        malloc_pressure += sz;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -239,7 +232,7 @@ void cv_pin(cvalue_t *cv)
 | 
			
		|||
        return;
 | 
			
		||||
    size_t sz = cv_len(cv);
 | 
			
		||||
    if (cv_isstr(cv)) sz++;
 | 
			
		||||
    void *data = LLT_ALLOC(sz);
 | 
			
		||||
    void *data = malloc(sz);
 | 
			
		||||
    memcpy(data, cv_data(cv), sz);
 | 
			
		||||
    cv->data = data;
 | 
			
		||||
    autorelease(cv);
 | 
			
		||||
| 
						 | 
				
			
			@ -686,7 +679,7 @@ value_t cvalue_copy(value_t v)
 | 
			
		|||
    if (!isinlined(cv)) {
 | 
			
		||||
        size_t len = cv_len(cv);
 | 
			
		||||
        if (cv_isstr(cv)) len++;
 | 
			
		||||
        ncv->data = LLT_ALLOC(len);
 | 
			
		||||
        ncv->data = malloc(len);
 | 
			
		||||
        memcpy(ncv->data, cv_data(cv), len);
 | 
			
		||||
        autorelease(ncv);
 | 
			
		||||
        if (hasparent(cv)) {
 | 
			
		||||
| 
						 | 
				
			
			@ -895,7 +888,7 @@ value_t fl_builtin(value_t *args, u_int32_t nargs)
 | 
			
		|||
 | 
			
		||||
value_t cbuiltin(char *name, builtin_t f)
 | 
			
		||||
{
 | 
			
		||||
    cvalue_t *cv = (cvalue_t*)LLT_ALLOC(CVALUE_NWORDS * sizeof(value_t));
 | 
			
		||||
    cvalue_t *cv = (cvalue_t*)malloc(CVALUE_NWORDS * sizeof(value_t));
 | 
			
		||||
    cv->type = builtintype;
 | 
			
		||||
    cv->data = &cv->_space[0];
 | 
			
		||||
    cv->len = sizeof(value_t);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -564,9 +564,7 @@ void gc(int mustgrow)
 | 
			
		|||
    memory_exception_value = relocate(memory_exception_value);
 | 
			
		||||
    the_empty_vector = relocate(the_empty_vector);
 | 
			
		||||
 | 
			
		||||
#ifndef BOEHM_GC
 | 
			
		||||
    sweep_finalizers();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef VERBOSEGC
 | 
			
		||||
    printf("GC: found %d/%d live conses\n",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@
 | 
			
		|||
 | 
			
		||||
(princ "sort: ")
 | 
			
		||||
(set! r (map-int (lambda (x) (mod (+ (* x 9421) 12345) 1024)) 1000))
 | 
			
		||||
(time (sort r))
 | 
			
		||||
(time (simple-sort r))
 | 
			
		||||
 | 
			
		||||
(princ "expand: ")
 | 
			
		||||
(time (dotimes (n 5000) (expand '(dotimes (i 100) body1 body2))))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -426,20 +426,20 @@ static value_t read_string()
 | 
			
		|||
    value_t s;
 | 
			
		||||
    u_int32_t wc;
 | 
			
		||||
 | 
			
		||||
    buf = LLT_ALLOC(sz);
 | 
			
		||||
    buf = malloc(sz);
 | 
			
		||||
    while (1) {
 | 
			
		||||
        if (i >= sz-4) {  // -4: leaves room for longest utf8 sequence
 | 
			
		||||
            sz *= 2;
 | 
			
		||||
            temp = LLT_REALLOC(buf, sz);
 | 
			
		||||
            temp = realloc(buf, sz);
 | 
			
		||||
            if (temp == NULL) {
 | 
			
		||||
                LLT_FREE(buf);
 | 
			
		||||
                free(buf);
 | 
			
		||||
                lerror(ParseError, "read: out of memory reading string");
 | 
			
		||||
            }
 | 
			
		||||
            buf = temp;
 | 
			
		||||
        }
 | 
			
		||||
        c = ios_getc(F);
 | 
			
		||||
        if (c == IOS_EOF) {
 | 
			
		||||
            LLT_FREE(buf);
 | 
			
		||||
            free(buf);
 | 
			
		||||
            lerror(ParseError, "read: unexpected end of input in string");
 | 
			
		||||
        }
 | 
			
		||||
        if (c == '"')
 | 
			
		||||
| 
						 | 
				
			
			@ -447,7 +447,7 @@ static value_t read_string()
 | 
			
		|||
        else if (c == '\\') {
 | 
			
		||||
            c = ios_getc(F);
 | 
			
		||||
            if (c == IOS_EOF) {
 | 
			
		||||
                LLT_FREE(buf);
 | 
			
		||||
                free(buf);
 | 
			
		||||
                lerror(ParseError, "read: end of input in escape sequence");
 | 
			
		||||
            }
 | 
			
		||||
            j=0;
 | 
			
		||||
| 
						 | 
				
			
			@ -474,7 +474,7 @@ static value_t read_string()
 | 
			
		|||
                eseq[j] = '\0';
 | 
			
		||||
                if (j) wc = strtol(eseq, NULL, 16);
 | 
			
		||||
                else {
 | 
			
		||||
                    LLT_FREE(buf);
 | 
			
		||||
                    free(buf);
 | 
			
		||||
                    lerror(ParseError, "read: invalid escape sequence");
 | 
			
		||||
                }
 | 
			
		||||
                if (ndig == 2)
 | 
			
		||||
| 
						 | 
				
			
			@ -492,7 +492,7 @@ static value_t read_string()
 | 
			
		|||
    }
 | 
			
		||||
    s = cvalue_string(i);
 | 
			
		||||
    memcpy(cvalue_data(s), buf, i);
 | 
			
		||||
    LLT_FREE(buf);
 | 
			
		||||
    free(buf);
 | 
			
		||||
    return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -263,15 +263,14 @@
 | 
			
		|||
		    (set! lst (cdr lst)))))))
 | 
			
		||||
  (filter- pred lst (list ())))
 | 
			
		||||
 | 
			
		||||
(define separate
 | 
			
		||||
  (letrec ((separate-
 | 
			
		||||
	    (lambda (pred lst yes no)
 | 
			
		||||
	      (cond ((null? lst) (cons yes no))
 | 
			
		||||
		    ((pred (car lst))
 | 
			
		||||
		     (separate- pred (cdr lst) (cons (car lst) yes) no))
 | 
			
		||||
		    (#t
 | 
			
		||||
		     (separate- pred (cdr lst) yes (cons (car lst) no)))))))
 | 
			
		||||
    (lambda (pred lst) (separate- pred lst () ()))))
 | 
			
		||||
(define (separate pred lst)
 | 
			
		||||
  (define (separate- pred lst yes no)
 | 
			
		||||
    (cond ((null? lst) (values yes no))
 | 
			
		||||
	  ((pred (car lst))
 | 
			
		||||
	   (separate- pred (cdr lst) (cons (car lst) yes) no))
 | 
			
		||||
	  (else
 | 
			
		||||
	   (separate- pred (cdr lst) yes (cons (car lst) no)))))
 | 
			
		||||
  (separate- pred lst () ()))
 | 
			
		||||
 | 
			
		||||
(define (count f l)
 | 
			
		||||
  (define (count- f l n)
 | 
			
		||||
| 
						 | 
				
			
			@ -958,11 +957,12 @@
 | 
			
		|||
 | 
			
		||||
(define (simple-sort l)
 | 
			
		||||
  (if (or (null? l) (null? (cdr l))) l
 | 
			
		||||
      (let* ((piv (car l))
 | 
			
		||||
	     (halves (separate (lambda (x) (< x piv)) (cdr l))))
 | 
			
		||||
	(nconc (simple-sort (car halves))
 | 
			
		||||
	       (list piv)
 | 
			
		||||
	       (simple-sort (cdr halves))))))
 | 
			
		||||
      (let ((piv (car l)))
 | 
			
		||||
	(receive (less grtr)
 | 
			
		||||
		 (separate (lambda (x) (< x piv)) (cdr l))
 | 
			
		||||
		 (nconc (simple-sort less)
 | 
			
		||||
			(list piv)
 | 
			
		||||
			(simple-sort grtr))))))
 | 
			
		||||
 | 
			
		||||
(define (make-system-image fname)
 | 
			
		||||
  (let ((f (file fname :write :create :truncate))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,14 +35,6 @@
 | 
			
		|||
;(set! a (map-int identity 10000))
 | 
			
		||||
;(dotimes (i 200) (rfoldl cons () a))
 | 
			
		||||
 | 
			
		||||
(define (sort l)
 | 
			
		||||
  (if (or (null? l) (null? (cdr l))) l
 | 
			
		||||
    (let* ((piv (car l))
 | 
			
		||||
           (halves (separate (lambda (x) (< x piv)) (cdr l))))
 | 
			
		||||
      (nconc (sort (car halves))
 | 
			
		||||
             (list piv)
 | 
			
		||||
             (sort (cdr halves))))))
 | 
			
		||||
 | 
			
		||||
#|
 | 
			
		||||
(define-macro (dotimes var . body)
 | 
			
		||||
  (let ((v   (car var))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ fltype_t *get_type(value_t t)
 | 
			
		|||
        sz = ctype_sizeof(t, &align);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ft = (fltype_t*)LLT_ALLOC(sizeof(fltype_t));
 | 
			
		||||
    ft = (fltype_t*)malloc(sizeof(fltype_t));
 | 
			
		||||
    ft->type = t;
 | 
			
		||||
    if (issymbol(t)) {
 | 
			
		||||
        ft->numtype = sym_to_numtype(t);
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ fltype_t *get_type(value_t t)
 | 
			
		|||
        if (isarray) {
 | 
			
		||||
            fltype_t *eltype = get_type(car_(cdr_(t)));
 | 
			
		||||
            if (eltype->size == 0) {
 | 
			
		||||
                LLT_FREE(ft);
 | 
			
		||||
                free(ft);
 | 
			
		||||
                lerror(ArgError, "invalid array element type");
 | 
			
		||||
            }
 | 
			
		||||
            ft->elsz = eltype->size;
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ fltype_t *get_array_type(value_t eltype)
 | 
			
		|||
fltype_t *define_opaque_type(value_t sym, size_t sz, cvtable_t *vtab,
 | 
			
		||||
                             cvinitfunc_t init)
 | 
			
		||||
{
 | 
			
		||||
    fltype_t *ft = (fltype_t*)LLT_ALLOC(sizeof(fltype_t));
 | 
			
		||||
    fltype_t *ft = (fltype_t*)malloc(sizeof(fltype_t));
 | 
			
		||||
    ft->type = sym;
 | 
			
		||||
    ft->size = sz;
 | 
			
		||||
    ft->numtype = N_NUMTYPES;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue