- changed foreign accessors and mutator names to have '-c-' in their
names as suggested by Ken Dickey.
This commit is contained in:
		
							parent
							
								
									811c94361b
								
							
						
					
					
						commit
						1be0f2af6e
					
				|  | @ -18,5 +18,8 @@ all: | |||
| 
 | ||||
| docs: ikarus-scheme-users-guide.pdf | ||||
| 
 | ||||
| fast: | ||||
| 	$(TEX) ikarus-scheme-users-guide | ||||
| 
 | ||||
| clean:  | ||||
| 	rm -f *.aux *.log *.toc *.out *.idx *.ind *.ilg *.blg *.bbl | ||||
|  |  | |||
|  | @ -352,6 +352,9 @@ all: | |||
| 
 | ||||
| docs: ikarus-scheme-users-guide.pdf | ||||
| 
 | ||||
| fast: | ||||
| 	$(TEX) ikarus-scheme-users-guide | ||||
| 
 | ||||
| clean:  | ||||
| 	rm -f *.aux *.log *.toc *.out *.idx *.ind *.ilg *.blg *.bbl | ||||
| # Tell versions [3.59,3.63) of GNU make to not export all variables.
 | ||||
|  |  | |||
										
											Binary file not shown.
										
									
								
							|  | @ -2242,10 +2242,10 @@ unspecified.} | |||
| 
 | ||||
| \newpage | ||||
| 
 | ||||
| \defun{pointer-set-char}{procedure} | ||||
| \texttt{(pointer-set-char p i n)} | ||||
| \defun{pointer-set-c-char!}{procedure} | ||||
| \texttt{(pointer-set-c-char! p i n)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-set-char} sets a single byte of memory | ||||
| The procedure \texttt{pointer-set-c-char!} sets a single byte of memory | ||||
| located at offset \texttt{i} from the pointer \texttt{p} to the | ||||
| value of \texttt{n}.  The pointer \texttt{p} must be a valid | ||||
| pointer.  The index \texttt{i} must be an exact integer.  The value | ||||
|  | @ -2253,186 +2253,186 @@ of \texttt{n} must be an exact integer.  Only the 8 lowermost | |||
| bits of \texttt{n} are used in the operation and the remaining bits | ||||
| are ignored. | ||||
| 
 | ||||
| \defun{pointer-set-short}{procedure} | ||||
| \texttt{(pointer-set-short p i n)} | ||||
| \defun{pointer-set-c-short!}{procedure} | ||||
| \texttt{(pointer-set-c-short! p i n)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-set-char} sets two bytes located at | ||||
| The procedure \texttt{pointer-set-c-char!!} sets two bytes located at | ||||
| offset \texttt{i} and \texttt{(+ i 1)} to the 16 lowermost bits of | ||||
| the exact integer \texttt{n}.  Note that the offset \texttt{i} is a | ||||
| byte offset; \texttt{pointer-set-short} does not perform any pointer | ||||
| byte offset; \texttt{pointer-set-c-short!} does not perform any pointer | ||||
| arithmetic such as scaling the offset by the size of the memory | ||||
| location. | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-set-int}{procedure} | ||||
| \texttt{(pointer-set-int p i n)} | ||||
| \defun{pointer-set-c-int!}{procedure} | ||||
| \texttt{(pointer-set-c-int! p i n)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-set-int} sets four bytes located at | ||||
| The procedure \texttt{pointer-set-c-int!} sets four bytes located at | ||||
| offset \texttt{i} to \texttt{(+ i 3)} to the 32 lowermost bits of | ||||
| the exact integer \texttt{n}.  Like \texttt{pointer-set-short}, | ||||
| \texttt{pointer-set-int} does not scale the offset \texttt{i}. | ||||
| the exact integer \texttt{n}.  Like \texttt{pointer-set-c-short!}, | ||||
| \texttt{pointer-set-c-int!} does not scale the offset \texttt{i}. | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-set-long}{procedure} | ||||
| \texttt{(pointer-set-long p i n)} | ||||
| \defun{pointer-set-c-long!}{procedure} | ||||
| \texttt{(pointer-set-c-long! p i n)} | ||||
|   | ||||
| On 64-bit systems, the procedure \texttt{pointer-set-long} sets | ||||
| On 64-bit systems, the procedure \texttt{pointer-set-c-long!} sets | ||||
| eight bytes located at offset \texttt{i} to \texttt{(+ i 7)} to the | ||||
| 64 lowermost bits of the exact integer \texttt{n}.  Like the | ||||
| previous procedures, \texttt{pointer-set-long} does not scale the | ||||
| offset \texttt{i}.  On 32-bit systems, \texttt{pointer-set-long} | ||||
| performs the same task as \texttt{pointer-set-int}. | ||||
| previous procedures, \texttt{pointer-set-c-long!} does not scale the | ||||
| offset \texttt{i}.  On 32-bit systems, \texttt{pointer-set-c-long!} | ||||
| performs the same task as \texttt{pointer-set-c-int!}. | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-set-float}{procedure} | ||||
| \texttt{(pointer-set-float p i fl)} | ||||
| \defun{pointer-set-c-float!}{procedure} | ||||
| \texttt{(pointer-set-c-float! p i fl)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-set-float} converts the Scheme | ||||
| The procedure \texttt{pointer-set-c-float!} converts the Scheme | ||||
| floating point number \texttt{fl} (represented in Ikarus as an | ||||
| IEEE-754 double precision floating point number) to a float (an | ||||
| IEEE-754 single precision floating point number) and stores the | ||||
| result in the four bytes at offset \texttt{i} of the pointer | ||||
| \texttt{p}. | ||||
| 
 | ||||
| \defun{pointer-set-double}{procedure} | ||||
| \texttt{(pointer-set-double p i fl)} | ||||
| \defun{pointer-set-c-double!}{procedure} | ||||
| \texttt{(pointer-set-c-double! p i fl)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-set-double} stores the double | ||||
| The procedure \texttt{pointer-set-c-double!} stores the double | ||||
| precision IEEE-754 floating point value of the Scheme flonum | ||||
| \texttt{fl} in the eight bytes at offset \texttt{i} of the pointer | ||||
| \texttt{p}. | ||||
| 
 | ||||
