runtime/ffi: Save/restore floenv around callouts.
authorMatt Birkholz <matt@birchwood-abbey.net>
Fri, 1 Jun 2018 21:17:58 +0000 (14:17 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Tue, 5 Jun 2018 07:43:03 +0000 (00:43 -0700)
The c-call primitive can "alienate" the floenv, but cooperating with
c-call-continue to save/restore it is... more difficult than doing it
in Scheme.

And fix some trailing whitespace, indentation.

src/runtime/ffi.scm

index 7acd8f1e3f63c051d01c47676fd42063e13dc600..4c5dd86892c1ca3e3d4ea7ad84d3c4fd9d2388a1 100644 (file)
@@ -228,7 +228,7 @@ USA.
 (define-integrable alien-function/filename %alien-function/filename)
 
 (define-integrable (alien-function/name alienf)
-  (string-tail (%alien-function/name alienf) 4)) 
+  (string-tail (%alien-function/name alienf) 4))
 
 (define (%set-alien-function/address! alienf address)
   (let ((qr (integer-divide address %radix)))
@@ -362,15 +362,18 @@ USA.
   (guarantee-alien-function alien-function 'call-alien)
   (alien-function-cache! alien-function)
   (for-each
-   (lambda (arg)
-     (if (alien-function? arg)
-        (alien-function-cache! arg)))
-   args)
+    (lambda (arg)
+      (if (alien-function? arg)
+         (alien-function-cache! arg)))
+    args)
   (with-thread-events-blocked
    (lambda ()
      (without-interrupts
       (lambda ()
-       (call-alien* alien-function args))))))
+       (let* ((saved (flo:environment))
+              (value (call-alien* alien-function args)))
+         (flo:set-environment! saved)
+         value))))))
 
 #;(define-integrable (call-alien* alien-function args)
   (apply (ucode-primitive c-call -1) alien-function args))