diff options
author | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-22 14:28:33 -0400 |
---|---|---|
committer | Stuart Halloway <stu@thinkrelevance.com> | 2010-05-24 10:45:24 -0400 |
commit | 050693123206c0b46c990f17fe127a61bd50edb9 (patch) | |
tree | 5b80cfc032068fccef3135f3e6ac89553cf4a46d /src/jvm/clojure | |
parent | a6f755c2ac5873c0286d090c0022d345e3e6c9e3 (diff) |
fix NPE if redefined protocol removes method #333 (Mike Hinchey)
Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 8ce076d4..2b382989 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -2816,8 +2816,15 @@ static class InvokeExpr implements Expr{ if(this.protocolOn != null) { IPersistentMap mmap = (IPersistentMap) RT.get(pvar.get(), methodMapKey); - String mname = munge(((Keyword) mmap.valAt(Keyword.intern(fvar.sym))).sym.toString()); - List methods = Reflector.getMethods(protocolOn, args.count() - 1, mname, false); + Keyword mmapVal = (Keyword) mmap.valAt(Keyword.intern(fvar.sym)); + if (mmapVal == null) { + throw new IllegalArgumentException( + "No method of interface: " + protocolOn.getName() + + " found for function: " + fvar.sym + " of protocol: " + pvar.sym + + " (The protocol method may have been defined before and removed.)"); + } + String mname = munge(mmapVal.sym.toString()); + List methods = Reflector.getMethods(protocolOn, args.count() - 1, mname, false); if(methods.size() != 1) throw new IllegalArgumentException( "No single method: " + mname + " of interface: " + protocolOn.getName() + |