add prototype to decode_json when using JSON::PP pp-proto
Graham Knop [Fri, 11 Dec 2015 11:54:37 +0000 (06:54 -0500)]
JSON::PP's decode_json function doesn't have a prototype, unlike
Cpanel::JSON::XS and JSON::XS.  We always want to export the same
prototypes, so wrap JSON::PP::decode_json in a prototyped sub.

lib/JSON/MaybeXS.pm
t/pp.t

index 6898131..8910452 100644 (file)
@@ -28,7 +28,20 @@ sub _choose_json_module {
 
 BEGIN {
     our $JSON_Class = _choose_json_module();
-    $JSON_Class->import(qw(encode_json decode_json));
+
+    if ($JSON_Class eq 'JSON::PP') {
+        $JSON_Class->import(qw(encode_json));
+        eval '#line ' . __LINE__ . ' "' . __FILE__ . '"' . q{
+            package JSON::PP;
+            sub JSON::MaybeXS::decode_json ($) {
+                &decode_json;
+            }
+            1;
+        } or die $@;
+    }
+    else {
+        $JSON_Class->import(qw(encode_json decode_json));
+    }
 }
 
 our @EXPORT = qw(encode_json decode_json JSON);
diff --git a/t/pp.t b/t/pp.t
index 9a74a9e..5520a64 100644 (file)
--- a/t/pp.t
+++ b/t/pp.t
@@ -15,10 +15,15 @@ is(
   'Correct encode_json function'
 );
 
-is(
-  \&decode_json, \&JSON::PP::decode_json,
-  'Correct encode_json function'
-);
+is prototype \&decode_json, '$',
+  'decode_json has correct prototype';
+
+is_deeply decode_json '[]', [],
+  'decode_json works as expected';
+
+eval { decode_json undef }; my $msg = ' at ' . __FILE__ . ' line ' . __LINE__;
+like $@, qr/\Q$msg\E/,
+  'decode_json reports error at correct location';
 
 require 't/lib/is_bool.pm';