]> gitweb.factorcode.org Git - factor.git/blob - basis/alien/data/data.factor
ab5824bfd2cce71ff2f24c06e46c162a1621abbb
[factor.git] / basis / alien / data / data.factor
1 ! (c)2009, 2010 Slava Pestov, Joe Groff bsd license
2 USING: accessors alien alien.c-types alien.arrays alien.strings
3 arrays byte-arrays cpu.architecture fry io io.encodings.binary
4 io.files io.streams.memory kernel libc math math.functions 
5 sequences words macros combinators generalizations
6 stack-checker.dependencies combinators.short-circuit ;
7 QUALIFIED: math
8 IN: alien.data
9
10 GENERIC: require-c-array ( c-type -- )
11
12 M: array require-c-array first require-c-array ;
13
14 GENERIC: c-array-constructor ( c-type -- word ) foldable
15
16 GENERIC: c-(array)-constructor ( c-type -- word ) foldable
17
18 GENERIC: c-direct-array-constructor ( c-type -- word ) foldable
19
20 GENERIC: <c-array> ( len c-type -- array )
21
22 M: word <c-array>
23     c-array-constructor execute( len -- array ) ; inline
24
25 GENERIC: (c-array) ( len c-type -- array )
26
27 M: word (c-array)
28     c-(array)-constructor execute( len -- array ) ; inline
29
30 GENERIC: <c-direct-array> ( alien len c-type -- array )
31
32 M: word <c-direct-array>
33     c-direct-array-constructor execute( alien len -- array ) ; inline
34
35 : malloc-array ( n type -- array )
36     [ heap-size calloc ] [ <c-direct-array> ] 2bi ; inline
37
38 : (malloc-array) ( n type -- alien )
39     [ heap-size * malloc ] [ <c-direct-array> ] 2bi ; inline
40
41 : <c-object> ( type -- array )
42     heap-size <byte-array> ; inline
43
44 : (c-object) ( type -- array )
45     heap-size (byte-array) ; inline
46
47 : malloc-object ( type -- alien )
48     1 swap heap-size calloc ; inline
49
50 : (malloc-object) ( type -- alien )
51     heap-size malloc ; inline
52
53 : malloc-byte-array ( byte-array -- alien )
54     binary-object [ nip malloc dup ] 2keep memcpy ;
55
56 : memory>byte-array ( alien len -- byte-array )
57     [ nip (byte-array) dup ] 2keep memcpy ;
58
59 : malloc-string ( string encoding -- alien )
60     string>alien malloc-byte-array ;
61
62 M: memory-stream stream-read
63     [
64         [ index>> ] [ alien>> ] bi <displaced-alien>
65         swap memory>byte-array
66     ] [ [ + ] change-index drop ] 2bi ;
67
68 M: value-type c-type-rep drop int-rep ;
69
70 M: value-type c-type-getter
71     drop [ swap <displaced-alien> ] ;
72
73 M: value-type c-type-setter ( type -- quot )
74     [ c-type-getter ] [ heap-size ] bi '[ @ swap _ memcpy ] ;
75
76 M: array c-type-boxer-quot
77     unclip [ array-length ] dip [ <c-direct-array> ] 2curry ;
78
79 M: array c-type-unboxer-quot drop [ >c-ptr ] ;
80
81 ERROR: local-allocation-error ;
82
83 <PRIVATE
84
85 : (local-allot) ( size align -- alien ) local-allocation-error ;
86
87 : (cleanup-allot) ( -- )
88     ! Inhibit TCO in order for the last word in the quotation
89     ! to still be abl to access scope-allocated data.
90     ;
91
92 MACRO: (simple-local-allot) ( c-type -- quot )
93     [ depends-on-c-type ]
94     [ dup '[ _ heap-size _ c-type-align (local-allot) ] ] bi ;
95
96 : [hairy-local-allot] ( c-type initial -- quot )
97     over '[ _ (simple-local-allot) _ over 0 _ set-alien-value ] ;
98
99 : hairy-local-allot? ( obj -- ? )
100     {
101         [ array? ]
102         [ length 3 = ]
103         [ second initial: eq? ]
104     } 1&& ;
105
106 MACRO: (hairy-local-allot) ( obj -- quot )
107     dup hairy-local-allot?
108     [ first3 nip [hairy-local-allot] ]
109     [ '[ _ (simple-local-allot) ] ]
110     if ;
111
112 MACRO: (local-allots) ( c-types -- quot )
113     [ '[ _ (hairy-local-allot) ] ] map [ ] join ;
114
115 MACRO: box-values ( c-types -- quot )
116     [ c-type-boxer-quot ] map '[ _ spread ] ;
117
118 MACRO: out-parameters ( c-types -- quot )
119     [ dup hairy-local-allot? [ first ] when ] map
120     [ length ] [ [ '[ 0 _ alien-value ] ] map ] bi
121     '[ _ nkeep _ spread ] ;
122
123 PRIVATE>
124
125 : with-scoped-allocation ( c-types quot -- )
126     [ [ (local-allots) ] [ box-values ] bi ] dip call
127     (cleanup-allot) ; inline
128
129 : with-out-parameters ( c-types quot finish -- values... )
130     [ [ drop (local-allots) ] [ swap out-parameters ] 2bi ] dip call
131     (cleanup-allot) ; inline
132
133 GENERIC: binary-zero? ( value -- ? )
134
135 M: object binary-zero? drop f ; inline
136 M: f binary-zero? drop t ; inline
137 M: integer binary-zero? zero? ; inline
138 M: math:float binary-zero? double>bits zero? ; inline
139 M: complex binary-zero? >rect [ binary-zero? ] both? ; inline
140