ffi: Add flovec_* functions and abort_to_c for shims.
authorMatt Birkholz <matt@birkholz.chandler.az.us>
Thu, 31 Oct 2013 19:23:20 +0000 (12:23 -0700)
committerMatt Birkholz <matt@birkholz.chandler.az.us>
Thu, 31 Oct 2013 19:23:20 +0000 (12:23 -0700)
Add flovec_length, flovec_loc and flovec_ref.  The abort_to_c function
allows the Gtk shim's run_gtk() to stop Scheme and return to the
toolkit.

src/microcode/pruxffi.c
src/microcode/pruxffi.h

index 0f3f35f9170da5cfa966c085a895b6c5ea083bce..cbef761d6085dc61691af4ed2a81a542064b515a 100644 (file)
@@ -697,6 +697,15 @@ DEFINE_PRIMITIVE ("RETURN-TO-C", Prim_return_to_c, 0, 0, 0)
   }
 }
 
+/* This is mainly for src/gtk/gtkio.c, so it does not need to include
+   prim.h, scheme.h and everything. */
+void
+abort_to_c (void)
+{
+  PRIMITIVE_ABORT (PRIM_RETURN_TO_C);
+  /* NOTREACHED */
+}
+
 char *
 callback_lunseal (CallbackKernel expected)
 {
@@ -824,11 +833,11 @@ arg_alien_entry (int argn)
 void *
 arg_pointer (int argn)
 {
-  /* Accept an alien, string, xstring handle (positive integer),
-     or zero (for a NULL pointer). */
+  /* Accept an alien, string, flovec, xstring handle (positive
+     integer), or zero (for a NULL pointer). */
 
   SCM arg = ARG_REF (argn);
-  if (integer_zero_p (arg))
+  if ((INTEGER_P (arg)) && (integer_zero_p (arg)))
     return ((void *)0);
   if (STRING_P (arg))
     return ((void *) (STRING_POINTER (arg)));
@@ -841,6 +850,8 @@ arg_pointer (int argn)
     }
   if (is_alien (arg))
     return (alien_address (arg));
+  if (FLONUM_P (arg))
+    return ((void *) (OBJECT_ADDRESS (arg)));
 
   error_wrong_type_arg (argn);
   /*NOTREACHED*/
@@ -1056,6 +1067,27 @@ empty_list (void)
   return (EMPTY_LIST);
 }
 
+int
+flovec_length (SCM vector)
+{
+  return (FLOATING_VECTOR_LENGTH (vector));
+}
+
+double*
+flovec_loc (SCM vector)
+{
+  return (FLOATING_VECTOR_LOC (vector, 0));
+}
+
+double
+flovec_ref (SCM vector, int index)
+{
+  int len = FLOATING_VECTOR_LENGTH (vector);
+  if (0 <= index && index < len)
+    return (FLOATING_VECTOR_REF (vector, index));
+  error_external_return ();
+}
+
 DEFINE_PRIMITIVE ("OUTF-ERROR", Prim_outf_error, 1, 1, 0)
 {
   /* To avoid the normal i/o system when debugging a callback. */
index 017d64ac52a931c72a93c02434f357be92e41884..59c6465ec63a57d059cfe80b49fb6fe9b0fb3b58 100644 (file)
@@ -90,6 +90,9 @@ extern void* pointer_value (void);
 extern void check_number_of_args (int num);
 extern SCM unspecific (void);
 extern SCM empty_list (void);
+extern int flovec_length (SCM vector);
+extern double* flovec_loc (SCM vector);
+extern double flovec_ref (SCM vector, int index);
 
 #ifndef MIT_SCHEME /* Do not include in the microcode, just shims. */
 extern SCM cons (SCM car, SCM cdr);