What's the magic incantation to allocate a still u8vector? I can't seem to find any primitive procedure (in scheme or in C) for this.
-- vyzo
Afficher les réponses par date
You can use the C interface to call ___alloc_scmobj with the first argument equal to the processor state, or call ##still-copy to make a still copy of an existing u8vector:
;; this code is specific to the C backend
(define (make-u8vector-still len) (let ((result ((c-lambda (unsigned-int) scheme-object "___SCMOBJ result = ___EXT(___alloc_scmobj) (___ps, ___sU8VECTOR, ___arg1); if (!___FIXNUMP(result)) ___still_obj_refcount_dec (result); ___return(result); ") len))) (if (##fixnum? result) (begin (##raise-heap-overflow-exception) (make-u8vector-still len)) result)))
(define still? (c-lambda (scheme-object) bool "___return(___HD_TYP(___HEADER(___arg1)) == ___STILL);"))
(pp (still? (make-u8vector 1000))) ;; #f (small objects are movable)
(pp (still? (make-u8vector 3000))) ;; #t (large objects are still)
(pp (still? (##still-copy (make-u8vector 10)))) ;; #t (make a still copy)
(pp (still? (make-u8vector-still 10))) ;; #t (allocated as still even if small)
Marc
On Nov 15, 2019, at 3:39 AM, Dimitris Vyzovitis vyzo@hackzen.org wrote:
What's the magic incantation to allocate a still u8vector? I can't seem to find any primitive procedure (in scheme or in C) for this.
-- vyzo _______________________________________________ Gambit-list mailing list Gambit-list@iro.umontreal.ca https://mailman.iro.umontreal.ca/cgi-bin/mailman/listinfo/gambit-list
thanks Marc!
-- vyzo
On Fri, Nov 15, 2019 at 1:16 PM Marc Feeley feeley@iro.umontreal.ca wrote:
You can use the C interface to call ___alloc_scmobj with the first argument equal to the processor state, or call ##still-copy to make a still copy of an existing u8vector:
;; this code is specific to the C backend
(define (make-u8vector-still len) (let ((result ((c-lambda (unsigned-int) scheme-object "___SCMOBJ result = ___EXT(___alloc_scmobj) (___ps, ___sU8VECTOR, ___arg1); if (!___FIXNUMP(result)) ___still_obj_refcount_dec (result); ___return(result); ") len))) (if (##fixnum? result) (begin (##raise-heap-overflow-exception) (make-u8vector-still len)) result)))
(define still? (c-lambda (scheme-object) bool "___return(___HD_TYP(___HEADER(___arg1)) == ___STILL);"))
(pp (still? (make-u8vector 1000))) ;; #f (small objects are movable)
(pp (still? (make-u8vector 3000))) ;; #t (large objects are still)
(pp (still? (##still-copy (make-u8vector 10)))) ;; #t (make a still copy)
(pp (still? (make-u8vector-still 10))) ;; #t (allocated as still even if small)
Marc
On Nov 15, 2019, at 3:39 AM, Dimitris Vyzovitis vyzo@hackzen.org
wrote:
What's the magic incantation to allocate a still u8vector? I can't seem to find any primitive procedure (in scheme or in C) for
this.
-- vyzo _______________________________________________ Gambit-list mailing list Gambit-list@iro.umontreal.ca https://mailman.iro.umontreal.ca/cgi-bin/mailman/listinfo/gambit-list