Fix use of CAMLparam etc macros.
[perl4caml.git] / perl_c.c
index 1a6b1ef..ce53667 100644 (file)
--- a/perl_c.c
+++ b/perl_c.c
@@ -1,6 +1,22 @@
 /* Interface to Perl from OCaml.
- * Copyright (C) 2003 Merjis Ltd.
- * $Id: perl_c.c,v 1.23 2005-04-14 13:05:12 rich Exp $
+   Copyright (C) 2003 Merjis Ltd.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this library; see the file COPYING.  If not, write to
+   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.
+
+   $Id: perl_c.c,v 1.25 2008-03-01 13:02:21 rich Exp $
  */
 
 #include <stdio.h>
@@ -117,7 +133,7 @@ CAMLprim value
 perl4caml_sv_of_float (value fv)
 {
   CAMLparam1 (fv);
-  CAMLreturn (Val_sv (newSViv (Double_val (fv))));
+  CAMLreturn (Val_sv (newSVnv (Double_val (fv))));
 }
 
 CAMLprim value
@@ -183,12 +199,17 @@ perl4caml_sv_no (value unit)
 static int
 sv_type (SV *sv)
 {
+#if PERL_VERSION >= 11
+  if (SvROK(sv)) return 4;
+#endif
   switch (SvTYPE (sv))
     {
     case SVt_IV: return 1;
     case SVt_NV: return 2;
     case SVt_PV: return 3;
+#if PERL_VERSION < 11
     case SVt_RV: return 4;
+#endif
     case SVt_PVAV: return 5;
     case SVt_PVHV: return 6;
     case SVt_PVCV: return 7;
@@ -286,7 +307,9 @@ perl4caml_deref (value svv)
   case SVt_IV:
   case SVt_NV:
   case SVt_PV:
+#if PERL_VERSION < 11
   case SVt_RV:
+#endif
   case SVt_PVMG:
     break;
   default:
@@ -696,11 +719,13 @@ perl4caml_get_hv (value optcreate, value name)
 static inline void
 check_perl_failure ()
 {
+  CAMLparam0 ();
+  CAMLlocal1 (errv);
+
   SV *errsv = get_sv ("@", TRUE);
 
   if (SvTRUE (errsv))          /* Equivalent of $@ in Perl. */
     {
-      CAMLlocal1 (errv);
       STRLEN n_a;
       const char *err = SvPV (errsv, n_a);
 
@@ -708,6 +733,8 @@ check_perl_failure ()
 
       caml_raise_with_arg (*caml_named_value ("perl4caml_perl_failure"), errv);
     }
+
+  CAMLreturn0;
 }
 
 CAMLprim value