]> gitweb.factorcode.org Git - factor.git/blob - extra/alien/marshall/private/private.factor
70b03e2bab061ddbb2202210a84c72313fa41457
[factor.git] / extra / alien / marshall / private / private.factor
1 ! Copyright (C) 2009 Jeremy Hughes.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors alien alien.c-types alien.inline arrays
4 combinators fry functors kernel lexer libc macros math
5 sequences specialized-arrays.alien libc.private
6 combinators.short-circuit ;
7 IN: alien.marshall.private
8
9 : bool>arg ( ? -- 1/0/obj )
10     {
11         { t [ 1 ] }
12         { f [ 0 ] }
13         [ ]
14     } case ;
15
16 MACRO: marshall-x* ( num-quot seq-quot -- alien )
17     '[ bool>arg dup number? _ _ if ] ;
18
19 : ptr-pass-through ( obj quot -- alien )
20     over { [ c-ptr? ] [ ] } 1&& [ drop ] [ call ] if ; inline
21
22 : malloc-underlying ( obj -- alien )
23     underlying>> malloc-byte-array ;
24
25 FUNCTOR: define-primitive-marshallers ( TYPE -- )
26 <TYPE> IS <${TYPE}>
27 *TYPE IS *${TYPE}
28 >TYPE-array IS >${TYPE}-array
29 marshall-TYPE DEFINES marshall-${TYPE}
30 (marshall-TYPE*) DEFINES (marshall-${TYPE}*)
31 (marshall-TYPE**) DEFINES (marshall-${TYPE}**)
32 marshall-TYPE* DEFINES marshall-${TYPE}*
33 marshall-TYPE** DEFINES marshall-${TYPE}**
34 marshall-TYPE*-free DEFINES marshall-${TYPE}*-free
35 marshall-TYPE**-free DEFINES marshall-${TYPE}**-free
36 unmarshall-TYPE* DEFINES unmarshall-${TYPE}*
37 unmarshall-TYPE*-free DEFINES unmarshall-${TYPE}*-free
38 WHERE
39 <PRIVATE
40 : (marshall-TYPE*) ( n/seq -- alien )
41     [ <TYPE> malloc-byte-array ]
42     [ >TYPE-array malloc-underlying ]
43     marshall-x* ;
44 PRIVATE>
45 : marshall-TYPE* ( n/seq -- alien )
46     [ (marshall-TYPE*) ] ptr-pass-through ;
47 <PRIVATE
48 : (marshall-TYPE**) ( seq -- alien )
49     [ marshall-TYPE* ] void*-array{ } map-as malloc-underlying ;
50 PRIVATE>
51 : marshall-TYPE** ( seq -- alien )
52     [ (marshall-TYPE**) ] ptr-pass-through ;
53 : unmarshall-TYPE* ( alien -- n )
54     *TYPE ; inline
55 : unmarshall-TYPE*-free ( alien -- n )
56     [ unmarshall-TYPE* ] keep add-malloc free ;
57 ;FUNCTOR
58
59 SYNTAX: PRIMITIVE-MARSHALLERS:
60 ";" parse-tokens [ define-primitive-marshallers ] each ;