Skip to content

Commit 0de0495

Browse files
committed
Adding boolean support
1 parent c67d0f1 commit 0de0495

File tree

8 files changed

+76
-27
lines changed

8 files changed

+76
-27
lines changed

src/pffi.sls

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
int32_t uint32_t
5151
int64_t uint64_t
5252
pointer callback
53-
void
53+
void boolean
5454
___
5555

5656
size-of-unsigned-char
@@ -64,6 +64,7 @@
6464
size-of-float
6565
size-of-double
6666
size-of-pointer
67+
size-of-boolean
6768
size-of-int8_t
6869
size-of-int16_t
6970
size-of-int32_t

src/pffi/compat.chezscheme.sls

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
int32_t uint32_t
5353
int64_t uint64_t
5454
pointer callback
55-
void
55+
void boolean
5656
___
5757

5858
;; pointer ref
@@ -105,6 +105,7 @@
105105
size-of-float
106106
size-of-double
107107
size-of-pointer
108+
size-of-boolean
108109
(rename (size-of-int8 size-of-int8_t)
109110
(size-of-int16 size-of-int16_t)
110111
(size-of-int32 size-of-int32_t)
@@ -222,6 +223,7 @@
222223
(define-type-alias double double)
223224
(define-type-alias float float)
224225
(define-type-alias pointer void*)
226+
(define-type-alias boolean boolean)
225227

226228
(define (open-shared-object path)
227229
(load-shared-object path)
@@ -390,6 +392,8 @@
390392
(define-deref uint64)
391393
(define-deref pointer make-integer-pointer pointer->integer)
392394

395+
(define size-of-boolean (ftype-sizeof boolean))
396+
393397
;; Unlock objects that are referenced by the pool.
394398
(define (cleanup-bytevector-locks!)
395399
(do ((x (garbage-pool) (garbage-pool)))

src/pffi/compat.guile.sls

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
int32_t uint32_t
5353
int64_t uint64_t
5454
pointer callback
55-
void
55+
void boolean
5656
___
5757

5858
;; pointer ref
@@ -105,6 +105,7 @@
105105
size-of-float
106106
size-of-double
107107
size-of-pointer
108+
size-of-boolean
108109
size-of-int8_t
109110
size-of-int16_t
110111
size-of-int32_t
@@ -158,6 +159,7 @@
158159
(define-ftype int64_t int64)
159160
(define-ftype uint64_t uint64)
160161
(define-ftype pointer '*)
162+
(define-ftype boolean int8) ;; use int8 to make the size = 1
161163
(define ___ '___) ;; dummy
162164

163165
(define (open-shared-object path)
@@ -175,21 +177,23 @@
175177
(cond ((ffi-type-descriptor? type) (ffi-type-descriptor-alias type))
176178
(else type)))
177179

178-
(define (make-c-function lib conv ffi:ret name ffi:arg-types)
179-
(define arg-types (map ->native-type ffi:arg-types))
180+
(define (make-c-function lib conv ffi:ret name arg-types)
180181
(define ret (->native-type ffi:ret))
181182
(define (s->p s) (b->p (string->utf8 (string-append s "\x0;"))))
182183
(define (b->p bv) (bytevector->pointer bv))
183184
(define ptr (lookup-shared-object lib (symbol->string name)))
184185
(define (convert-arg type arg)
185-
(case type
186-
((*)
187-
(cond ((string? arg) (s->p arg))
188-
((bytevector? arg) (b->p arg))
189-
;; Let Guile complain, if not the proper
190-
;; one
191-
(else arg)))
192-
(else arg)))
186+
(cond ((eq? type pointer)
187+
(cond ((string? arg) (s->p arg))
188+
((bytevector? arg) (b->p arg))
189+
;; Let Guile complain, if not the proper
190+
;; one
191+
(else arg)))
192+
((eq? type boolean)
193+
(unless (boolean? arg)
194+
(assertion-violation name "Boolean is required" arg))
195+
(if arg 1 0))
196+
(else arg)))
193197
(define (arg->type arg)
194198
;; it's a bit awkward but no other way
195199
(cond ((number? arg)
@@ -203,27 +207,31 @@
203207
((real? arg) double)
204208
(else (assertion-violation name "Unsuported number" arg))))
205209
((or (string? arg) (bytevector? arg) (pointer? arg)) pointer)
210+
((boolean? arg) boolean)
206211
(else (assertion-violation name "Unsuported type" arg))))
207-
212+
(define (convert-ret type r)
213+
(cond ((eq? type boolean) (eqv? r 1))
214+
(else r)))
208215
(cond ((memq ___ arg-types) =>
209216
(lambda (l)
210217
(unless (null? (cdr l))
211-
(assertion-violation
212-
'make-c-function
213-
"___ must be the last of argument type"
214-
arg-types))
218+
(assertion-violation 'make-c-function
219+
"___ must be the last of argument type" arg-types))
215220
(let ((required-args (remove (lambda (e) (eq? ___ e)) arg-types)))
216221
(lambda args*
217222
(let-values (((required rest)
218223
(split-at args* (- (length required-args) 1))))
219224
(let* ((real-arg-types (append (drop-right arg-types 1)
220225
(map arg->type rest)))
221-
(fp (pointer->procedure ret ptr real-arg-types)))
222-
(apply fp (map convert-arg real-arg-types args*))))))))
226+
(fp (pointer->procedure ret ptr
227+
(map ->native-type real-arg-types))))
228+
(convert-ret ffi:ret
229+
(apply fp (map convert-arg real-arg-types args*)))))))))
223230
(else
224-
(let ((fp (pointer->procedure ret ptr arg-types)))
231+
(let ((fp (pointer->procedure ret ptr (map ->native-type arg-types))))
225232
(lambda args*
226-
(apply fp (map convert-arg arg-types args*)))))))
233+
(convert-ret ffi:ret
234+
(apply fp (map convert-arg arg-types args*))))))))
227235

