]> granicus.if.org Git - jq/commitdiff
add checking of numeric indices to an array to see if they can reasonably be consider...
authorDavid R. MacIver <david@drmaciver.com>
Tue, 10 Dec 2013 09:17:30 +0000 (09:17 +0000)
committerDavid R. MacIver <david@drmaciver.com>
Tue, 10 Dec 2013 09:20:12 +0000 (09:20 +0000)
jv.c
jv.h
jv_aux.c
tests/all.test

diff --git a/jv.c b/jv.c
index eea6a290a7696f15f1fc71faf238f1f1e8423405..d1ae8d907a0f6aa2759ce33bf39af29eaa086488 100644 (file)
--- a/jv.c
+++ b/jv.c
@@ -5,6 +5,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdarg.h>
+#include <limits.h>
 
 #include "jv_alloc.h"
 #include "jv.h"
@@ -140,6 +141,17 @@ double jv_number_value(jv j) {
   return j.u.number;
 }
 
+int jv_is_integer(jv j){
+  if(jv_get_kind(j) != JV_KIND_NUMBER){
+    return 0;
+  }
+  double x = jv_number_value(j);
+  if(x != x || x > INT_MAX || x < INT_MIN){
+    return 0;
+  }
+
+  return x == (int)x;
+}
 
 /*
  * Arrays (internal helpers)
diff --git a/jv.h b/jv.h
index 8d61d104474fe19c2eb55afa03531ce74a689d05..70024735f990b6a3f1dee6afe80b6f23631496c6 100644 (file)
--- a/jv.h
+++ b/jv.h
@@ -60,6 +60,7 @@ jv jv_bool(int);
 
 jv jv_number(double);
 double jv_number_value(jv);
+int jv_is_integer(jv);
 
 jv jv_array();
 jv jv_array_sized(int);
index 76712aee130e1c73cc1bdbc91e24185bde7d30d1..e994053d86d99b874141913d0e42d8db3eb34513 100644 (file)
--- a/jv_aux.c
+++ b/jv_aux.c
@@ -51,10 +51,15 @@ jv jv_get(jv t, jv k) {
       v = jv_null();
     }
   } else if (jv_get_kind(t) == JV_KIND_ARRAY && jv_get_kind(k) == JV_KIND_NUMBER) {
-    // FIXME: don't do lookup for noninteger index
-    v = jv_array_get(t, (int)jv_number_value(k));
-    if (!jv_is_valid(v)) {
-      jv_free(v);
+    if(jv_is_integer(k)){
+      v = jv_array_get(t, (int)jv_number_value(k));
+      if (!jv_is_valid(v)) {
+        jv_free(v);
+        v = jv_null();
+      }
+    } else {
+      jv_free(t);
+      jv_free(k);
       v = jv_null();
     }
   } else if (jv_get_kind(t) == JV_KIND_ARRAY && jv_get_kind(k) == JV_KIND_OBJECT) {
index 71918a6fad915d0b21af486f592e59870e9475f7..15e075d4becd1bb0044a9d7d53df3bc0a0f9811f 100644 (file)
@@ -718,3 +718,7 @@ map(has(2))
 keys
 [42,3,35]
 [0,1,2]
+
+[][.]
+1000000000000000000
+null