factor/basis/compiler/tests/templates.factor

383 lines
10 KiB
Factor
Raw Normal View History

2008-10-19 04:51:01 -04:00
USING: generalizations accessors arrays compiler kernel
kernel.private math hashtables.private math.private namespaces
sequences sequences.private tools.test namespaces.private
slots.private sequences.private byte-arrays alien
alien.accessors layouts words definitions compiler.units io
combinators vectors ;
2008-03-01 17:00:45 -05:00
IN: compiler.tests
2007-09-20 18:09:08 -04:00
2008-10-19 04:51:01 -04:00
! Originally, this file did black box testing of templating
! optimization. We now have a different codegen, but the tests
! in here are still useful.
2007-09-20 18:09:08 -04:00
! Oops!
2007-12-24 21:54:45 -05:00
[ 5000 ] [ [ 5000 ] compile-call ] unit-test
[ "hi" ] [ [ "hi" ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
2007-12-24 21:54:45 -05:00
[ 1 2 3 4 ] [ [ 1 2 3 4 ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
2007-12-24 21:54:45 -05:00
[ 1 1 ] [ 1 [ dup ] compile-call ] unit-test
[ 0 ] [ 3 [ tag ] compile-call ] unit-test
[ 0 3 ] [ 3 [ [ tag ] keep ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
2007-12-24 21:54:45 -05:00
[ 2 3 ] [ 3 [ 2 swap ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
2007-12-24 21:54:45 -05:00
[ 2 1 3 4 ] [ 1 2 [ swap 3 4 ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
2007-12-24 21:54:45 -05:00
[ 2 3 4 ] [ 3 [ 2 swap 4 ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
[ { 1 2 3 } { 1 4 3 } 3 3 ]
2007-12-24 21:54:45 -05:00
[ { 1 2 3 } { 1 4 3 } [ over tag over tag ] compile-call ]
2007-09-20 18:09:08 -04:00
unit-test
! Test literals in either side of a shuffle
2007-12-24 21:54:45 -05:00
[ 4 1 ] [ 1 [ [ 3 fixnum+ ] keep ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
2007-12-24 21:54:45 -05:00
[ 2 ] [ 1 2 [ swap fixnum/i ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
2008-06-08 16:32:55 -04:00
: foo ( -- ) ;
2007-09-20 18:09:08 -04:00
[ 5 5 ]
2007-12-24 21:54:45 -05:00
[ 1.2 [ tag [ foo ] keep ] compile-call ]
2007-09-20 18:09:08 -04:00
unit-test
[ 1 2 2 ]
2007-12-24 21:54:45 -05:00
[ { 1 2 } [ dup 2 slot swap 3 slot [ foo ] keep ] compile-call ]
2007-09-20 18:09:08 -04:00
unit-test
[ 3 ]
[
global [ 3 \ foo set ] bind
2007-12-24 21:54:45 -05:00
\ foo [ global >n get ndrop ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
: blech drop ;
[ 3 ]
[
global [ 3 \ foo set ] bind
2007-12-24 21:54:45 -05:00
\ foo [ global [ get ] swap blech call ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
[ 3 ]
[
global [ 3 \ foo set ] bind
2007-12-24 21:54:45 -05:00
\ foo [ global [ get ] swap >n call ndrop ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
[ 3 ]
[
global [ 3 \ foo set ] bind
2007-12-24 21:54:45 -05:00
\ foo [ global [ get ] bind ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
[ 12 13 ] [
2008-03-29 21:36:58 -04:00
-12 -13 [ [ 0 swap fixnum-fast ] bi@ ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
2007-12-24 21:54:45 -05:00
[ -1 2 ] [ 1 2 [ >r 0 swap fixnum- r> ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
[ 12 13 ] [
2008-03-29 21:36:58 -04:00
-12 -13 [ [ 0 swap fixnum- ] bi@ ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
2008-03-27 06:13:52 -04:00
[ 1 ] [
SBUF" " [ 1 slot 1 [ slot ] keep ] compile-call nip
2007-09-20 18:09:08 -04:00
] unit-test
! Test slow shuffles
[ 3 1 2 3 4 5 6 7 8 9 ] [
1 2 3 4 5 6 7 8 9
[ >r >r >r >r >r >r >r >r >r 3 r> r> r> r> r> r> r> r> r> ]
2007-12-24 21:54:45 -05:00
compile-call
2007-09-20 18:09:08 -04:00
] unit-test
[ 2 2 2 2 2 2 2 2 2 2 1 ] [
1 2
2007-12-24 21:54:45 -05:00
[ swap >r dup dup dup dup dup dup dup dup dup r> ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
2007-12-24 21:54:45 -05:00
[ ] [ [ 9 [ ] times ] compile-call ] unit-test
2007-09-20 18:09:08 -04:00
[ ] [
[
[ 200 dup [ 200 3array ] curry map drop ] times
] [ define-temp ] with-compilation-unit drop
2007-09-20 18:09:08 -04:00
] unit-test
! Test how dispatch handles the end of a basic block
2008-10-19 04:51:01 -04:00
: try-breaking-dispatch ( n a b -- x str )
2007-09-20 18:09:08 -04:00
float+ swap { [ "hey" ] [ "bye" ] } dispatch ;
2008-06-08 16:32:55 -04:00
: try-breaking-dispatch-2 ( -- ? )
2007-09-20 18:09:08 -04:00
1 1.0 2.5 try-breaking-dispatch "bye" = >r 3.5 = r> and ;
[ t ] [
10000000 [ drop try-breaking-dispatch-2 ] all?
] unit-test
! Regression
: (broken) ( x -- y ) ;
[ 2.0 { 2.0 0.0 } ] [
2.0 1.0
2007-12-24 21:54:45 -05:00
[ float/f 0.0 [ drop (broken) ] 2keep 2array ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
! Regression
2008-10-19 04:51:01 -04:00
: hellish-bug-1 ( a b -- ) 2drop ;
2007-09-20 18:09:08 -04:00
: hellish-bug-2 ( i array x -- x )
2dup 1 slot eq? [ 2drop ] [
2dup array-nth tombstone? [
[
[ array-nth ] 2keep >r 1 fixnum+fast r> array-nth
pick 2dup hellish-bug-1 3drop
] 2keep
] unless >r 2 fixnum+fast r> hellish-bug-2
2008-10-19 04:51:01 -04:00
] if ; inline recursive
2007-09-20 18:09:08 -04:00
: hellish-bug-3 ( hash array -- )
0 swap hellish-bug-2 drop ;
[ ] [
2008-06-30 04:57:00 -04:00
H{ { 1 2 } { 3 4 } } dup array>>
2007-12-24 21:54:45 -05:00
[ 0 swap hellish-bug-2 drop ] compile-call
2007-09-20 18:09:08 -04:00
] unit-test
! Regression
2008-06-08 16:32:55 -04:00
: foox ( obj -- obj )
2007-09-20 18:09:08 -04:00
dup not
[ drop 3 ] [ dup tuple? [ drop 4 ] [ drop 5 ] if ] if ;
[ 3 ] [ f foox ] unit-test
TUPLE: my-tuple ;
[ 4 ] [ T{ my-tuple } foox ] unit-test
[ 5 ] [ "hi" foox ] unit-test
2007-09-28 04:02:33 -04:00
! Making sure we don't needlessly unbox/rebox
2007-12-24 21:54:45 -05:00
[ t 3.0 ] [ 1.0 dup [ dup 2.0 float+ >r eq? r> ] compile-call ] unit-test
2007-09-28 04:02:33 -04:00
2007-12-24 21:54:45 -05:00
[ t 3.0 ] [ 1.0 dup [ dup 2.0 float+ ] compile-call >r eq? r> ] unit-test
2007-09-28 04:02:33 -04:00
2007-12-24 21:54:45 -05:00
[ t ] [ 1.0 dup [ [ 2.0 float+ ] keep ] compile-call nip eq? ] unit-test
2007-09-28 04:02:33 -04:00
[ 1 B{ 1 2 3 4 } ] [
B{ 1 2 3 4 } [
{ byte-array } declare
[ 0 alien-unsigned-1 ] keep
2007-12-24 21:54:45 -05:00
] compile-call
2007-09-28 04:02:33 -04:00
] unit-test
[ 1 t ] [
B{ 1 2 3 4 } [
{ c-ptr } declare
2008-04-03 01:22:10 -04:00
[ 0 alien-unsigned-1 ] keep hi-tag
2007-12-24 21:54:45 -05:00
] compile-call byte-array type-number =
2007-09-28 04:02:33 -04:00
] unit-test
[ t ] [
B{ 1 2 3 4 } [
{ c-ptr } declare
2008-04-03 01:22:10 -04:00
0 alien-cell hi-tag
2007-12-24 21:54:45 -05:00
] compile-call alien type-number =
2007-09-28 04:02:33 -04:00
] unit-test
2007-10-01 06:56:45 -04:00
[ 2 1 ] [
2 1
2007-12-24 21:54:45 -05:00
[ 2dup fixnum< [ >r die r> ] when ] compile-call
2007-10-01 06:56:45 -04:00
] unit-test
! Regression
: a-dummy ( a -- ) drop "hi" print ;
[ ] [
1 [
dup 0 2 3dup pick >= [ >= ] [ 2drop f ] if [
drop - >fixnum {
[ a-dummy ]
[ a-dummy ]
[ a-dummy ]
} dispatch
] [ 2drop no-case ] if
] compile-call
] unit-test
2008-04-04 04:46:30 -04:00
2008-06-08 16:32:55 -04:00
: float-spill-bug ( a -- b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b )
2008-04-04 04:46:30 -04:00
{
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
[ dup float+ ]
} cleave ;
[ 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 ]
[ 1.0 float-spill-bug ] unit-test
[ t ] [ \ float-spill-bug compiled>> ] unit-test
2008-04-17 04:03:22 -04:00
: float-fixnum-spill-bug ( object -- object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object object )
{
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
[ dup float+ ]
[ float>fixnum dup fixnum+fast ]
} cleave ;
[ 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 2.0 2 ]
[ 1.0 float-fixnum-spill-bug ] unit-test
[ t ] [ \ float-fixnum-spill-bug compiled>> ] unit-test
2008-10-19 04:51:01 -04:00
: resolve-spill-bug ( a b -- c )
[ 1 fixnum+fast ] bi@ dup 10 fixnum< [
nip 2 fixnum+fast
] [
drop {
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
[ dup fixnum+fast ]
} cleave
16 narray
] if ;
[ t ] [ \ resolve-spill-bug compiled>> ] unit-test
[ 4 ] [ 1 1 resolve-spill-bug ] unit-test
2008-04-17 04:03:22 -04:00
! Regression
: dispatch-alignment-regression ( -- c )
{ tuple vector } 3 slot { word } declare
dup 1 slot 0 fixnum-bitand { [ ] } dispatch ;
[ t ] [ \ dispatch-alignment-regression compiled>> ] unit-test
2008-04-17 04:03:22 -04:00
[ vector ] [ dispatch-alignment-regression ] unit-test
2008-10-20 02:56:28 -04:00
! Regression
: bad-value-bug ( a -- b ) [ 3 ] [ 3 ] if f <array> ;
[ { f f f } ] [ t bad-value-bug ] unit-test