Hi Matthew, Thanks for working on this so quickly! Unfortunately, It looks like there is a bug in the fix that causes segfaults when checking impersonator properties on keyword procedures that are not impersonators. I’ve included a small test case below.
Thanks again, Scott #lang racket (define-values (prop:my-prop my-prop? my-prop-accessor) (make-impersonator-property 'my-prop)) (define kwp (make-keyword-procedure (λ (kwds kwd-args . other-args) (printf "Keywords: ~a~n" kwds) (printf "Keyword arguments: ~a~n" kwd-args) (printf "Other arguments: ~a~n" other-args)) (λ args (printf "Arguments: ~a~n" args)))) (my-prop? kwp) > On Mar 8, 2015, at 10:12 PM, Matthew Flatt <mfl...@cs.utah.edu> wrote: > > I agree that this is a bug --- specific to impersonators that are not > chaperones --- and I've pushed a repair to the Git repo. > > The general repair was to make impersonator-property predicates and > accessors sensitive to `prop:impersonator-of`. When a structure > impersoator does not have a particular impersonator property, but its > structure has the `prop:impersonator-of` property, then the structure > produced by `prop:impersonator-of` is checked (recursively). That > change fixes the problem with keyword procedures, because > `impersonator-procedure` on keyword-acepting procedure is implemented > through an internal structure type that has `prop:impersonator-of`. > > Thanks for the report! > > At Fri, 6 Mar 2015 20:04:10 -0500, Scott Moore wrote: >> Hi, >> >> I've run into some strange behavior with the interaction between >> impersonators and make-keyword-procedure. I expect that when not invoked >> with keywords, the result of make-keyword-procedure and a lambda with the >> same form should be equivalent. Instead, they behave differently when >> impersonated. I have included a small module that demonstrates the issue >> below. I expect that the two checks at the bottom should succeed. >> >> Thanks, >> Scott >> >> #lang racket >> >> (require rackunit) >> >> (define-values (prop:my-prop my-prop? my-prop-accessor) >> (make-impersonator-property 'my-prop)) >> >> (define (mark-with-my-prop val) >> (impersonate-procedure >> val >> #f >> prop:my-prop >> #t)) >> >> (define (mark-fun-mkp f) >> (mark-with-my-prop >> (make-keyword-procedure >> (λ (kwds kwd-args . other-args) >> (keyword-apply f kwds kwd-args other-args)) >> (λ args >> (apply f args))))) >> >> (define (mark-fun-lambda f) >> (mark-with-my-prop >> (λ args >> (apply f args)))) >> >> (define (dummy-impersonator val) >> (make-keyword-procedure >> (λ (kwds kwd-args . other-args) >> (apply values kwd-args other-args)) >> (λ args >> (apply values args)))) >> >> (define marked-mkp (mark-fun-mkp display)) >> (define marked-lambda (mark-fun-lambda display)) >> >> (check-eq? (my-prop? marked-lambda) (my-prop? marked-mkp)) >> (check-eq? (my-prop? (impersonate-procedure marked-lambda >> (dummy-impersonator marked-lambda))) >> (my-prop? (impersonate-procedure marked-mkp (dummy-impersonator >> marked-mkp)))) >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users
____________________ Racket Users list: http://lists.racket-lang.org/users