annotate src/clojure/lang/MethodImplCache.java @ 10:ef7dbbd6452c

added clojure source goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 21 Aug 2010 06:25:44 -0400
parents
children
rev   line source
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 8, 2009 */
rlm@10 12
rlm@10 13 package clojure.lang;
rlm@10 14
rlm@10 15 public final class MethodImplCache{
rlm@10 16
rlm@10 17 static public class Entry{
rlm@10 18 final public Class c;
rlm@10 19 final public IFn fn;
rlm@10 20
rlm@10 21 public Entry(Class c, IFn fn){
rlm@10 22 this.c = c;
rlm@10 23 this.fn = fn;
rlm@10 24 }
rlm@10 25 }
rlm@10 26
rlm@10 27 public final IPersistentMap protocol;
rlm@10 28 public final Keyword methodk;
rlm@10 29 public final int shift;
rlm@10 30 public final int mask;
rlm@10 31 public final Object[] table; //[class, entry. class, entry ...]
rlm@10 32
rlm@10 33 volatile Entry mre = null;
rlm@10 34
rlm@10 35 public MethodImplCache(IPersistentMap protocol, Keyword methodk){
rlm@10 36 this(protocol, methodk, 0, 0, RT.EMPTY_ARRAY);
rlm@10 37 }
rlm@10 38
rlm@10 39 public MethodImplCache(IPersistentMap protocol, Keyword methodk, int shift, int mask, Object[] table){
rlm@10 40 this.protocol = protocol;
rlm@10 41 this.methodk = methodk;
rlm@10 42 this.shift = shift;
rlm@10 43 this.mask = mask;
rlm@10 44 this.table = table;
rlm@10 45 }
rlm@10 46
rlm@10 47 public IFn fnFor(Class c){
rlm@10 48 Entry last = mre;
rlm@10 49 if(last != null && last.c == c)
rlm@10 50 return last.fn;
rlm@10 51 return findFnFor(c);
rlm@10 52 }
rlm@10 53
rlm@10 54 IFn findFnFor(Class c){
rlm@10 55 int idx = ((Util.hash(c) >> shift) & mask) << 1;
rlm@10 56 if(idx < table.length && table[idx] == c)
rlm@10 57 {
rlm@10 58 Entry e = ((Entry) table[idx + 1]);
rlm@10 59 mre = e;
rlm@10 60 return e != null ? e.fn : null;
rlm@10 61 }
rlm@10 62 return null;
rlm@10 63 }
rlm@10 64
rlm@10 65
rlm@10 66 }