diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-07 18:17:36 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-07 18:17:36 +0000 |
commit | 236855e91b23ee35947233d8d4da6ab5c8a760f0 (patch) | |
tree | e064d36a6ce7fa123dc48ee0643c8ba49569a230 /src | |
parent | e50ef0f6ae3215545c0efd02a72a2793fdc67812 (diff) |
added empty collection expressions
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 32 | ||||
-rw-r--r-- | src/jvm/clojure/lang/PersistentVector.java | 2 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index 6d03e799..1e65c211 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -923,6 +923,36 @@ static String munge(String name){ return sb.toString(); } +static class EmptyExpr implements Expr{ + final Object coll; + final static Type HASHMAP_TYPE = Type.getType(PersistentHashMap.class); + final static Type VECTOR_TYPE = Type.getType(PersistentVector.class); + final static Type LIST_TYPE = Type.getType(PersistentList.class); + + + public EmptyExpr(Object coll){ + this.coll = coll; + } + + public Object eval() throws Exception{ + return coll; + } + + public void emit(C context, FnExpr fn, GeneratorAdapter gen){ + if(context != C.STATEMENT) + { + if(coll instanceof IPersistentList) + gen.getStatic(LIST_TYPE, "EMPTY", LIST_TYPE); + else if(coll instanceof IPersistentVector) + gen.getStatic(VECTOR_TYPE, "EMPTY", VECTOR_TYPE); + else if(coll instanceof IPersistentMap) + gen.getStatic(HASHMAP_TYPE, "EMPTY", HASHMAP_TYPE); + else + throw new UnsupportedOperationException("Unknown Collection type"); + } + } +} + static class MapExpr implements Expr{ final IPersistentVector keyvals; final static Method mapMethod = Method.getMethod("clojure.lang.IPersistentMap map(Object[])"); @@ -1650,6 +1680,8 @@ private static Expr analyze(C context, Object form, String name) throws Exceptio return new StringExpr((String) form); else if(fclass == Character.class) return new CharExpr((Character) form); + else if(form instanceof IPersistentCollection && ((IPersistentCollection) form).count() == 0) + return new EmptyExpr(form); else if(form instanceof ISeq) return analyzeSeq(context, (ISeq) form, name); else if(form instanceof IPersistentVector) diff --git a/src/jvm/clojure/lang/PersistentVector.java b/src/jvm/clojure/lang/PersistentVector.java index d5f342c8..0f1c9d0e 100644 --- a/src/jvm/clojure/lang/PersistentVector.java +++ b/src/jvm/clojure/lang/PersistentVector.java @@ -14,7 +14,7 @@ package clojure.lang; import java.util.*; -public class PersistentVector extends Obj implements IPersistentVector, IPersistentList, Iterable{ +public class PersistentVector extends Obj implements IPersistentVector, Iterable{ final int cnt; final int shift; final Object[] root; |