diff --git a/core/optimizer/allot/allot.factor b/core/optimizer/allot/allot.factor index d89e3c5f84..6eae3248c2 100644 --- a/core/optimizer/allot/allot.factor +++ b/core/optimizer/allot/allot.factor @@ -36,11 +36,13 @@ IN: optimizer.allot } define-optimizers : tuple-boa-quot ( layout -- quot ) - [ (tuple) ] - swap size>> 1 - [ 3 + ] map - [ [ set-slot ] curry [ keep ] curry ] map concat - [ f over 2 set-slot ] - 3append ; + [ + dup , + [ nip (tuple) ] % + size>> 1 - [ 3 + ] map + [ [ set-slot ] curry [ keep ] curry % ] each + [ f over 2 set-slot ] % + ] [ ] make ; : expand-tuple-boa ( #call -- node ) dup in-d>> peek value-literal tuple-boa-quot f splice-quot ; @@ -56,7 +58,8 @@ IN: optimizer.allot : -quot ( n -- quot ) [ - [ swap (array) ] % + dup , + [ nip (array) ] % [ \ 2dup , , [ swap set-array-nth ] % ] each \ nip , ] [ ] make ; @@ -80,7 +83,8 @@ IN: optimizer.allot : -quot ( n -- quot ) [ - \ (byte-array) , + dup , + [ nip (byte-array) ] % bytes>cells [ cell * ] map [ [ 0 over ] % , [ set-alien-unsigned-cell ] % ] each ] [ ] make ; diff --git a/core/optimizer/optimizer-tests.factor b/core/optimizer/optimizer-tests.factor index 0a3439c65c..ab808d7914 100755 --- a/core/optimizer/optimizer-tests.factor +++ b/core/optimizer/optimizer-tests.factor @@ -384,3 +384,10 @@ PREDICATE: list < improper-list [ 1 [ "hi" + drop ] compile-call ] must-fail [ "hi" f [ drop ] compile-call ] must-fail + +TUPLE: some-tuple x ; + +: allot-regression ( a -- b ) + [ ] curry some-tuple boa ; + +[ T{ some-tuple f [ 3 ] } ] [ 3 allot-regression ] unit-test