From add23459c0083c571b3c217353d7b9e6ba93f60e Mon Sep 17 00:00:00 2001 From: Stuart Sierra Date: Tue, 13 Nov 2012 14:50:54 -0500 Subject: [PATCH] CLJ-1107: Throw exception for 'get' called on unsupported types Before this patch, clojure.core/get defaults to returning nil when it is called on a type which it does not support. After this patch, clojure.core/get throws an exception if it is called on a non-Associative type. This provides more visibility for common mistakes such as (:foo r) where r is a Ref or Atom containing a map. This change uncovered some incorrect syntax in a Clojure test file for multimethods. One extra change was needed in core_deftype.clj to return an appropriate error message in clojure.core/extend. --- src/clj/clojure/core_deftype.clj | 3 ++- src/jvm/clojure/lang/RT.java | 2 +- test/clojure/test_clojure/data_structures.clj | 1 + test/clojure/test_clojure/multimethods.clj | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj index 471d3fe..d26b5fc 100644 --- a/src/clj/clojure/core_deftype.clj +++ b/src/clj/clojure/core_deftype.clj @@ -527,7 +527,8 @@ ditto for method impls defined with deftype, defrecord, and reify.")))) (defn- protocol? [maybe-p] - (boolean (:on-interface maybe-p))) + (try (boolean (:on-interface maybe-p)) + (catch Exception _ false))) (defn- implements? [protocol atype] (and atype (.isAssignableFrom ^Class (:on-interface protocol) atype))) diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index cea1bb5..7db1188 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -655,7 +655,7 @@ static Object getFrom(Object coll, Object key){ return null; } - return null; + throw new IllegalArgumentException("get not supported on type: " + coll.getClass().getName()); } static public Object get(Object coll, Object key, Object notFound){ diff --git a/test/clojure/test_clojure/data_structures.clj b/test/clojure/test_clojure/data_structures.clj index 3d913b3..72cebb1 100644 --- a/test/clojure/test_clojure/data_structures.clj +++ b/test/clojure/test_clojure/data_structures.clj @@ -558,6 +558,7 @@ (deftest test-get (let [m {:a 1, :b 2, :c {:d 3, :e 4}, :f nil, :g false, nil {:h 5}}] (is (thrown? IllegalArgumentException (get-in {:a 1} 5))) + (is (thrown? IllegalArgumentException (get 5 :a))) (are [x y] (= x y) (get m :a) 1 (get m :e) nil diff --git a/test/clojure/test_clojure/multimethods.clj b/test/clojure/test_clojure/multimethods.clj index b3539b3..b511ea6 100644 --- a/test/clojure/test_clojure/multimethods.clj +++ b/test/clojure/test_clojure/multimethods.clj @@ -228,7 +228,7 @@ (defmethod simple :a [x] :a) (defmethod simple :b [x] :b) (is (fn? (get-method simple :a))) - (= (:a ((get-method simple :a) 1))) + (is (= :a ((get-method simple :a) nil))) (is (fn? (get-method simple :b))) - (= (:b ((get-method simple :b) 1))) + (is (= :b ((get-method simple :b) nil))) (is (nil? (get-method simple :c))))) -- 1.7.7.4