summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-07 18:17:36 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-07 18:17:36 +0000
commit236855e91b23ee35947233d8d4da6ab5c8a760f0 (patch)
treee064d36a6ce7fa123dc48ee0643c8ba49569a230 /src
parente50ef0f6ae3215545c0efd02a72a2793fdc67812 (diff)
added empty collection expressions
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java32
-rw-r--r--src/jvm/clojure/lang/PersistentVector.java2
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;