chicken-users
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]