[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Chicken-users] location and c-string*
From: |
felix winkelmann |
Subject: |
Re: [Chicken-users] location and c-string* |
Date: |
Mon, 13 Aug 2007 08:56:31 +0200 |
On 8/12/07, Zbigniew <address@hidden> wrote:
> Hi, just want to make sure this code is legal. I have a C function
> which allocates a string and returns it via one of its arguments,
> expecting the caller to free it. The following code works as
> expected, but I want to make sure it is valid.
>
> (let-location ((out c-string*))
> (let ((rv (my-func "Lambda.OrG" #$out "Nameprep" 0)))
> (let ((out out)) ; free out once
> (if (eqv? rv 0)
> (print out)
> (error "profile error" rv)))))
>
> The issue is that ##sys#peek-and-free-c-string will be called every
> time "out" is referenced. To guarantee "out" is freed exactly once,
> I immediately rebind out to itself after the call. Is this a valid
> recipe?
>
I tihnk it is, look at the expansion:
csc x.scm -debug 2
[canonicalized]
(##core#callunit "library")
(##core#callunit "eval")
(##core#callunit "extras")
(##core#undefined)
(##core#undefined)
(let ()
(let ((g2 (##core#inline_allocate ("C_a_i_bytevector" 3) '1)))
(let ()
(let ((rv3 (my-func
'"Lambda.OrG"
(##sys#make-locative g2 '0 '#f 'location)
'"Nameprep"
'0)))
(let ((out4 (##sys#peek-and-free-c-string
(##core#inline_loc_ref (c-string*) g2)
'0)))
(if (eqv? rv3 '0) (print out4) (error '"profile error" rv3)))))))
((##sys#implicit-exit-handler))
(##core#undefined)
cheers,
felix