228236
(define (make-c-callback ret args proc)
229237
(procedure->pointer (->native-type ret) proc (map ->native-type args)))
@@ -326,6 +334,7 @@
326334
(define-sizeof int16_t)
327335
(define-sizeof int32_t)
328336
(define-sizeof int64_t)
337+
(define-sizeof boolean)
329338
;; for define-deref
330339
(define size-of-unsigned-char size-of-char)
331340
(define size-of-unsigned-short size-of-short)

src/pffi/compat.mzscheme.sls

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
int32_t uint32_t
5454
int64_t uint64_t
5555
pointer callback
56-
void
56+
void boolean
5757
___
5858

5959
;; pointer ref
@@ -105,6 +105,7 @@
105105
size-of-float
106106
size-of-double
107107
size-of-pointer
108+
size-of-boolean
108109
size-of-int8_t
109110
size-of-int16_t
110111
size-of-int32_t
@@ -152,6 +153,7 @@
152153
(define-ftype int64_t _int64)
153154
(define-ftype uint64_t _uint64)
154155
(define-ftype pointer _pointer)
156+
(define-ftype boolean _stdbool)
155157
(define ___ '___)
156158

157159
;; for convenience
@@ -372,6 +374,7 @@
372374
(define-sizeof int)
373375
(define-sizeof long)
374376
(define-sizeof pointer)
377+
(define-sizeof boolean)
375378
(define-sizeof float)
376379
(define-sizeof double)
377380
(define-sizeof int8_t)

src/pffi/compat.sagittarius.sls

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
int32_t uint32_t
5353
int64_t uint64_t
5454
pointer callback
55-
void
55+
void boolean
5656
___
5757

5858
;; pointer ref
@@ -113,7 +113,8 @@
113113
size-of-long
114114
size-of-float
115115
size-of-double
116-
(rename (size-of-void* size-of-pointer))
116+
(rename (size-of-void* size-of-pointer)
117+
(size-of-bool size-of-boolean))
117118
size-of-int8_t
118119
size-of-int16_t
119120
size-of-int32_t
@@ -199,5 +200,6 @@
199200
(define-ftype int64_t)
200201
(define-ftype uint64_t size-of-int64_t)
201202
(define pointer (make-ffi-type-descriptor 'pointer void* size-of-void*))
203+
(define boolean (make-ffi-type-descriptor 'boolean bool size-of-bool))
202204

203205
)

src/pffi/procedure.sls

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
int32_t uint32_t
5050
int64_t uint64_t
5151
pointer callback
52-
void
52+
void boolean
5353
___
5454

5555
size-of-char
@@ -59,6 +59,7 @@
5959
size-of-float
6060
size-of-double
6161
size-of-pointer
62+
size-of-boolean
6263
size-of-int8_t
6364
size-of-int16_t
6465
size-of-int32_t

tests/functions.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,21 @@ void free_st_values(struct st2 *st)
101101
free(st->p.elements);
102102
}
103103

104+
/* for boolean test */
105+
int is_even(int n) {
106+
return n % 2 == 0;
107+
}
108+
109+
int is_odd(int n) {
110+
return n % 2 != 0;
111+
}
112+
113+
int check_dispatch(int n, int check_even) {
114+
if (check_even) {
115+
return is_even(n);
116+
} else {
117+
return is_odd(n);
118+
}
119+
}
104120

105121
/* TODO more */

tests/test.scm

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,19 @@
340340
(fields (ppp p)))
341341
(test-assert "make-st-ppp" (make-st-ppp (integer->pointer 0)))
342342
(test-assert "make-un-ppp" (make-un-ppp (integer->pointer 0))))
343-
343+
344+
;; boolean type
345+
(let ((is-even? (foreign-procedure test-lib boolean is_even (int)))
346+
(check-dispatch
347+
(foreign-procedure test-lib boolean check_dispatch (int boolean))))
348+
;; (display size-of-boolean)
349+
;; We don't check the size of boolean here, as some use C99 bool
350+
;; and some, or Chez..., use just int
351+
(test-assert "size-of-boolean" size-of-boolean)
352+
(test-assert "is-even? (1)" (boolean? (is-even? 2)))
353+
(test-assert "is-even? (2)" (not (is-even? 1)))
354+
(test-assert "check-dispatch (1)" (check-dispatch 2 #t))
355+
(test-assert "check-dispatch (2)" (not (check-dispatch 2 #f))))
356+
344357

345358
(test-end)

0 commit comments

Comments
 (0)