| 
									
										
										
										
											2010-07-06 17:59:35 -04:00
										 |  |  | ! Copyright (C) 2006, 2010 Slava Pestov, Joe Groff. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-07-06 17:59:35 -04:00
										 |  |  | USING: alien alien.c-types alien.parser alien.strings arrays | 
					
						
							|  |  |  | assocs combinators compiler hashtables kernel lexer libc | 
					
						
							|  |  |  | locals.parser locals.types math namespaces parser sequences | 
					
						
							|  |  |  | words cocoa.messages cocoa.runtime locals compiler.units | 
					
						
							|  |  |  | io.encodings.utf8 continuations make fry effects stack-checker | 
					
						
							|  |  |  | stack-checker.errors ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: cocoa.subclassing | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-08 10:28:02 -04:00
										 |  |  | : init-method ( method -- sel imp types )
 | 
					
						
							|  |  |  |     first3 swap
 | 
					
						
							| 
									
										
										
										
											2009-03-17 03:19:50 -04:00
										 |  |  |     [ sel_registerName ] [ execute( -- xt ) ] [ utf8 string>alien ] | 
					
						
							| 
									
										
										
										
											2008-09-12 23:18:47 -04:00
										 |  |  |     tri* ;
 | 
					
						
							| 
									
										
										
										
											2008-09-12 23:01:07 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-04 22:22:48 -05:00
										 |  |  | : throw-if-false ( obj what -- )
 | 
					
						
							|  |  |  |     swap { f 0 } member?
 | 
					
						
							|  |  |  |     [ "Failed to " prepend throw ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : add-method ( class sel imp types -- )
 | 
					
						
							|  |  |  |     class_addMethod "add method to class" throw-if-false ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-08 10:28:02 -04:00
										 |  |  | : add-methods ( methods class -- )
 | 
					
						
							| 
									
										
										
										
											2008-12-04 22:22:48 -05:00
										 |  |  |     '[ [ _ ] dip init-method add-method ] each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : add-protocol ( class protocol -- )
 | 
					
						
							|  |  |  |     class_addProtocol "add protocol to class" throw-if-false ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-08 10:28:02 -04:00
										 |  |  | : add-protocols ( protocols class -- )
 | 
					
						
							| 
									
										
										
										
											2008-12-04 22:22:48 -05:00
										 |  |  |     '[ [ _ ] dip objc-protocol add-protocol ] each ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-06 19:02:52 -04:00
										 |  |  | : (define-objc-class) ( methods protocols superclass name -- )
 | 
					
						
							| 
									
										
										
										
											2008-09-08 10:28:02 -04:00
										 |  |  |     [ objc-class ] dip 0 objc_allocateClassPair | 
					
						
							| 
									
										
										
										
											2008-12-04 22:22:48 -05:00
										 |  |  |     [ add-protocols ] [ add-methods ] [ objc_registerClassPair ] | 
					
						
							| 
									
										
										
										
											2008-09-08 10:28:02 -04:00
										 |  |  |     tri ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-21 20:47:17 -05:00
										 |  |  | : encode-type ( type -- encoded )
 | 
					
						
							|  |  |  |     dup alien>objc-types get at [ ] [ no-objc-type ] ?if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : encode-types ( return types -- encoding )
 | 
					
						
							| 
									
										
										
										
											2009-01-21 20:47:17 -05:00
										 |  |  |     swap prefix [ encode-type "0" append ] map concat ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : prepare-method ( ret types quot -- type imp )
 | 
					
						
							| 
									
										
										
										
											2009-02-23 21:27:05 -05:00
										 |  |  |     [ [ encode-types ] 2keep ] dip
 | 
					
						
							| 
									
										
										
										
											2010-03-31 22:20:35 -04:00
										 |  |  |     '[ _ _ cdecl _ alien-callback ] | 
					
						
							| 
									
										
										
										
											2011-10-18 16:18:42 -04:00
										 |  |  |     ( -- callback ) define-temp ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : prepare-methods ( methods -- methods )
 | 
					
						
							| 
									
										
										
										
											2008-01-09 01:36:11 -05:00
										 |  |  |     [ | 
					
						
							|  |  |  |         [ first4 prepare-method 3array ] map
 | 
					
						
							| 
									
										
										
										
											2011-08-29 01:56:58 -04:00
										 |  |  |     ] with-nested-compilation-unit ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-04 22:22:48 -05:00
										 |  |  | :: (redefine-objc-method) ( class method -- )
 | 
					
						
							| 
									
										
										
										
											2010-07-06 17:59:35 -04:00
										 |  |  |     method init-method :> ( sel imp types )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class sel class_getInstanceMethod [ | 
					
						
							|  |  |  |         imp method_setImplementation drop
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         class sel imp types add-method | 
					
						
							|  |  |  |     ] if* ;
 | 
					
						
							| 
									
										
										
										
											2012-07-19 12:50:09 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-06 19:02:52 -04:00
										 |  |  | : redefine-objc-methods ( methods name -- )
 | 
					
						
							| 
									
										
										
										
											2008-09-09 01:53:22 -04:00
										 |  |  |     dup class-exists? [ | 
					
						
							| 
									
										
										
										
											2008-12-04 22:22:48 -05:00
										 |  |  |         objc_getClass '[ [ _ ] dip (redefine-objc-method) ] each
 | 
					
						
							|  |  |  |     ] [ 2drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-06 19:02:52 -04:00
										 |  |  | :: define-objc-class ( name superclass protocols methods -- )
 | 
					
						
							|  |  |  |     methods prepare-methods :> methods | 
					
						
							|  |  |  |     name "cocoa.classes" create drop
 | 
					
						
							|  |  |  |     methods name redefine-objc-methods | 
					
						
							|  |  |  |     name [ methods protocols superclass name (define-objc-class) ] import-objc-class ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-21 02:27:50 -04:00
										 |  |  | SYNTAX: CLASS: | 
					
						
							| 
									
										
										
										
											2010-07-06 19:02:52 -04:00
										 |  |  |     scan-token | 
					
						
							|  |  |  |     "<" expect | 
					
						
							|  |  |  |     scan-token | 
					
						
							|  |  |  |     "[" parse-tokens | 
					
						
							|  |  |  |     \ ] parse-until define-objc-class ;
 | 
					
						
							| 
									
										
										
										
											2010-07-06 17:59:35 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : (parse-selector) ( -- )
 | 
					
						
							|  |  |  |     scan-token { | 
					
						
							|  |  |  |         { [ dup "[" = ] [ drop ] } | 
					
						
							|  |  |  |         { [ dup ":" tail? ] [ scan-c-type scan-token 3array , (parse-selector) ] } | 
					
						
							|  |  |  |         [ f f 3array , "[" expect ] | 
					
						
							|  |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-selector ( -- selector types names )
 | 
					
						
							|  |  |  |     [ (parse-selector) ] { } make | 
					
						
							|  |  |  |     flip first3
 | 
					
						
							|  |  |  |     [ concat ] | 
					
						
							|  |  |  |     [ sift { id SEL } prepend ] | 
					
						
							|  |  |  |     [ sift { "self" "selector" } prepend ] tri* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-method-body ( names -- quot )
 | 
					
						
							| 
									
										
										
										
											2012-07-19 12:50:09 -04:00
										 |  |  |     [ [ make-local ] map ] H{ } make | 
					
						
							| 
									
										
										
										
											2010-07-06 17:59:35 -04:00
										 |  |  |     (parse-lambda) <lambda> ?rewrite-closures first ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYNTAX: METHOD: | 
					
						
							|  |  |  |     scan-c-type | 
					
						
							|  |  |  |     parse-selector | 
					
						
							|  |  |  |     parse-method-body [ swap ] 2dip 4array
 | 
					
						
							|  |  |  |     suffix! ;
 |