| \defun{pointer-set-pointer}{procedure} | ||||
| \texttt{(pointer-set-pointer p i pv)} | ||||
| \defun{pointer-set-c-pointer!}{procedure} | ||||
| \texttt{(pointer-set-c-pointer! p i pv)} | ||||
|   | ||||
| On 64-bit systems, the procedure \texttt{pointer-set-pointer} sets | ||||
| On 64-bit systems, the procedure \texttt{pointer-set-c-pointer!} sets | ||||
| eight bytes located at offset \texttt{i} to \texttt{(+ i 7)} to the | ||||
| 64-bit pointer value of \texttt{pv}.  On 32-bit systems, the | ||||
| procedure \texttt{pointer-set-pointer} sets four bytes located at | ||||
| procedure \texttt{pointer-set-c-pointer!} sets four bytes located at | ||||
| offset \texttt{i} to \texttt{(+ i 3)} to the 32-bit pointer value of | ||||
| \texttt{pv}.  Like the previous procedures, | ||||
| \texttt{pointer-set-pointer} does not scale the offset \texttt{i}.  | ||||
| \texttt{pointer-set-c-pointer!} does not scale the offset \texttt{i}.  | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-ref-signed-char}{procedure} | ||||
| \texttt{(pointer-ref-signed-char p i)} | ||||
| \defun{pointer-ref-c-signed-char}{procedure} | ||||
| \texttt{(pointer-ref-c-signed-char p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-signed-char} loads a single byte located | ||||
| The procedure \texttt{pointer-ref-c-signed-char} loads a single byte located | ||||
| at offset \texttt{i} from the pointer \texttt{p} and returns an | ||||
| exact integer representing the sign-extended integer value of that | ||||
| byte. The resulting value is in the range of $[-128, 127]$ inclusive. | ||||
| 
 | ||||
| \defun{pointer-ref-unsigned-char}{procedure} | ||||
| \texttt{(pointer-ref-unsigned-char p i)} | ||||
| \defun{pointer-ref-c-unsigned-char}{procedure} | ||||
| \texttt{(pointer-ref-c-unsigned-char p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-unsigned-char} loads a single byte | ||||
| The procedure \texttt{pointer-ref-c-unsigned-char} loads a single byte | ||||
| located at offset \texttt{i} from the pointer \texttt{p} and returns | ||||
| an exact integer representing the unsigned integer value of that | ||||
| byte.  The resulting value is in the range $[0, 255]$ inclusive. | ||||
| 
 | ||||
| 
 | ||||
| The following example shows the difference between | ||||
| \texttt{pointer-ref-signed-char} and | ||||
| \texttt{pointer-ref-unsigned-char}. | ||||
| \texttt{pointer-ref-c-signed-char} and | ||||
| \texttt{pointer-ref-c-unsigned-char}. | ||||
| 
 | ||||
| 
 | ||||
| \begin{verbatim} | ||||
|    > (let ([p (malloc 3)]) | ||||
|        (pointer-set-char p 0 #b01111111) | ||||
|        (pointer-set-char p 1 #b10000000) | ||||
|        (pointer-set-char p 2 #b11111111) | ||||
|        (pointer-set-c-char! p 0 #b01111111) | ||||
|        (pointer-set-c-char! p 1 #b10000000) | ||||
|        (pointer-set-c-char! p 2 #b11111111) | ||||
|        (let ([result | ||||
|               (list (pointer-ref-signed-char p 0) | ||||
|                     (pointer-ref-signed-char p 1) | ||||
|                     (pointer-ref-signed-char p 2) | ||||
|                     (pointer-ref-unsigned-char p 0) | ||||
|                     (pointer-ref-unsigned-char p 1) | ||||
|                     (pointer-ref-unsigned-char p 2))]) | ||||
|               (list (pointer-ref-c-signed-char p 0) | ||||
|                     (pointer-ref-c-signed-char p 1) | ||||
|                     (pointer-ref-c-signed-char p 2) | ||||
|                     (pointer-ref-c-unsigned-char p 0) | ||||
|                     (pointer-ref-c-unsigned-char p 1) | ||||
|                     (pointer-ref-c-unsigned-char p 2))]) | ||||
|          (free p) | ||||
|          result)) | ||||
|    (127 -128 -1 127 128 255) | ||||
| \end{verbatim} | ||||
| 
 | ||||
| \defun{pointer-ref-signed-short}{procedure} | ||||
| \texttt{(pointer-ref-signed-short p i)} | ||||
| \defun{pointer-ref-c-signed-short}{procedure} | ||||
| \texttt{(pointer-ref-c-signed-short p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-signed-short} loads two bytes | ||||
| The procedure \texttt{pointer-ref-c-signed-short} loads two bytes | ||||
| located at offsets \texttt{i} and \texttt{(+ i 1)} from the pointer | ||||
| \texttt{p} and returns an exact integer representing the | ||||
| sign-extended | ||||
| integer value of the sequence.  The resulting value is in the range | ||||
| $[-32768, 32767]$ inclusive. | ||||
| 
 | ||||
| \defun{pointer-ref-unsigned-short}{procedure} | ||||
| \texttt{(pointer-ref-unsigned-short p i)} | ||||
| \defun{pointer-ref-c-unsigned-short}{procedure} | ||||
| \texttt{(pointer-ref-c-unsigned-short p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-unsigned-short} loads two bytes | ||||
| The procedure \texttt{pointer-ref-c-unsigned-short} loads two bytes | ||||
| located at offsets \texttt{i} and \texttt{(+ i 1)} from the pointer | ||||
| \texttt{p} and returns an exact integer representing the unsigned | ||||
| integer value of the sequence.  The resulting value is in the range | ||||
| $[0, 65535]$ inclusive. | ||||
| 
 | ||||
| \newpage | ||||
| \defun{pointer-ref-signed-int}{procedure} | ||||
| \texttt{(pointer-ref-signed-int p i)} | ||||
| \defun{pointer-ref-c-signed-int}{procedure} | ||||
| \texttt{(pointer-ref-c-signed-int p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-signed-int} loads four bytes | ||||
| The procedure \texttt{pointer-ref-c-signed-int} loads four bytes | ||||
| starting at offset \texttt{i} of pointer \texttt{p} and returns an | ||||
| exact integer in the range of $[-2^{31},2^{31}-1]$ inclusive. | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-ref-unsigned-int}{procedure} | ||||
| \texttt{(pointer-ref-unsigned-int p i)} | ||||
| \defun{pointer-ref-c-unsigned-int}{procedure} | ||||
| \texttt{(pointer-ref-c-unsigned-int p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-unsigned-int} loads four bytes | ||||
| The procedure \texttt{pointer-ref-c-unsigned-int} loads four bytes | ||||
| starting at offset \texttt{i} of pointer \texttt{p} and returns an | ||||
| exact integer in the range of $[0,2^{32}-1]$ inclusive. | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-ref-signed-long}{procedure} | ||||
| \texttt{(pointer-ref-signed-long p i)} | ||||
| \defun{pointer-ref-c-signed-long}{procedure} | ||||
| \texttt{(pointer-ref-c-signed-long p i)} | ||||
| 
 | ||||
| On 64-bit systems, the procedure \texttt{pointer-ref-signed-long} | ||||
| On 64-bit systems, the procedure \texttt{pointer-ref-c-signed-long} | ||||
| loads eight bytes starting at offset \texttt{i} of pointer | ||||
| \texttt{p} and returns an integer in the range of | ||||
| $[-2^{63},2^{63}-1]$ inclusive.  On 32-bit systems, the procedure | ||||
| \texttt{pointer-ref-signed-long} performs the same task as | ||||
| \texttt{pointer-ref-signed-int}.  | ||||
| \texttt{pointer-ref-c-signed-long} performs the same task as | ||||
| \texttt{pointer-ref-c-signed-int}.  | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-ref-unsigned-long}{procedure} | ||||
| \texttt{(pointer-ref-unsigned-long p i)} | ||||
| \defun{pointer-ref-c-unsigned-long}{procedure} | ||||
| \texttt{(pointer-ref-c-unsigned-long p i)} | ||||
| 
 | ||||
| On 64-bit systems, the procedure \texttt{pointer-ref-unsigned-long} | ||||
| On 64-bit systems, the procedure \texttt{pointer-ref-c-unsigned-long} | ||||
| loads eight bytes starting at offset \texttt{i} of pointer | ||||
| \texttt{p} and returns an integer in the range of | ||||
| $[0,2^{64}-1]$ inclusive.  On 32-bit systems, the procedure | ||||
| \texttt{pointer-ref-unsigned-long} performs the same task as | ||||
| \texttt{pointer-ref-unsigned-int}.  | ||||
| \texttt{pointer-ref-c-unsigned-long} performs the same task as | ||||
| \texttt{pointer-ref-c-unsigned-int}.  | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-ref-float}{procedure} | ||||
| \texttt{(pointer-ref-float p i)} | ||||
| \defun{pointer-ref-c-float}{procedure} | ||||
| \texttt{(pointer-ref-c-float p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-float} returns the four-byte | ||||
| The procedure \texttt{pointer-ref-c-float} returns the four-byte | ||||
| float (represented as IEEE-754 single precision floating point | ||||
| number) stored at offset \texttt{i} of the pointer \texttt{p}. | ||||
| The value is extended to an IEEE-754 double precision floating | ||||
| point number that Ikarus uses to represent inexact numbers. | ||||
| 
 | ||||
| \defun{pointer-ref-double}{procedure} | ||||
| \texttt{(pointer-ref-double p i)} | ||||
| \defun{pointer-ref-c-double}{procedure} | ||||
| \texttt{(pointer-ref-c-double p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-double} returns the eight-byte | ||||
| The procedure \texttt{pointer-ref-c-double} returns the eight-byte | ||||
| float (represented as IEEE-754 double precision floating point | ||||
| number) stored at offset \texttt{i} of the pointer \texttt{p}. | ||||
| 
 | ||||
| 
 | ||||
| \defun{pointer-ref-pointer}{procedure} | ||||
| \texttt{(pointer-ref-pointer p i)} | ||||
| \defun{pointer-ref-c-pointer}{procedure} | ||||
| \texttt{(pointer-ref-c-pointer p i)} | ||||
| 
 | ||||
| The procedure \texttt{pointer-ref-pointer} returns the pointer | ||||
| The procedure \texttt{pointer-ref-c-pointer} returns the pointer | ||||
| stored at offset \texttt{i} from the pointer \texttt{p}.  The size | ||||
| of the pointer (also the number of bytes loaded) depends on the | ||||
| architecture: it is 4 bytes on 32-bit systems and 8 bytes on 64-bit | ||||
|  | @ -2567,12 +2567,12 @@ parameter type. | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| \defun{make-callout}{procedure} | ||||
| \texttt{((make-callout return-type parameter-types) native-pointer)} | ||||
| \defun{make-c-callout}{procedure} | ||||
| \texttt{((make-c-callout return-type parameter-types) native-pointer)} | ||||
| 
 | ||||
| The procedure \texttt{make-callout} is the primary facility for | ||||
| The procedure \texttt{make-c-callout} is the primary facility for | ||||
| making foreign procedures callable from Scheme.  It works as | ||||
| follows.  First, \texttt{make-callout} receives two arguments | ||||
| follows.  First, \texttt{make-c-callout} receives two arguments | ||||
| denoting the signature of the procedure to be called.  It prepares a | ||||
| bridge that converts from Scheme's calling conventions and data | ||||
| structures to their foreign counterparts.  It returns a procedure | ||||
|  | @ -2589,10 +2589,10 @@ types, calls the foreign procedure, obtains the result, and converts | |||
| it to the appropriate Scheme value (depending on the | ||||
| \texttt{return-type}). | ||||
| 
 | ||||
| The interface of \texttt{make-callout} is broken down into three | ||||
| The interface of \texttt{make-c-callout} is broken down into three | ||||
| stages in order to accomodate common usage patterns.  Often types, a | ||||
| function signature can be used by many foreign procedures and | ||||
| therefore, \texttt{make-callout} can be called once per signature | ||||
| therefore, \texttt{make-c-callout} can be called once per signature | ||||
| and each signature can be used multiple times.  Similarly, | ||||
| separating the foreign procedure preparation from parameter passing | ||||
| allows for preparing the foreign procedure once and calling it many | ||||
|  | @ -2655,14 +2655,14 @@ specifier to mean ``no useful value is returned''.} | |||
| 
 | ||||
| 
 | ||||
| The following example illustrates the use of the | ||||
| \texttt{make-callout} procedure in combination with \texttt{dlopen} | ||||
| \texttt{make-c-callout} procedure in combination with \texttt{dlopen} | ||||
| and \texttt{dlsym}.  The session was run on a 32-bit Ikarus running | ||||
| under Mac OS X 10.4.  First, the \texttt{libc.dylib} foreign library | ||||
| is loaded and is bound to the variable \texttt{libc}.  Next, we | ||||
| obtain a pointer to the \texttt{atan} foreign procedure that is | ||||
| defined in \texttt{libc}.  The native procedure \texttt{atan} takes | ||||
| a \texttt{double} as an argument and returns a \texttt{double} and | ||||
| that's the signature that we use for \texttt{make-callout}. | ||||
| that's the signature that we use for \texttt{make-c-callout}. | ||||
| Finally, we call the foreign procedure interface with one argument, | ||||
| \texttt{1.0}, which is a flonum and thus matches the required | ||||
| parameter type.  The native procedure returns a \texttt{double} | ||||
|  | @ -2678,7 +2678,7 @@ value which is converted to the Scheme flonum with value | |||
|    > libc-atan-ptr | ||||
|    #<pointer #x9006CB1F> | ||||
|    > (define libc-atan  | ||||
|        ((make-callout 'double '(double)) libc-atan-ptr)) | ||||
|        ((make-c-callout 'double '(double)) libc-atan-ptr)) | ||||
|    > libc-atan | ||||
|    #<procedure> | ||||
|    > (libc-atan 1.0) | ||||
|  | @ -2713,14 +2713,14 @@ Figure~\ref{fig:foreign-types} on page~\pageref{fig:foreign-types} for | |||
| details). | ||||
| 
 | ||||
| 
 | ||||
| \defun{make-callback}{procedure} | ||||
| \texttt{((make-callback return-type parameter-types) scheme-procedure)} | ||||
| \defun{make-c-callback}{procedure} | ||||
| \texttt{((make-c-callback return-type parameter-types) scheme-procedure)} | ||||
| 
 | ||||
| The procedure \texttt{make-callback} is similar to the procedure | ||||
| \texttt{make-callout} except that it provides a bridge from native | ||||
| The procedure \texttt{make-c-callback} is similar to the procedure | ||||
| \texttt{make-c-callout} except that it provides a bridge from native | ||||
| procedures back into Scheme.  While the procedure | ||||
| \texttt{make-callout} takes a native pointer and returns a Scheme | ||||
| procedure, \texttt{make-callback} takes a Scheme procedure and | ||||
| \texttt{make-c-callout} takes a native pointer and returns a Scheme | ||||
| procedure, \texttt{make-c-callback} takes a Scheme procedure and | ||||
| returns a native pointer.  The native pointer can be called by | ||||
| foreign procedures.  The native parameters are converted to Scheme | ||||
| data (according to \texttt{parameter-types}), the Scheme procedure | ||||
|  | @ -2730,18 +2730,18 @@ control returns to the native call site. | |||
| 
 | ||||
| 
 | ||||
| Note that the native procedure pointer obtained from | ||||
| \texttt{make-callback} is indistinguishable from other native | ||||
| \texttt{make-c-callback} is indistinguishable from other native | ||||
| procedures that are obtained using \texttt{dlsym} or similar means. | ||||
| In particular, such native pointers can be used as arguments to | ||||
| \texttt{make-callout} resulting in a Scheme procedure that calls out | ||||
| In particular, such native pointers can be passed to | ||||
| \texttt{make-c-callout} resulting in a Scheme procedure that calls out | ||||
| to the native procedure that in turn calls back into Scheme.  The | ||||
| following segment illustrates a very inefficient way of extracting | ||||
| the lowermost 32 bits from an exact integer. | ||||
| 
 | ||||
| \begin{verbatim} | ||||
|    > (format "~x" | ||||
|        (((make-callout 'unsigned-int '(unsigned-int)) | ||||
|          ((make-callback 'unsigned-int '(unsigned-int))  | ||||
|        (((make-c-callout 'unsigned-int '(unsigned-int)) | ||||
|          ((make-c-callback 'unsigned-int '(unsigned-int))  | ||||
|           values)) | ||||
|         #xfedcba09876543210fedcba09876543210)) | ||||
|    "76543210" | ||||
|  |  | |||
|  | @ -20,22 +20,22 @@ | |||
| (define hosym (dlsym self "ho")) | ||||
| 
 | ||||
| (define ho  | ||||
|   ((make-callout 'signed-int '(pointer signed-int)) hosym)) | ||||
|   ((make-c-callout 'signed-int '(pointer signed-int)) hosym)) | ||||
| 
 | ||||
| (define traced-foradd1  | ||||
|   ((make-callback 'signed-int '(signed-int))  | ||||
|   ((make-c-callback 'signed-int '(signed-int))  | ||||
|      (trace-lambda add1 (n)  | ||||
|        (collect) | ||||
|        (add1 n)))) | ||||
| 
 | ||||
| (define foradd1 | ||||
|   ((make-callback 'signed-int '(signed-int)) | ||||
|   ((make-c-callback 'signed-int '(signed-int)) | ||||
|      (lambda (n)  | ||||
|        (collect) | ||||
|        (add1 n)))) | ||||
| 
 | ||||
| (define foradd1-by-foreign-call | ||||
|   ((make-callback 'signed-int '(signed-int)) | ||||
|   ((make-c-callback 'signed-int '(signed-int)) | ||||
|      (trace-lambda foradd1-by-foreign-call (n)  | ||||
|        (/ (ho traced-foradd1 n) 2)))) | ||||
| 
 | ||||
|  | @ -46,11 +46,11 @@ | |||
| 
 | ||||
| 
 | ||||
| (define test_I_I  | ||||
|   ((make-callout 'signed-int '(pointer signed-int)) (dlsym self "test_I_I"))) | ||||
|   ((make-c-callout 'signed-int '(pointer signed-int)) (dlsym self "test_I_I"))) | ||||
| (define test_I_II | ||||
|   ((make-callout 'signed-int '(pointer signed-int signed-int)) (dlsym self "test_I_II"))) | ||||
|   ((make-c-callout 'signed-int '(pointer signed-int signed-int)) (dlsym self "test_I_II"))) | ||||
| (define test_I_III | ||||
|   ((make-callout 'signed-int '(pointer signed-int signed-int signed-int)) (dlsym self "test_I_III"))) | ||||
|   ((make-c-callout 'signed-int '(pointer signed-int signed-int signed-int)) (dlsym self "test_I_III"))) | ||||
| 
 | ||||
| (define C_add_I_I (dlsym self "add_I_I")) | ||||
| (define C_add_I_II (dlsym self "add_I_II")) | ||||
|  | @ -60,10 +60,10 @@ | |||
| (check = (test_I_II C_add_I_II 12 13) (+ 12 13)) | ||||
| (check = (test_I_III C_add_I_III 12 13 14) (+ 12 13 14)) | ||||
| 
 | ||||
| (define S_add_I_I ((make-callback 'signed-int '(signed-int)) +)) | ||||
| (define S_add_I_II ((make-callback 'signed-int '(signed-int | ||||
| (define S_add_I_I ((make-c-callback 'signed-int '(signed-int)) +)) | ||||
| (define S_add_I_II ((make-c-callback 'signed-int '(signed-int | ||||
|                                                   signed-int)) +)) | ||||
| (define S_add_I_III ((make-callback 'signed-int '(signed-int | ||||
| (define S_add_I_III ((make-c-callback 'signed-int '(signed-int | ||||
|                                                    signed-int | ||||
|                                                    signed-int)) +)) | ||||
| 
 | ||||
|  | @ -73,11 +73,11 @@ | |||
| 
 | ||||
| 
 | ||||
| (define test_D_D  | ||||
|   ((make-callout 'double '(pointer double)) (dlsym self "test_D_D"))) | ||||
|   ((make-c-callout 'double '(pointer double)) (dlsym self "test_D_D"))) | ||||
| (define test_D_DD | ||||
|   ((make-callout 'double '(pointer double double)) (dlsym self "test_D_DD"))) | ||||
|   ((make-c-callout 'double '(pointer double double)) (dlsym self "test_D_DD"))) | ||||
| (define test_D_DDD | ||||
|   ((make-callout 'double '(pointer double double double)) (dlsym self "test_D_DDD"))) | ||||
|   ((make-c-callout 'double '(pointer double double double)) (dlsym self "test_D_DDD"))) | ||||
| 
 | ||||
| (define C_add_D_D (dlsym self "add_D_D")) | ||||
| (define C_add_D_DD (dlsym self "add_D_DD")) | ||||
|  | @ -87,9 +87,9 @@ | |||
| (check = (test_D_DD C_add_D_DD 12.0 13.0) (+ 12.0 13.0)) | ||||
| (check = (test_D_DDD C_add_D_DDD 12.0 13.0 14.0) (+ 12.0 13.0 14.0)) | ||||
| 
 | ||||
| (define S_add_D_D ((make-callback 'double '(double)) +)) | ||||
| (define S_add_D_DD ((make-callback 'double '(double double)) +)) | ||||
| (define S_add_D_DDD ((make-callback 'double '(double double double)) +)) | ||||
| (define S_add_D_D ((make-c-callback 'double '(double)) +)) | ||||
| (define S_add_D_DD ((make-c-callback 'double '(double double)) +)) | ||||
| (define S_add_D_DDD ((make-c-callback 'double '(double double double)) +)) | ||||
| 
 | ||||
| (check = (test_D_D S_add_D_D 12.0) (+ 12.0)) | ||||
| (check = (test_D_DD S_add_D_DD 12.0 13.0) (+ 12.0 13.0)) | ||||
|  | @ -97,7 +97,7 @@ | |||
| 
 | ||||
| 
 | ||||
| (define RectArea  | ||||
|   ((make-callout 'float '(#(#(float float) #(float float)))) | ||||
|   ((make-c-callout 'float '(#(#(float float) #(float float)))) | ||||
|    (dlsym self "test_area_F_R"))) | ||||
| 
 | ||||
| (check = (RectArea '#(#(0.0 0.0) #(10.0 10.0))) 100.0) | ||||
|  |  | |||
|  | @ -6,13 +6,13 @@ | |||
|     (define kProcessTransformToForegroundApplication 1) | ||||
|     (define self (dlopen)) | ||||
|     (define get-current-process | ||||
|       ((make-callout 'void '(pointer)) | ||||
|       ((make-c-callout 'void '(pointer)) | ||||
|        (dlsym self "GetCurrentProcess"))) | ||||
|     (define transform-process-type | ||||
|       ((make-callout 'void '(pointer signed-int))  | ||||
|       ((make-c-callout 'void '(pointer signed-int))  | ||||
|        (dlsym self "TransformProcessType"))) | ||||
|     (define set-front-process | ||||
|       ((make-callout 'void '(pointer))  | ||||
|       ((make-c-callout 'void '(pointer))  | ||||
|        (dlsym self "SetFrontProcess"))) | ||||
|     (let ([p (malloc 16)]) | ||||
|       (get-current-process p) | ||||
|  |  | |||
|  | @ -1,17 +1,29 @@ | |||
| 
 | ||||
| (library (ikarus foreign) | ||||
| 
 | ||||
|   (export malloc free pointer-set-char pointer-set-short | ||||
|           pointer-set-int pointer-set-long pointer-set-pointer | ||||
|           pointer-set-float pointer-set-double | ||||
|           pointer-ref-signed-char pointer-ref-signed-short | ||||
|           pointer-ref-signed-int pointer-ref-signed-long | ||||
|           pointer-ref-unsigned-char pointer-ref-unsigned-short | ||||
|           pointer-ref-unsigned-int pointer-ref-unsigned-long | ||||
|           pointer-ref-pointer pointer-ref-float pointer-ref-double | ||||
|   (export  | ||||
|           pointer-set-c-char! | ||||
|           pointer-set-c-short! | ||||
|           pointer-set-c-int! | ||||
|           pointer-set-c-long! | ||||
|           pointer-set-c-pointer! | ||||
|           pointer-set-c-float! | ||||
|           pointer-set-c-double! | ||||
|           pointer-ref-c-signed-char | ||||
|           pointer-ref-c-signed-short | ||||
|           pointer-ref-c-signed-int | ||||
|           pointer-ref-c-signed-long | ||||
|           pointer-ref-c-unsigned-char  | ||||
|           pointer-ref-c-unsigned-short | ||||
|           pointer-ref-c-unsigned-int | ||||
|           pointer-ref-c-unsigned-long | ||||
|           pointer-ref-c-pointer | ||||
|           pointer-ref-c-float  | ||||
|           pointer-ref-c-double | ||||
|           malloc free  | ||||
|           pointer->integer integer->pointer pointer? dlopen dlsym | ||||
|           dlclose dlerror | ||||
|           make-callout make-callback) | ||||
|           make-c-callout make-c-callback) | ||||
| 
 | ||||
|   (import (ikarus system $foreign))) | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										44
									
								
								lib/objc.ss
								
								
								
								
							
							
						
						
									
										44
									
								
								lib/objc.ss
								
								
								
								
							|  | @ -61,7 +61,7 @@ | |||
| 
 | ||||
| (define (pointer-ref addr offset) | ||||
|   (assert (pointer? addr)) | ||||
|   (integer->pointer (pointer-ref-signed-long addr offset))) | ||||
|   (pointer-ref-c-pointer addr offset)) | ||||
| 
 | ||||
| (define (offset? x) (or (fixnum? x) (bignum? x))) | ||||
| 
 | ||||
|  | @ -70,12 +70,12 @@ | |||
|   (check who pointer? addr) | ||||
|   (check who pointer? val) | ||||
|   (check who offset? offset) | ||||
|   (pointer-set-long addr offset (pointer->integer val))) | ||||
|   (pointer-set-c-pointer! addr offset val)) | ||||
| 
 | ||||
| (define (char*len x) | ||||
|   (let f ([i 0]) | ||||
|     (cond | ||||
|       [(zero? (pointer-ref-unsigned-char x i)) i] | ||||
|       [(zero? (pointer-ref-c-unsigned-char x i)) i] | ||||
|       [else (f (+ i 1))]))) | ||||
| 
 | ||||
| (define (char*->bv x) | ||||
|  | @ -85,18 +85,18 @@ | |||
|         (cond | ||||
|           [(= i n) bv] | ||||
|           [else | ||||
|            (bytevector-u8-set! bv i (pointer-ref-unsigned-char x i)) | ||||
|            (bytevector-u8-set! bv i (pointer-ref-c-unsigned-char x i)) | ||||
|            (f (+ i 1))]))))) | ||||
| 
 | ||||
| (define (bv->char* x) | ||||
|   (let ([n (bytevector-length x)]) | ||||
|     (let ([p (malloc (+ n 1))]) | ||||
|       (pointer-set-char p n 0) | ||||
|       (pointer-set-c-char! p n 0) | ||||
|       (let f ([i 0]) | ||||
|         (cond | ||||
|           [(= i n) p] | ||||
|           [else | ||||
|            (pointer-set-char p i (bytevector-s8-ref x i)) | ||||
|            (pointer-set-c-char! p i (bytevector-s8-ref x i)) | ||||
|            (f (+ i 1))]))))) | ||||
| 
 | ||||
| (define (bv->u8* x) | ||||
|  | @ -108,7 +108,7 @@ | |||
|             (cond | ||||
|               [(= i n) p] | ||||
|               [else | ||||
|                (pointer-set-char p i (bytevector-s8-ref x i)) | ||||
|                (pointer-set-c-char! p i (bytevector-s8-ref x i)) | ||||
|                (f (+ i 1))])))))) | ||||
| 
 | ||||
| (define (char*->string x) | ||||
|  | @ -183,7 +183,7 @@ | |||
| 
 | ||||
| (define (class-instance-size x) | ||||
|   (check 'class-instance-size class? x) | ||||
|   (pointer-ref-signed-long (class-ptr x) objc-class-instance-size-offset)) | ||||
|   (pointer-ref-c-signed-long (class-ptr x) objc-class-instance-size-offset)) | ||||
| 
 | ||||
| (define (ivar-name x) | ||||
|   (check 'ivar-name ivar? x) | ||||
|  | @ -195,14 +195,14 @@ | |||
| 
 | ||||
| (define (ivar-offset x) | ||||
|   (check 'ivar-offset ivar? x) | ||||
|   (pointer-ref-signed-int (ivar-ptr x) (* 2 ptrsize))) | ||||
|   (pointer-ref-c-signed-int (ivar-ptr x) (* 2 ptrsize))) | ||||
| 
 | ||||
| (define (class-ivars x) | ||||
|   (check 'class-ivars class? x) | ||||
|   (let ([p (pointer-ref (class-ptr x) objc-class-ivars-offset)]) | ||||
|     (if (nil? p) | ||||
|         '() | ||||
|         (let ([n (pointer-ref-signed-long p 0)]) | ||||
|         (let ([n (pointer-ref-c-signed-long p 0)]) | ||||
|           (let f ([i 0] [off objc-ivarlist-ivars-offset]) | ||||
|             (if (= i n) | ||||
|                 '() | ||||
|  | @ -223,7 +223,7 @@ | |||
|            [class (malloc objc-class-struct-size)] | ||||
|            [meta  (malloc objc-class-struct-size)]) | ||||
|       ;;; init meta class | ||||
|       (pointer-set-long meta objc-class-info-offset CLS_META) | ||||
|       (pointer-set-c-long! meta objc-class-info-offset CLS_META) | ||||
|       (pointer-set meta objc-class-name-offset (string->char* name)) | ||||
|       (pointer-set meta objc-class-methodlists-offset | ||||
|         (malloc objc-methodlist-methods-offset)) | ||||
|  | @ -232,14 +232,14 @@ | |||
|       (pointer-set meta objc-class-isa-offset | ||||
|         (pointer-ref (class-ptr root-class) objc-class-isa-offset)) | ||||
|       ;;; init class | ||||
|       (pointer-set-long class objc-class-info-offset CLS_CLASS) | ||||
|       (pointer-set-c-long! class objc-class-info-offset CLS_CLASS) | ||||
|       (pointer-set class objc-class-name-offset (string->char* name)) | ||||
|       (pointer-set class objc-class-methodlists-offset | ||||
|         (malloc objc-methodlist-methods-offset)) | ||||
|       (pointer-set class objc-class-superclass-offset | ||||
|         (class-ptr super-class)) | ||||
|       (pointer-set class objc-class-ivars-offset ivars-ptr) | ||||
|       (pointer-set-long class objc-class-instance-size-offset instance-size) | ||||
|       (pointer-set-c-long! class objc-class-instance-size-offset instance-size) | ||||
|       ;;; wire up | ||||
|       (pointer-set class objc-class-isa-offset meta) | ||||
|       (when intern? (objc_addClass class)) | ||||
|  | @ -251,7 +251,7 @@ | |||
|   (check who procedure? proc) | ||||
|   (let ([type (make-objc-type (cons rtype argtypes))]) | ||||
|     (let ([callback | ||||
|            (make-callback | ||||
|            (make-c-callback | ||||
|              (objc-type->ikarus-type rtype) | ||||
|              (map objc-type->ikarus-type argtypes))]) | ||||
|       (let ([imp (callback | ||||
|  | @ -260,7 +260,7 @@ | |||
|                        (apply proc (map convert-incoming argtypes args)))))]) | ||||
|         (let ([p (malloc (+ objc-methodlist-methods-offset | ||||
|                             objc-method-size))]) | ||||
|           (pointer-set-int p objc-methodlist-count-offset 1) | ||||
|           (pointer-set-c-int! p objc-methodlist-count-offset 1) | ||||
|           (pointer-set p | ||||
|             (+ objc-methodlist-methods-offset objc-method-sel-offset) | ||||
|             (selector-ptr | ||||
|  | @ -312,11 +312,11 @@ | |||
|           (cond | ||||
|             [(assq what alist) => cadr] | ||||
|             [else (error 'class-is? "invalid what" what)])]) | ||||
|     (= mask (bitwise-and mask (pointer-ref-signed-long (class-ptr x) (* ptrsize 4)))))) | ||||
|     (= mask (bitwise-and mask (pointer-ref-c-signed-long (class-ptr x) (* ptrsize 4)))))) | ||||
| 
 | ||||
| (define (class-methods x) | ||||
|   (define (methods x) | ||||
|     (let ([n (pointer-ref-signed-int x ptrsize)] | ||||
|     (let ([n (pointer-ref-c-signed-int x ptrsize)] | ||||
|           [array (integer->pointer (+ (pointer->integer x) (* 2 ptrsize)))]) | ||||
|       (let f ([i 0]) | ||||
|         (if (= i n) | ||||
|  | @ -330,7 +330,7 @@ | |||
|   (when (class-is? x 'method-array) | ||||
|     (error 'class-methods "BUG: not yet for method arrays")) | ||||
|   (let ([iterator (malloc ptrsize)]) | ||||
|     (pointer-set-long iterator 0 0) | ||||
|     (pointer-set-c-long! iterator 0 0) | ||||
|     (let f () | ||||
|       (let ([methodlist (class_nextMethodList (class-ptr x) iterator)]) | ||||
|         (cond | ||||
|  | @ -354,7 +354,7 @@ | |||
|                      (cons | ||||
|                        (make-class | ||||
|                          (integer->pointer | ||||
|                            (pointer-ref-signed-long buffer (* ptrsize i)))) | ||||
|                            (pointer-ref-c-signed-long buffer (* ptrsize i)))) | ||||
|                        ac))))))))) | ||||
| 
 | ||||
| (define (nil? x) | ||||
|  | @ -475,7 +475,7 @@ | |||
|     (define count (length ivars)) | ||||
|     (define p | ||||
|       (malloc (+ objc-ivarlist-ivars-offset (* count objc-ivar-size)))) | ||||
|     (pointer-set-int p objc-ivarlist-count-offset count) | ||||
|     (pointer-set-c-int! p objc-ivarlist-count-offset count) | ||||
|     (let f ([ivars ivars] | ||||
|             [poff objc-ivarlist-ivars-offset] | ||||
|             [ivaroff (class-instance-size super-class)]) | ||||
|  | @ -489,7 +489,7 @@ | |||
|                  (string->char* (symbol->string name))) | ||||
|                (pointer-set p (+ poff objc-ivar-type-offset) | ||||
|                  (string->char* ivar-type)) | ||||
|                (pointer-set-int p (+ poff objc-ivar-offset-offset) ivaroff) | ||||
|                (pointer-set-c-int! p (+ poff objc-ivar-offset-offset) ivaroff) | ||||
|                (f (cdr ivars) | ||||
|                   (+ poff objc-ivar-size) | ||||
|                   (+ ivaroff ivar-size)))))]))) | ||||
|  | @ -643,7 +643,7 @@ | |||
|   (let ([rtype (car sig)] [argtypes (cdr sig)]) | ||||
|     (unless (= (length args) (length argtypes)) | ||||
|       (error 'call-with-sig "incorrect number of args" args argtypes)) | ||||
|     (let ([ffi (make-callout | ||||
|     (let ([ffi (make-c-callout | ||||
|                  (objc-type->ikarus-type rtype) | ||||
|                  (map objc-type->ikarus-type argtypes))]) | ||||
|       (let ([proc (ffi mptr)]) | ||||
|  |  | |||
|  | @ -80,7 +80,7 @@ | |||
|              (cond | ||||
|                [(= i n) p] | ||||
|                [else | ||||
|                 (pointer-set-int p (* i 4) (vector-ref x i)) | ||||
|                 (pointer-set-c-int! p (* i 4) (vector-ref x i)) | ||||
|                 (f (+ i 1))]))))] | ||||
|       [else (die who "not an int*" x)])) | ||||
| 
 | ||||
|  | @ -104,7 +104,7 @@ | |||
|              (cond | ||||
|                [(= i n) p] | ||||
|                [else | ||||
|                 (pointer-set-int p (* i pointer-size) | ||||
|                 (pointer-set-c-int! p (* i pointer-size) | ||||
|                   (pointer->integer (check-char* who (vector-ref x i)))) | ||||
|                 (f (+ i 1))]))))] | ||||
|       [else (die who "not a char**" x)])) | ||||
|  | @ -114,12 +114,12 @@ | |||
|       [(bytevector? x) | ||||
|        (let ([n (bytevector-length x)]) | ||||
|          (let ([p (malloc (+ n 1))]) | ||||
|            (pointer-set-char p n 0) | ||||
|            (pointer-set-c-char! p n 0) | ||||
|            (let f ([i 0]) | ||||
|              (cond | ||||
|                [(= i n) p] | ||||
|                [else | ||||
|                 (pointer-set-char p i (bytevector-u8-ref x i)) | ||||
|                 (pointer-set-c-char! p i (bytevector-u8-ref x i)) | ||||
|                 (f (+ i 1))]))))] | ||||
|       [else (die who "not a byte*" x)])) | ||||
|    | ||||
|  | @ -139,7 +139,7 @@ | |||
|         [(_ foreign-name val return-type (arg-type* ...)) | ||||
|          #'(let ([t val]) | ||||
|              (if (procedure? t) | ||||
|                  ((make-callback | ||||
|                  ((make-c-callback | ||||
|                     (convert-type return-type) | ||||
|                     (list (convert-type arg-type*) ...)) | ||||
|                   t) | ||||
|  | @ -187,7 +187,7 @@ | |||
|     (define (strlen x) | ||||
|       (let f ([i 0]) | ||||
|         (cond | ||||
|           [(= 0 (pointer-ref-unsigned-char x i)) i] | ||||
|           [(= 0 (pointer-ref-c-unsigned-char x i)) i] | ||||
|           [else (f (+ i 1))]))) | ||||
|     (let ([n (strlen x)]) | ||||
|       (let ([s (make-string n)]) | ||||
|  | @ -196,7 +196,7 @@ | |||
|               s | ||||
|               (begin | ||||
|                 (string-set! s i  | ||||
|                   (integer->char (pointer-ref-unsigned-char x i))) | ||||
|                   (integer->char (pointer-ref-c-unsigned-char x i))) | ||||
|                 (f (+ i 1)))))))) | ||||
| 
 | ||||
|   (define-syntax convert-return | ||||
|  | @ -254,7 +254,7 @@ | |||
|          (with-syntax ([x x] | ||||
|                        [(t* ...) (generate-temporaries #'(arg-type* ...))]) | ||||
|          #'(let ([callout  | ||||
|                    ((make-callout  | ||||
|                    ((make-c-callout  | ||||
|                       (convert-type return-type) | ||||
|                       (list (convert-type arg-type*) ...)) | ||||
|                     (lookup-shared-object lib 'foreign-name))]) | ||||
|  |  | |||
|  | @ -2,19 +2,25 @@ | |||
| (library (ikarus.pointers) | ||||
|   (export pointer? integer->pointer pointer->integer  | ||||
|           dlopen dlerror dlclose dlsym malloc free | ||||
|           pointer-ref-signed-char  | ||||
|           pointer-ref-signed-short | ||||
|           pointer-ref-signed-int  | ||||
|           pointer-ref-signed-long | ||||
|           pointer-ref-unsigned-char | ||||
|           pointer-ref-unsigned-short  | ||||
|           pointer-ref-unsigned-int  | ||||
|           pointer-ref-unsigned-long | ||||
|           pointer-set-char pointer-set-short pointer-set-int pointer-set-long | ||||
|           pointer-set-pointer pointer-ref-pointer | ||||
|           pointer-set-float pointer-ref-float | ||||
|           pointer-set-double pointer-ref-double | ||||
|           make-callout make-callback) | ||||
|           pointer-ref-c-signed-char  | ||||
|           pointer-ref-c-signed-short | ||||
|           pointer-ref-c-signed-int  | ||||
|           pointer-ref-c-signed-long | ||||
|           pointer-ref-c-unsigned-char | ||||
|           pointer-ref-c-unsigned-short  | ||||
|           pointer-ref-c-unsigned-int  | ||||
|           pointer-ref-c-unsigned-long | ||||
|           pointer-ref-c-float | ||||
|           pointer-ref-c-double | ||||
|           pointer-ref-c-pointer | ||||
|           pointer-set-c-char! | ||||
|           pointer-set-c-short! | ||||
|           pointer-set-c-int! | ||||
|           pointer-set-c-long! | ||||
|           pointer-set-c-pointer! | ||||
|           pointer-set-c-float! | ||||
|           pointer-set-c-double!  | ||||
|           make-c-callout make-c-callback) | ||||
|   (import  | ||||
|     (except (ikarus)  | ||||
|       pointer?  | ||||
|  | @ -120,25 +126,25 @@ | |||
| 
 | ||||
|   (define (int? x) (or (fixnum? x) (bignum? x))) | ||||
| 
 | ||||
|   (define-getter pointer-ref-signed-char    "ikrt_ref_char") | ||||
|   (define-getter pointer-ref-signed-short   "ikrt_ref_short") | ||||
|   (define-getter pointer-ref-signed-int     "ikrt_ref_int") | ||||
|   (define-getter pointer-ref-signed-long    "ikrt_ref_long") | ||||
|   (define-getter pointer-ref-unsigned-char  "ikrt_ref_uchar") | ||||
|   (define-getter pointer-ref-unsigned-short "ikrt_ref_ushort") | ||||
|   (define-getter pointer-ref-unsigned-int   "ikrt_ref_uint") | ||||
|   (define-getter pointer-ref-unsigned-long  "ikrt_ref_ulong") | ||||
|   (define-getter pointer-ref-float          "ikrt_ref_float") | ||||
|   (define-getter pointer-ref-double         "ikrt_ref_double") | ||||
|   (define-getter pointer-ref-pointer        "ikrt_ref_pointer") | ||||
|   (define-getter pointer-ref-c-signed-char    "ikrt_ref_char") | ||||
|   (define-getter pointer-ref-c-signed-short   "ikrt_ref_short") | ||||
|   (define-getter pointer-ref-c-signed-int     "ikrt_ref_int") | ||||
|   (define-getter pointer-ref-c-signed-long    "ikrt_ref_long") | ||||
|   (define-getter pointer-ref-c-unsigned-char  "ikrt_ref_uchar") | ||||
|   (define-getter pointer-ref-c-unsigned-short "ikrt_ref_ushort") | ||||
|   (define-getter pointer-ref-c-unsigned-int   "ikrt_ref_uint") | ||||
|   (define-getter pointer-ref-c-unsigned-long  "ikrt_ref_ulong") | ||||
|   (define-getter pointer-ref-c-float          "ikrt_ref_float") | ||||
|   (define-getter pointer-ref-c-double         "ikrt_ref_double") | ||||
|   (define-getter pointer-ref-c-pointer        "ikrt_ref_pointer") | ||||
| 
 | ||||
|   (define-setter pointer-set-char    int?     "ikrt_set_char") | ||||
|   (define-setter pointer-set-short   int?     "ikrt_set_short") | ||||
|   (define-setter pointer-set-int     int?     "ikrt_set_int") | ||||
|   (define-setter pointer-set-long    int?     "ikrt_set_long") | ||||
|   (define-setter pointer-set-float   flonum?  "ikrt_set_float") | ||||
|   (define-setter pointer-set-double  flonum?  "ikrt_set_double") | ||||
|   (define-setter pointer-set-pointer pointer? "ikrt_set_pointer") | ||||
|   (define-setter pointer-set-c-char!    int?     "ikrt_set_char") | ||||
|   (define-setter pointer-set-c-short!   int?     "ikrt_set_short") | ||||
|   (define-setter pointer-set-c-int!     int?     "ikrt_set_int") | ||||
|   (define-setter pointer-set-c-long!    int?     "ikrt_set_long") | ||||
|   (define-setter pointer-set-c-float!   flonum?  "ikrt_set_float") | ||||
|   (define-setter pointer-set-c-double!  flonum?  "ikrt_set_double") | ||||
|   (define-setter pointer-set-c-pointer! pointer? "ikrt_set_pointer") | ||||
| 
 | ||||
|   ;;; libffi interface | ||||
| 
 | ||||
|  | @ -202,8 +208,8 @@ | |||
|               argtypes-n | ||||
|               rtype-n))) | ||||
| 
 | ||||
|   (define (make-callout rtype argtypes) | ||||
|     (define who 'make-callout) | ||||
|   (define (make-c-callout rtype argtypes) | ||||
|     (define who 'make-c-callout) | ||||
|     (let-values ([(cif argtypes-n rtype-n) | ||||
|                   (ffi-prep-cif rtype argtypes)]) | ||||
|       (let* ([argtypes-vec (list->vector argtypes)] | ||||
|  | @ -228,11 +234,11 @@ | |||
|                 checkers argtypes-vec argsvec) | ||||
|               (foreign-call "ikrt_ffi_call" data argsvec))))))) | ||||
| 
 | ||||
|   (define (make-callback rtype argtypes) | ||||
|   (define (make-c-callback rtype argtypes) | ||||
|     (let-values ([(cif argtypes-n rtype-n) | ||||
|                   (ffi-prep-cif rtype argtypes)]) | ||||
|       (lambda (proc) | ||||
|         (define who 'make-callback) | ||||
|         (define who 'make-c-callback) | ||||
|         (unless (procedure? proc) | ||||
|           (die who "not a procedure")) | ||||
|         (let ([proc  | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 1622 | ||||
| 1623 | ||||
|  |  | |||
|  | @ -1455,36 +1455,36 @@ | |||
|     [cp0-effort-limit i] | ||||
|     [tag-analysis-output i] | ||||
|     [perform-tag-analysis i] | ||||
|     [pointer?                   $for] | ||||
|     [pointer->integer           $for] | ||||
|     [integer->pointer           $for] | ||||
|     [dlopen                     $for] | ||||
|     [dlerror                    $for] | ||||
|     [dlclose                    $for] | ||||
|     [dlsym                      $for] | ||||
|     [malloc                     $for] | ||||
|     [free                       $for] | ||||
|     [pointer-ref-signed-char    $for] | ||||
|     [pointer-ref-signed-short   $for] | ||||
|     [pointer-ref-signed-int     $for] | ||||
|     [pointer-ref-signed-long    $for] | ||||
|     [pointer-ref-unsigned-char  $for] | ||||
|     [pointer-ref-unsigned-short $for] | ||||
|     [pointer-ref-unsigned-int   $for] | ||||
|     [pointer-ref-unsigned-long  $for] | ||||
|     [pointer-set-char           $for] | ||||
|     [pointer-set-short          $for] | ||||
|     [pointer-set-int            $for] | ||||
|     [pointer-set-long           $for] | ||||
|     [pointer-set-pointer        $for] | ||||
|     [pointer-ref-pointer        $for] | ||||
|     [pointer-set-float          $for] | ||||
|     [pointer-ref-float          $for] | ||||
|     [pointer-set-double         $for] | ||||
|     [pointer-ref-double         $for] | ||||
|     [make-callout               $for] | ||||
|     [make-callback              $for] | ||||
|     [host-info                     i] | ||||
|     [pointer?                     $for] | ||||
|     [pointer->integer             $for] | ||||
|     [integer->pointer             $for] | ||||
|     [dlopen                       $for] | ||||
|     [dlerror                      $for] | ||||
|     [dlclose                      $for] | ||||
|     [dlsym                        $for] | ||||
|     [malloc                       $for] | ||||
|     [free                         $for] | ||||
|     [pointer-ref-c-signed-char    $for] | ||||
|     [pointer-ref-c-signed-short   $for] | ||||
|     [pointer-ref-c-signed-int     $for] | ||||
|     [pointer-ref-c-signed-long    $for] | ||||
|     [pointer-ref-c-unsigned-char  $for] | ||||
|     [pointer-ref-c-unsigned-short $for] | ||||
|     [pointer-ref-c-unsigned-int   $for] | ||||
|     [pointer-ref-c-unsigned-long  $for] | ||||
|     [pointer-ref-c-float          $for] | ||||
|     [pointer-ref-c-double         $for] | ||||
|     [pointer-ref-c-pointer        $for] | ||||
|     [pointer-set-c-char!          $for] | ||||
|     [pointer-set-c-short!         $for] | ||||
|     [pointer-set-c-int!           $for] | ||||
|     [pointer-set-c-long!          $for] | ||||
|     [pointer-set-c-pointer!       $for] | ||||
|     [pointer-set-c-float!         $for] | ||||
|     [pointer-set-c-double!        $for] | ||||
|     [make-c-callout               $for] | ||||
|     [make-c-callback              $for] | ||||
|     [host-info                       i] | ||||
| 
 | ||||
|   )) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum