Thanks for the help!

When the optimize converts

 (let-values ([(X ...) (values M ...)])
   ....)

to

 (let ([X M] ...)
   ....)

it incorrectly attaches a virtual timestamp to each "[X M]" binding
that corresponds to the timestamp after the whole `(values M ...)`.

So, the optimizer loses the fact that in `(values (car xy) (cdr xy))`
the `(cdr xy)` happens after the `(car xy)`. It later ends up swapping
the order of those expressions, which is a particular problem when
`(cdr xy)` was changed to `(unsafe-cdr xy)` on the grounds that it
happens after `(car xy)`.

At Sun, 13 Sep 2015 12:15:33 +0200, antoine wrote:
> Bonjour,
> 
> The bytecode generated is:
> 
> (begin
>   (module test ....
>     (require (lib "racket/base.rkt"))
>     (provide)
>     (module configure-runtime ....
>       (require '#%kernel (lib "racket/runtime-config.rkt"))
>       (provide)
>       (print-as-expression '#t))
>     (define-values
>      (_split&flip)
>      (begin
>        '%%inline-variant%%
>        (#%closed
>         split&flip28
>         (lambda (arg0-30)
>           '#(split&flip #<path:/tmp/test.rkt> 3 0 20 90 #f)
>           (values (unsafe-cdr arg0-30) (car arg0-30))))
>        (#%closed
>         split&flip27
>         (lambda (arg0-35)
>           '#(split&flip #<path:/tmp/test.rkt> 3 0 20 90 #f)
>           (values (unsafe-cdr arg0-35) (car (#%sfs-clear arg0-35)))))))
>     (define-values
>      (_a _b)
>      (let ((local40 (cons '0 '1)))
>        (values (unsafe-cdr local40) (unsafe-car local40))))
>     (#%apply-values
>      |_print-values:p@(lib "racket/private/modbeg.rkt")|
>      (values (unsafe-cdr _b) (car _b)))))
> 
> 
> Not familiar with the bytecode but a quick look at
> http://docs.racket-lang.org/raco/decompile.html about %%inline-variant%% make 
> me
> think split&flip28 is over enthousiastic about
> 
> (values (unsafe-cdr arg0-30) (car arg0-30))
> 
> and should have generated:
> 
> (values (cdr arg0-30) (car arg0-30))
> 
> By the way it also segfault to me, 32bit, linux 6.2 release.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to