Rebuild windows.com.wrapper objects on image init

db4
Joe Groff 2008-07-29 21:02:37 -07:00
parent bbc3c01a8b
commit b42cb5434e
1 changed files with 39 additions and 14 deletions

View File

@ -1,11 +1,11 @@
USING: alien alien.c-types windows.com.syntax USING: alien alien.c-types windows.com.syntax init
windows.com.syntax.private windows.com continuations kernel windows.com.syntax.private windows.com continuations kernel
namespaces windows.ole32 libc vocabs assocs accessors arrays namespaces windows.ole32 libc vocabs assocs accessors arrays
sequences quotations combinators math words compiler.units sequences quotations combinators math words compiler.units
destructors fry math.parser generalizations ; destructors fry math.parser generalizations sets ;
IN: windows.com.wrapper IN: windows.com.wrapper
TUPLE: com-wrapper vtbls disposed ; TUPLE: com-wrapper callbacks vtbls disposed ;
<PRIVATE <PRIVATE
@ -14,6 +14,11 @@ SYMBOL: +wrapped-objects+
[ H{ } +wrapped-objects+ set-global ] [ H{ } +wrapped-objects+ set-global ]
unless unless
SYMBOL: +live-wrappers+
+live-wrappers+ get-global
[ V{ } +live-wrappers+ set-global ]
unless
SYMBOL: +vtbl-counter+ SYMBOL: +vtbl-counter+
+vtbl-counter+ get-global +vtbl-counter+ get-global
[ 0 +vtbl-counter+ set-global ] [ 0 +vtbl-counter+ set-global ]
@ -82,13 +87,12 @@ unless
[ '[ , [ swap 2array ] curry map ] ] bi bi* [ '[ , [ swap 2array ] curry map ] ] bi bi*
swap append ; swap append ;
: compile-alien-callback ( word return parameters abi quot -- alien ) : compile-alien-callback ( word return parameters abi quot -- word )
'[ , , , , alien-callback ] '[ , , , , alien-callback ]
[ [ (( -- alien )) define-declared ] pick slip ] [ [ (( -- alien )) define-declared ] pick slip ]
with-compilation-unit with-compilation-unit ;
execute ;
: (byte-array-to-malloced-buffer) ( byte-array -- alien ) : byte-array>malloc ( byte-array -- alien )
[ byte-length malloc ] [ over byte-array>memory ] bi ; [ byte-length malloc ] [ over byte-array>memory ] bi ;
: (callback-word) ( function-name interface-name counter -- word ) : (callback-word) ( function-name interface-name counter -- word )
@ -99,7 +103,7 @@ unless
[ dup empty? [ 2drop [ ] ] [ swap 1- '[ , , ndip ] ] if ] [ dup empty? [ 2drop [ ] ] [ swap 1- '[ , , ndip ] ] if ]
dip compose ; dip compose ;
: (make-vtbl) ( interface-name quots iunknown-methods n -- vtbl ) : (make-interface-callbacks) ( interface-name quots iunknown-methods n -- words )
(thunk) (thunked-quots) (thunk) (thunked-quots)
swap [ find-com-interface-definition family-tree-functions ] swap [ find-com-interface-definition family-tree-functions ]
keep (next-vtbl-counter) '[ keep (next-vtbl-counter) '[
@ -114,12 +118,12 @@ unless
first2 (finish-thunk) first2 (finish-thunk)
] bi* ] bi*
"stdcall" swap compile-alien-callback "stdcall" swap compile-alien-callback
] 2map >c-void*-array ] 2map ;
(byte-array-to-malloced-buffer) ;
: (make-vtbls) ( implementations -- vtbls ) : (make-callbacks) ( implementations -- sequence )
dup [ first ] map (make-iunknown-methods) dup [ first ] map (make-iunknown-methods)
[ >r >r first2 r> r> swap (make-vtbl) ] curry map-index ; [ >r >r first2 r> r> swap (make-interface-callbacks) ]
curry map-index ;
: (malloc-wrapped-object) ( wrapper -- wrapped-object ) : (malloc-wrapped-object) ( wrapper -- wrapped-object )
vtbls>> length "void*" heap-size * vtbls>> length "void*" heap-size *
@ -127,13 +131,34 @@ unless
over <displaced-alien> over <displaced-alien>
1 0 rot set-ulong-nth ; 1 0 rot set-ulong-nth ;
: (callbacks>vtbl) ( callbacks -- vtbl )
[ execute ] map >c-void*-array byte-array>malloc ;
: (callbacks>vtbls) ( callbacks -- vtbls )
[ (callbacks>vtbl) ] map ;
: (allocate-wrapper) ( wrapper -- )
dup callbacks>> (callbacks>vtbls) >>vtbls
f >>disposed drop ;
: (init-hook) ( -- )
+live-wrappers+ get-global [ (allocate-wrapper) ] each
H{ } +wrapped-objects+ set-global ;
[ (init-hook) ] "windows.com.wrapper" add-init-hook
PRIVATE> PRIVATE>
: allocate-wrapper ( wrapper -- )
[ (allocate-wrapper) ]
[ +live-wrappers+ get adjoin ] bi ;
: <com-wrapper> ( implementations -- wrapper ) : <com-wrapper> ( implementations -- wrapper )
(make-vtbls) f com-wrapper boa ; (make-callbacks) f f com-wrapper boa
dup allocate-wrapper ;
M: com-wrapper dispose* M: com-wrapper dispose*
vtbls>> [ free ] each ; [ [ free ] each f ] change-vtbls
+live-wrappers+ get-global delete ;
: com-wrap ( object wrapper -- wrapped-object ) : com-wrap ( object wrapper -- wrapped-object )
[ vtbls>> ] [ (malloc-wrapped-object) ] bi [ vtbls>> ] [ (malloc-wrapped-object) ] bi