fixed a bug in converting out parameters in the ypsilon-compat
layer. Thanks to Ed Cavazos for the patch.
This commit is contained in:
		
							parent
							
								
									b97cbf1688
								
							
						
					
					
						commit
						230b5186d6
					
				|  | @ -198,6 +198,20 @@ | |||
|          (syntax-violation 'c-function "invalid argument type" | ||||
|                            #'form #'arg-type)]))) | ||||
| 
 | ||||
|   (define (convert-out-byte* who s-val c-val) | ||||
|     (let ((n (bytevector-length s-val))) | ||||
|       (let loop ([i 0]) | ||||
|         (unless (= i n) | ||||
|           (bytevector-u8-set! s-val i (pointer-ref-c-unsigned-char c-val i)) | ||||
|           (loop (+ i 1)))))) | ||||
| 
 | ||||
|   (define-syntax convert-out-arg | ||||
|     (lambda (x) | ||||
|       (syntax-case x (int char* byte* c-callback float double void*) | ||||
|         ((_ form foreign-name s-val c-val byte*) | ||||
|          #'(convert-out-byte* 'foreign-name s-val c-val)) | ||||
|         ((_ form foreign-name s-val c-val arg-ype) | ||||
|          #'(void))))) | ||||
| 
 | ||||
|   (define (char*->string who x) | ||||
|     (define (strlen x) | ||||
|  | @ -223,7 +237,6 @@ | |||
|         [(_ form foreign-name val other)  | ||||
|          #'val]))) | ||||
| 
 | ||||
| 
 | ||||
|   (define-syntax convert-type | ||||
|     (lambda (x) | ||||
|       (define ls | ||||
|  | @ -262,21 +275,23 @@ | |||
|         (format "cannot find object ~a in library ~a"  | ||||
|                 name (library-name lib))))) | ||||
| 
 | ||||
| 
 | ||||
|   (define-syntax c-function | ||||
|     (lambda (x) | ||||
|       (syntax-case x () | ||||
|         [(_ lib lib-name return-type conv foreign-name (arg-type* ...)) | ||||
|          (with-syntax ([x x] | ||||
|                        [(t* ...) (generate-temporaries #'(arg-type* ...))]) | ||||
|                        [(t* ...) (generate-temporaries #'(arg-type* ...))] | ||||
|                        [(u* ...) (generate-temporaries #'(arg-type* ...))]) | ||||
|          #'(let ([callout  | ||||
|                    ((make-c-callout  | ||||
|                       (convert-type return-type) | ||||
|                       (list (convert-type arg-type*) ...)) | ||||
|                     (lookup-shared-object lib 'foreign-name))]) | ||||
|              (lambda (t* ...) | ||||
|                (let ([t* (convert-arg x foreign-name t* arg-type*)] ...) | ||||
|                  (let ([v (callout t* ...)]) | ||||
|                (let ([u* (convert-arg x foreign-name t* arg-type*)] ...) | ||||
|                  (let ([v (callout u* ...)]) | ||||
|                    (convert-out-arg x foreign-name t* u* arg-type*) | ||||
|                    ... | ||||
|                    (convert-return x foreign-name v return-type))))))]))) | ||||
| 
 | ||||
|   (define-syntax c-argument | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 1748 | ||||
| 1749 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum