| 
									
										
										
										
											2010-01-22 06:39:56 -05:00
										 |  |  | USING: compiler.test compiler.units tools.test kernel kernel.private | 
					
						
							| 
									
										
										
										
											2008-10-20 02:56:28 -04:00
										 |  |  | sequences.private math.private math combinators strings alien | 
					
						
							| 
									
										
										
										
											2009-10-23 04:27:25 -04:00
										 |  |  | arrays memory vocabs parser eval quotations compiler.errors | 
					
						
							| 
									
										
										
										
											2010-07-17 15:57:44 -04:00
										 |  |  | definitions generic.single ;
 | 
					
						
							| 
									
										
										
										
											2009-04-26 01:51:47 -04:00
										 |  |  | IN: compiler.tests.simple | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Test empty word | 
					
						
							|  |  |  | [ ] [ [ ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Test literals | 
					
						
							|  |  |  | [ 1 ] [ [ 1 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 31 ] [ [ 31 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 255 ] [ [ 255 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ -1 ] [ [ -1 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 65536 ] [ [ 65536 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ -65536 ] [ [ -65536 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ "hey" ] [ [ "hey" ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Calls | 
					
						
							| 
									
										
										
										
											2009-02-24 00:25:13 -05:00
										 |  |  | : no-op ( -- ) ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ ] [ [ no-op ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 3 ] [ [ no-op 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 3 ] [ [ 3 no-op ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-24 00:25:13 -05:00
										 |  |  | : bar ( -- value ) 4 ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ 4 ] [ [ bar no-op ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 4 3 ] [ [ no-op bar 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 3 4 ] [ [ 3 no-op bar ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ ] [ no-op ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Conditionals | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 1 ] [ t [ [ 1 ] [ 2 ] if ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 2 ] [ f [ [ 1 ] [ 2 ] if ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 1 3 ] [ t [ [ 1 ] [ 2 ] if 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 2 3 ] [ f [ [ 1 ] [ 2 ] if 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ "hi" ] [ 0 [ { [ "hi" ] [ "bye" ] } dispatch ] compile-call ] unit-test | 
					
						
							|  |  |  | [ "bye" ] [ 1 [ { [ "hi" ] [ "bye" ] } dispatch ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ "hi" 3 ] [ 0 [ { [ "hi" ] [ "bye" ] } dispatch 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ "bye" 3 ] [ 1 [ { [ "hi" ] [ "bye" ] } dispatch 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 4 1 ] [ 0 [ { [ bar 1 ] [ 3 1 ] } dispatch ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 3 1 ] [ 1 [ { [ bar 1 ] [ 3 1 ] } dispatch ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 4 1 3 ] [ 0 [ { [ bar 1 ] [ 3 1 ] } dispatch 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | [ 3 1 3 ] [ 1 [ { [ bar 1 ] [ 3 1 ] } dispatch 3 ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-05 05:01:46 -04:00
										 |  |  | [ 2 3 ] [ 1 [ { [ gc 1 ] [ gc 2 ] } dispatch 3 ] compile-call ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-09 22:08:47 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | ! Labels | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-23 21:27:05 -05:00
										 |  |  | : recursive-test ( ? -- ) [ f recursive-test ] when ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-03 07:34:56 -05:00
										 |  |  | [ ] [ t [ recursive-test ] compile-call ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-03 07:34:56 -05:00
										 |  |  | [ ] [ t recursive-test ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Make sure error reporting works | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-02 14:45:38 -04:00
										 |  |  | ! [ [ dup ] compile-call ] must-fail | 
					
						
							|  |  |  | ! [ [ drop ] compile-call ] must-fail | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Regression | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-13 13:11:59 -04:00
										 |  |  | [ ] [ [ get-callstack ] compile-call drop ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Regression | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : empty ( -- ) ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ "b" ] [ 1 [ empty { [ "a" ] [ "b" ] } dispatch ] compile-call ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-if-1 ( -- ) t [ ] [ ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ ] [ dummy-if-1 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-if-2 ( -- ) f [ ] [ ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ ] [ dummy-if-2 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : dummy-if-3 ( -- n ) t [ 1 ] [ 2 ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ 1 ] [ dummy-if-3 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : dummy-if-4 ( -- n ) f [ 1 ] [ 2 ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ 2 ] [ dummy-if-4 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-if-5 ( -- n ) 0 dup 1 fixnum<= [ drop 1 ] [ ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ 1 ] [ dummy-if-5 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-if-6 ( n -- n )
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  |     dup 1 fixnum<= [ | 
					
						
							|  |  |  |         drop 1
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         1 fixnum- dup 1 fixnum- fixnum+ | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 17 ] [ 10 dummy-if-6 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dead-code-rec ( -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  |     t [ | 
					
						
							|  |  |  |         3.2
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         dead-code-rec | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 3.2 ] [ dead-code-rec ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : one-rec ( ? -- obj ) [ f one-rec ] [ "hi" ] if ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ "hi" ] [ t one-rec ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : after-if-test ( -- n )
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  |     t [ ] [ ] if 5 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 5 ] [ after-if-test ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: countdown-b | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : countdown-a ( n -- ) dup 0 eq? [ drop ] [ 1 fixnum- countdown-b ] if ;
 | 
					
						
							|  |  |  | : countdown-b ( n -- ) dup 0 eq? [ drop ] [ 1 fixnum- countdown-a ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ ] [ 10 countdown-b ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-when-1 ( -- ) t [ ] when ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ ] [ dummy-when-1 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-when-2 ( -- ) f [ ] when ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ ] [ dummy-when-2 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-when-3 ( a -- b ) dup [ dup fixnum* ] when ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ 16 ] [ 4 dummy-when-3 ] unit-test | 
					
						
							|  |  |  | [ f ] [ f dummy-when-3 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : dummy-when-4 ( a b -- a b ) dup [ dup dup fixnum* fixnum* ] when swap ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ 64 f ] [ f 4 dummy-when-4 ] unit-test | 
					
						
							|  |  |  | [ f t ] [ t f dummy-when-4 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : dummy-when-5 ( a -- b ) f [ dup fixnum* ] when ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ f ] [ f dummy-when-5 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-unless-1 ( -- ) t [ ] unless ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ ] [ dummy-unless-1 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-unless-2 ( -- ) f [ ] unless ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ ] [ dummy-unless-2 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : dummy-unless-3 ( a -- b ) dup [ drop 3 ] unless ;
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | [ 3 ] [ f dummy-unless-3 ] unit-test | 
					
						
							|  |  |  | [ 4 ] [ 4 dummy-unless-3 ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Test cond expansion | 
					
						
							|  |  |  | [ "even" ] [ | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         2 { | 
					
						
							|  |  |  |             { [ dup 2 mod 0 = ] [ drop "even" ] } | 
					
						
							|  |  |  |             { [ dup 2 mod 1 = ] [ drop "odd" ] } | 
					
						
							|  |  |  |         } cond
 | 
					
						
							|  |  |  |     ] compile-call | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ "odd" ] [ | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         3 { | 
					
						
							|  |  |  |             { [ dup 2 mod 0 = ] [ drop "even" ] } | 
					
						
							|  |  |  |             { [ dup 2 mod 1 = ] [ drop "odd" ] } | 
					
						
							|  |  |  |         } cond
 | 
					
						
							|  |  |  |     ] compile-call | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ "neither" ] [ | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         3 { | 
					
						
							|  |  |  |             { [ dup string? ] [ drop "string" ] } | 
					
						
							|  |  |  |             { [ dup float? ] [ drop "float" ] } | 
					
						
							|  |  |  |             { [ dup alien? ] [ drop "alien" ] } | 
					
						
							| 
									
										
										
										
											2008-04-11 13:53:22 -04:00
										 |  |  |             [ drop "neither" ] | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  |         } cond
 | 
					
						
							|  |  |  |     ] compile-call | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 3 ] [ | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         3 { | 
					
						
							|  |  |  |             { [ dup fixnum? ] [ ] } | 
					
						
							| 
									
										
										
										
											2008-04-11 13:53:22 -04:00
										 |  |  |             [ drop t ] | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  |         } cond
 | 
					
						
							|  |  |  |     ] compile-call | 
					
						
							|  |  |  | ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | GENERIC: single-combination-test ( obj1 obj2 -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: object single-combination-test drop ;
 | 
					
						
							|  |  |  | M: f single-combination-test nip ;
 | 
					
						
							|  |  |  | M: array single-combination-test drop ;
 | 
					
						
							|  |  |  | M: integer single-combination-test drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 2 3 ] [ 2 3 t single-combination-test ] unit-test | 
					
						
							|  |  |  | [ 2 3 ] [ 2 3 4 single-combination-test ] unit-test | 
					
						
							|  |  |  | [ 2 f ] [ 2 3 f single-combination-test ] unit-test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: single-combination-test-2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : single-combination-test-4 ( obj -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  |     dup [ single-combination-test-2 ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : single-combination-test-3 ( obj -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  |     drop 3 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | GENERIC: single-combination-test-2 ( obj -- obj )
 | 
					
						
							| 
									
										
										
										
											2008-02-08 02:48:51 -05:00
										 |  |  | M: object single-combination-test-2 single-combination-test-3 ;
 | 
					
						
							|  |  |  | M: f single-combination-test-2 single-combination-test-4 ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ 3 ] [ t single-combination-test-2 ] unit-test | 
					
						
							|  |  |  | [ 3 ] [ 3 single-combination-test-2 ] unit-test | 
					
						
							|  |  |  | [ f ] [ f single-combination-test-2 ] unit-test | 
					
						
							| 
									
										
										
										
											2008-02-14 21:27:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Regression | 
					
						
							|  |  |  | [ 100 ] [ [ 100 [ [ ] times ] keep ] compile-call ] unit-test | 
					
						
							| 
									
										
										
										
											2008-04-19 21:39:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Regression | 
					
						
							|  |  |  | 10 [ | 
					
						
							|  |  |  |     [ "compiler.tests.foo" forget-vocab ] with-compilation-unit | 
					
						
							|  |  |  |     [ t ] [ | 
					
						
							| 
									
										
										
										
											2015-07-15 14:47:03 -04:00
										 |  |  |         "USING: prettyprint words accessors ;
 | 
					
						
							|  |  |  |         IN: compiler.tests.foo | 
					
						
							|  |  |  |         : (recursive) ( -- ) (recursive) (recursive) ; inline recursive
 | 
					
						
							|  |  |  |         : recursive ( -- ) (recursive) ;
 | 
					
						
							|  |  |  |         \\ (recursive) word-optimized?" eval( -- obj ) | 
					
						
							| 
									
										
										
										
											2008-04-19 21:39:58 -04:00
										 |  |  |     ] unit-test | 
					
						
							|  |  |  | ] times
 | 
					
						
							| 
									
										
										
										
											2009-10-23 04:27:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! This should not compile | 
					
						
							|  |  |  | GENERIC: bad-effect-test ( a -- )
 | 
					
						
							|  |  |  | M: quotation bad-effect-test call ; inline
 | 
					
						
							|  |  |  | : bad-effect-test* ( -- ) [ 1 2 3 ] bad-effect-test ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [ bad-effect-test* ] [ not-compiled? ] must-fail-with | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ! Don't want compiler error to stick around | 
					
						
							|  |  |  | [ ] [ [ M\ quotation bad-effect-test forget ] with-compilation-unit ] unit-test | 
					
						
							| 
									
										
										
										
											2010-07-17 15:57:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | ! Make sure time bombs literalize | 
					
						
							|  |  |  | [ [ \ + call ] compile-call ] [ no-method? ] must-fail-with |