From 2e7e41c9788b9cc02fe070d8e5319929d996ee32 Mon Sep 17 00:00:00 2001 From: Rich Hickey Date: Thu, 5 Nov 2009 12:07:43 -0500 Subject: install default lookup thunk for non-field accessors of IKeywordLookups --- src/jvm/clojure/lang/KeywordLookupSite.java | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/jvm/clojure/lang/KeywordLookupSite.java b/src/jvm/clojure/lang/KeywordLookupSite.java index 813f754f..02ddfffa 100644 --- a/src/jvm/clojure/lang/KeywordLookupSite.java +++ b/src/jvm/clojure/lang/KeywordLookupSite.java @@ -29,15 +29,7 @@ public Object fault(Object target, ILookupHost host){ } else if(target instanceof ILookup) { - final Class c = target.getClass(); - host.swapThunk(n,new ILookupThunk(){ - - public Object get(Object target){ - if(target != null && target.getClass() == c) - return ((ILookup) target).valAt(k); - return this; - } - }); + host.swapThunk(n,ilookupThunk(target.getClass())); return ((ILookup) target).valAt(k); } host.swapThunk(n,this); @@ -50,9 +42,24 @@ public Object get(Object target){ return RT.get(target,k); } +private ILookupThunk ilookupThunk(final Class c){ + return new ILookupThunk(){ + public Object get(Object target){ + if(target != null && target.getClass() == c) + return ((ILookup) target).valAt(k); + return this; + } + }; +} + private Object install(Object target, ILookupHost host){ ILookupThunk t = ((IKeywordLookup)target).getLookupThunk(k); - host.swapThunk(n,t); - return t.get(target); + if(t != null) + { + host.swapThunk(n,t); + return t.get(target); + } + host.swapThunk(n,ilookupThunk(target.getClass())); + return ((ILookup) target).valAt(k); } } -- cgit v1.2.3-70-g09d2