use grok_number instead of strtol
Yuval Kogman [Thu, 21 Aug 2008 11:17:08 +0000 (11:17 +0000)]
Moose.xs
t/700_xs/001_basic.t

index 685f565..facae15 100644 (file)
--- a/Moose.xs
+++ b/Moose.xs
@@ -434,23 +434,10 @@ STATIC bool check_sv_type (TC type, SV *sv) {
             if ( SvIOK(sv) ) {
                 return 1;
             } else if ( SvPOK(sv) ) {
-                /* FIXME i really don't like this */
-                int i;
                 STRLEN len;
                 char *pv = SvPV(sv, len);
-                char *end = pv + len;
-                char *tail = end;
-
-                errno = 0;
-                i = strtol(pv, &tail, 0);
-
-                if ( errno ) return 0;
-
-                while ( tail != end ) {
-                    if ( !isspace(*tail++) ) return 0;
-                }
-
-                return 1;
+                int flags = grok_number(pv, len, NULL);
+                return ( flags && !(flags & IS_NUMBER_NOT_INT) );
             }
             return 0;
             break;
index f9c9c0a..27d3460 100644 (file)
@@ -215,6 +215,7 @@ ok( !eval { $foo->i(1.3); 1 }, "Int" );
 ok( !eval { $foo->i("1.3"); 1 }, "Int" );
 ok( !eval { $foo->i("foo"); 1 }, "Int" );
 ok( !eval { $foo->i(undef); 1 }, "Int" );
+ok( !eval { $foo->i(\undef); 1 }, "Int" );
 ok( !eval { $foo->s(undef); 1 }, "Str" );
 ok( !eval { $foo->s([]); 1 }, "Str" );
 ok( !eval { $foo->o({}); 1 }, "Object" );