1 21 22 package org.armedbear.lisp; 23 24 import java.util.HashMap ; 25 import java.util.Map ; 26 import java.util.WeakHashMap ; 27 28 public final class JHandler extends Lisp 29 { 30 private static final Map table = new WeakHashMap (); 31 32 public static void callLisp (String s, Object o) 33 { 34 callLisp(s, o, ""); 35 } 36 37 public static void callLisp (String s, Object o, String s1) 38 { 39 callLisp(s, o, s1, new int[] {}); 40 } 41 42 public static void callLisp (String s, Object o, String s1, int ai[]) { 43 callLisp(s, o, new String [] { s1 }, ai); 44 } 45 46 public static void callLisp (String s, Object o, String as[]) 47 { 48 callLisp(s, o, as, new int[] {}); 49 } 50 51 public static void callLisp (String s, Object o, String as[], int ai[]) 52 { 53 if (table.containsKey(o)) { 54 Map entryTable = (Map )table.get(o); 55 if (entryTable.containsKey(s)) { 56 Function f = ((Entry)entryTable.get(s)).getHandler(); 57 LispObject data = ((Entry)entryTable.get(s)).getData(); 58 Fixnum count = ((Entry)entryTable.get(s)).getCount(); 59 Fixnum[] lispAi = new Fixnum[ai.length]; 60 for (int i = 0; i < ai.length; i++) { 61 lispAi[i] = new Fixnum(ai[i]); 62 } 63 LispObject lispAiVector = new SimpleVector(lispAi); 64 SimpleString[] lispAs = new SimpleString[as.length]; 65 for (int i = 0; i < as.length; i++) { 66 lispAs[i] = new SimpleString(as[i]); 67 } 68 LispObject lispAsVector = new SimpleVector(lispAs); 69 LispObject[] args = new LispObject[] { data, new JavaObject(o), lispAiVector, lispAsVector, Keyword.internKeyword(s), count }; 71 try { 72 f.execute(args); 73 } 74 catch (ConditionThrowable t) { 75 t.printStackTrace(); 76 } 77 } 78 } 79 } 80 81 private static final Primitive _JREGISTER_HANDLER = 83 new Primitive("%jregister-handler", PACKAGE_JAVA) 84 { 85 public LispObject execute(LispObject[] args) throws ConditionThrowable 86 { 87 if (args.length != 5) 88 return signal(new WrongNumberOfArgumentsException(this)); 89 Map entryTable = null; 90 Object object = args[0].javaInstance(); 91 String event = ((Symbol)args[1]).getName(); 92 if (!table.containsKey(object)) { 93 entryTable = new HashMap (); 94 table.put(object,entryTable); 95 } else { 96 entryTable = (Map )table.get(object); 97 } 98 Entry entry = new Entry((Function) args[2], args[3], event, entryTable); 99 if (args[4] != NIL) 100 entry.addCount(((Fixnum)args[4]).getValue()); 101 entryTable.put(event,entry); 102 return T; 103 } 104 }; 105 106 private static class Entry 107 { 108 Function handler; 109 LispObject data; 110 int count = -1; 111 Map entryTable; 112 String event; 113 114 public Entry (Function handler, LispObject data, String event, Map entryTable) 115 { 116 this.entryTable = entryTable; 117 this.event = event; 118 this.handler = handler; 119 this.data = data; 120 } 121 122 public Function getHandler () 123 { 124 return handler; 125 } 126 127 public void addData (LispObject data) 128 { 129 this.data = data; 130 } 131 132 public LispObject getData () 133 { 134 return data; 135 } 136 137 public void addCount (int count) 138 { 139 this.count = count; 140 } 141 142 public Fixnum getCount () 143 { 144 if (count == 0) 145 entryTable.remove(event); 146 return (new Fixnum (count--)); 147 } 148 } 149 } 150 | Popular Tags |