summaryrefslogtreecommitdiff
path: root/src/jvm/clojure/lang/Module.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jvm/clojure/lang/Module.java')
-rw-r--r--src/jvm/clojure/lang/Module.java39
1 files changed, 20 insertions, 19 deletions
diff --git a/src/jvm/clojure/lang/Module.java b/src/jvm/clojure/lang/Module.java
index c33e57a5..85d7a1cd 100644
--- a/src/jvm/clojure/lang/Module.java
+++ b/src/jvm/clojure/lang/Module.java
@@ -12,15 +12,14 @@
package clojure.lang;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
+import java.util.concurrent.ConcurrentHashMap;
public class Module{
/**
* String->Module
*/
-static final public TRef<IPersistentMap> table = new TRef(PersistentHashMap.EMPTY);
+static final public ConcurrentHashMap<String, Module> table = new ConcurrentHashMap();
/**
* Symbol->Var
@@ -32,32 +31,34 @@ Module(String name){
this.name = name;
}
-static public Module find(String name) throws Exception{
- return (Module) table.get().get(name);
+static public Module findModule(String name) throws Exception{
+ return table.get(name);
}
-static public Module findOrCreate(String name) throws Exception{
- //must be called in transaction
- Module ns = find(name);
- if(ns == null)
- table.set(table.get().assoc(name, ns = new Module(name)));
- return ns;
+static public Module findOrCreateModule(String name) throws Exception{
+ Module module = findModule(name);
+ if(module == null)
+ module = table.putIfAbsent(name, new Module(name));
+ return module;
}
-static public Var intern(String ns, String name) throws Exception{
- return findOrCreate(ns).intern(new Symbol(name));
+public TRef findRef(String name) throws Exception{
+ return (TRef) vars.val().valAt(name);
}
-public Var find(Symbol sym) throws Exception{
- return (Var) vars.get().get(sym);
+public static TRef intern(String moduleName, String name) throws Exception{
+ Module module = findModule(name);
+ if(module == null)
+ throw new Exception(String.format("Module %s not found", moduleName));
+ return module.intern(name);
}
-public Var intern(Symbol sym) throws Exception{
+public TRef intern(String name) throws Exception{
//must be called in transaction
- IPersistentMap varmap = vars.get();
- Var var = (Var) varmap.get(sym);
+ IPersistentMap varmap = vars.val();
+ TRef var = (TRef) varmap.valAt(name);
if(var == null)
- vars.set(varmap.assoc(sym, var = new Var(sym, this)));
+ vars.set(varmap.assoc(name, var = new TRef()));
return var;
}