rlm@10
|
1 /**
|
rlm@10
|
2 * Copyright (c) Rich Hickey. All rights reserved.
|
rlm@10
|
3 * The use and distribution terms for this software are covered by the
|
rlm@10
|
4 * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
rlm@10
|
5 * which can be found in the file epl-v10.html at the root of this distribution.
|
rlm@10
|
6 * By using this software in any fashion, you are agreeing to be bound by
|
rlm@10
|
7 * the terms of this license.
|
rlm@10
|
8 * You must not remove this notice, or any other, from this software.
|
rlm@10
|
9 **/
|
rlm@10
|
10
|
rlm@10
|
11 /* rich Nov 2, 2009 */
|
rlm@10
|
12
|
rlm@10
|
13 package clojure.lang;
|
rlm@10
|
14
|
rlm@10
|
15 public final class KeywordLookupSite implements ILookupSite, ILookupThunk{
|
rlm@10
|
16
|
rlm@10
|
17 final int n;
|
rlm@10
|
18 final Keyword k;
|
rlm@10
|
19
|
rlm@10
|
20 public KeywordLookupSite(int n, Keyword k){
|
rlm@10
|
21 this.n = n;
|
rlm@10
|
22 this.k = k;
|
rlm@10
|
23 }
|
rlm@10
|
24
|
rlm@10
|
25 public Object fault(Object target, ILookupHost host){
|
rlm@10
|
26 if(target instanceof IKeywordLookup)
|
rlm@10
|
27 {
|
rlm@10
|
28 return install(target, host);
|
rlm@10
|
29 }
|
rlm@10
|
30 else if(target instanceof ILookup)
|
rlm@10
|
31 {
|
rlm@10
|
32 host.swapThunk(n,ilookupThunk(target.getClass()));
|
rlm@10
|
33 return ((ILookup) target).valAt(k);
|
rlm@10
|
34 }
|
rlm@10
|
35 host.swapThunk(n,this);
|
rlm@10
|
36 return RT.get(target, k);
|
rlm@10
|
37 }
|
rlm@10
|
38
|
rlm@10
|
39 public Object get(Object target){
|
rlm@10
|
40 if(target instanceof IKeywordLookup || target instanceof ILookup)
|
rlm@10
|
41 return this;
|
rlm@10
|
42 return RT.get(target,k);
|
rlm@10
|
43 }
|
rlm@10
|
44
|
rlm@10
|
45 private ILookupThunk ilookupThunk(final Class c){
|
rlm@10
|
46 return new ILookupThunk(){
|
rlm@10
|
47 public Object get(Object target){
|
rlm@10
|
48 if(target != null && target.getClass() == c)
|
rlm@10
|
49 return ((ILookup) target).valAt(k);
|
rlm@10
|
50 return this;
|
rlm@10
|
51 }
|
rlm@10
|
52 };
|
rlm@10
|
53 }
|
rlm@10
|
54
|
rlm@10
|
55 private Object install(Object target, ILookupHost host){
|
rlm@10
|
56 ILookupThunk t = ((IKeywordLookup)target).getLookupThunk(k);
|
rlm@10
|
57 if(t != null)
|
rlm@10
|
58 {
|
rlm@10
|
59 host.swapThunk(n,t);
|
rlm@10
|
60 return t.get(target);
|
rlm@10
|
61 }
|
rlm@10
|
62 host.swapThunk(n,ilookupThunk(target.getClass()));
|
rlm@10
|
63 return ((ILookup) target).valAt(k);
|
rlm@10
|
64 }
|
rlm@10
|
65 }
|