summaryrefslogtreecommitdiff
path: root/src/jvm/clojure/lang/Symbol.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jvm/clojure/lang/Symbol.java')
-rw-r--r--src/jvm/clojure/lang/Symbol.java45
1 files changed, 23 insertions, 22 deletions
diff --git a/src/jvm/clojure/lang/Symbol.java b/src/jvm/clojure/lang/Symbol.java
index 4351f554..b825533e 100644
--- a/src/jvm/clojure/lang/Symbol.java
+++ b/src/jvm/clojure/lang/Symbol.java
@@ -17,6 +17,7 @@ public class Symbol extends Obj{
//these must be interned strings!
public final String ns;
public final String name;
+final int hash;
public String toString(){
if(ns != null)
@@ -24,39 +25,32 @@ public String toString(){
return name;
}
-public Symbol(String ns, String name){
- this.name = name.intern();
- if(ns != null)
- this.ns = ns.intern();
- else
- this.ns = null;
+static public Symbol intern(String ns, String name){
+ return new Symbol(ns == null ? null : ns.intern(), name.intern());
}
-public Symbol(String name){
- int i = name.indexOf('/');
+static public Symbol intern(String nsname){
+ int i = nsname.indexOf('/');
if(i == -1)
- {
- this.name = name.intern();
- this.ns = null;
- }
+ return new Symbol(null, nsname.intern());
else
- {
- this.ns = name.substring(0, i).intern();
- this.name = name.substring(i + 1).intern();
- }
+ return new Symbol(nsname.substring(0, i).intern(), nsname.substring(i + 1).intern());
}
+static public Symbol create(String ns_interned, String name_interned){
+ return new Symbol(ns_interned, name_interned);
+}
-private Symbol(IPersistentMap meta, String ns, String name){
- super(meta);
- this.name = name;
- this.ns = ns;
+private Symbol(String ns_interned, String name_interned){
+ this.name = name_interned;
+ this.ns = ns_interned;
+ this.hash = RT.hashCombine(name.hashCode(), RT.hash(ns));
}
public boolean equals(Object o){
if(this == o)
return true;
- if(o == null || !(o instanceof Symbol))
+ if(!(o instanceof Symbol))
return false;
Symbol symbol = (Symbol) o;
@@ -66,10 +60,17 @@ public boolean equals(Object o){
}
public int hashCode(){
- return RT.hashCombine(name.hashCode(), RT.hash(ns));
+ return hash;
}
public Obj withMeta(IPersistentMap meta){
return new Symbol(meta, ns, name);
}
+
+private Symbol(IPersistentMap meta, String ns, String name){
+ super(meta);
+ this.name = name;
+ this.ns = ns;
+ this.hash = RT.hashCombine(name.hashCode(), RT.hash(ns));
+}
}