[Jython-checkins] jython: Set literals.

frank.wierzbicki jython-checkins at python.org
Wed Mar 7 05:27:21 CET 2012


http://hg.python.org/jython/rev/039641b01639
changeset:   6313:039641b01639
parent:      6308:e49a734162b9
user:        Frank Wierzbicki <fwierzbicki at gmail.com>
date:        Tue Mar 06 15:27:30 2012 -0800
summary:
  Set literals.

files:
  ast/Python.asdl                           |    9 +-
  grammar/Python.g                          |   39 +-
  src/org/python/antlr/ast/DictComp.java    |  225 ++++++++++
  src/org/python/antlr/ast/Set.java         |  171 +++++++
  src/org/python/antlr/ast/SetComp.java     |  197 ++++++++
  src/org/python/antlr/ast/VisitorBase.java |   18 +
  src/org/python/antlr/ast/VisitorIF.java   |    3 +
  src/org/python/compiler/CodeCompiler.java |   15 +
  src/org/python/core/BaseSet.java          |   13 +
  src/org/python/core/PySet.java            |    4 +
  10 files changed, 679 insertions(+), 15 deletions(-)


diff --git a/ast/Python.asdl b/ast/Python.asdl
--- a/ast/Python.asdl
+++ b/ast/Python.asdl
@@ -1,6 +1,6 @@
 -- ASDL's five builtin types are identifier, int, string, object, bool
 
-module Python version "$Revision: 62047 $"
+module Python version "$Revision$"
 {
 	mod = Module(stmt* body)
 	    | Interactive(stmt* body)
@@ -11,7 +11,7 @@
 
 	stmt = FunctionDef(identifier name, arguments args, 
                             stmt* body, expr* decorator_list)
-	      | ClassDef(identifier name, expr* bases, stmt* body, expr *decorator_list)
+	      | ClassDef(identifier name, expr* bases, stmt* body, expr* decorator_list)
 	      | Return(expr? value)
 
 	      | Delete(expr* targets)
@@ -34,7 +34,7 @@
 	      | Assert(expr test, expr? msg)
 
 	      | Import(alias* names)
-	      | ImportFrom(identifier module, alias* names, int? level)
+	      | ImportFrom(identifier? module, alias* names, int? level)
 
 	      -- Doesn't capture requirement that locals must be
 	      -- defined if globals is
@@ -56,7 +56,10 @@
 	     | Lambda(arguments args, expr body)
 	     | IfExp(expr test, expr body, expr orelse)
 	     | Dict(expr* keys, expr* values)
+	     | Set(expr* elts)
 	     | ListComp(expr elt, comprehension* generators)
+	     | SetComp(expr elt, comprehension* generators)
+	     | DictComp(expr key, expr value, comprehension* generators)
 	     | GeneratorExp(expr elt, comprehension* generators)
 	     -- the grammar constrains where yield expressions can occur
 	     | Yield(expr? value)
diff --git a/grammar/Python.g b/grammar/Python.g
--- a/grammar/Python.g
+++ b/grammar/Python.g
@@ -131,6 +131,7 @@
 import org.python.antlr.ast.Raise;
 import org.python.antlr.ast.Repr;
 import org.python.antlr.ast.Return;
+import org.python.antlr.ast.Set;
 import org.python.antlr.ast.Slice;
 import org.python.antlr.ast.Str;
 import org.python.antlr.ast.Subscript;
@@ -1660,7 +1661,7 @@
 
 //atom: ('(' [yield_expr|testlist_gexp] ')' |
 //       '[' [listmaker] ']' |
-//       '{' [dictmaker] '}' |
+//       '{' [dictorsetmaker] '}' |
 //       '`' testlist1 '`' |
 //       NAME | NUMBER | STRING+)
 atom
@@ -1699,10 +1700,14 @@
       )
       RBRACK
     | LCURLY
-       (dictmaker
+       (dictorsetmaker
         {
-            etype = new Dict($LCURLY, actions.castExprs($dictmaker.keys),
-              actions.castExprs($dictmaker.values));
+            if ($dictorsetmaker.keys != null && $dictorsetmaker.values == null) {
+                etype = new Set($LCURLY, actions.castExprs($dictorsetmaker.keys));
+            } else {
+                etype = new Dict($LCURLY, actions.castExprs($dictorsetmaker.keys),
+                  actions.castExprs($dictorsetmaker.values));
+            }
         }
        |
         {
@@ -1946,16 +1951,26 @@
     | test[ctype]
     ;
 
+//dictorsetmaker: ( (test ':' test (comp_for | (',' test ':' test)* [','])) |
+//                  (test (comp_for | (',' test)* [','])) )
+
 //dictmaker: test ':' test (',' test ':' test)* [',']
-dictmaker
+dictorsetmaker
     returns [List keys, List values]
-    : k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load]
-        (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])*
-        (COMMA)?
-      {
-          $keys = $k;
-          $values= $v;
-      }
+    : k+=test[expr_contextType.Load]
+         (COLON v+=test[expr_contextType.Load]
+           (options {k=2;}:COMMA k+=test[expr_contextType.Load] COLON v+=test[expr_contextType.Load])*
+           {
+               $keys = $k;
+               $values= $v;
+           }
+         |(COMMA k+=test[expr_contextType.Load])*
+          {
+              $keys = $k;
+              $values = null;
+          }
+         )
+         (COMMA)?
     ;
 
 //classdef: 'class' NAME ['(' [testlist] ')'] ':' suite
diff --git a/src/org/python/antlr/ast/DictComp.java b/src/org/python/antlr/ast/DictComp.java
new file mode 100644
--- /dev/null
+++ b/src/org/python/antlr/ast/DictComp.java
@@ -0,0 +1,225 @@
+// Autogenerated AST node
+package org.python.antlr.ast;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.Token;
+import org.python.antlr.AST;
+import org.python.antlr.PythonTree;
+import org.python.antlr.adapter.AstAdapters;
+import org.python.antlr.base.excepthandler;
+import org.python.antlr.base.expr;
+import org.python.antlr.base.mod;
+import org.python.antlr.base.slice;
+import org.python.antlr.base.stmt;
+import org.python.core.ArgParser;
+import org.python.core.AstList;
+import org.python.core.Py;
+import org.python.core.PyObject;
+import org.python.core.PyString;
+import org.python.core.PyType;
+import org.python.expose.ExposedGet;
+import org.python.expose.ExposedMethod;
+import org.python.expose.ExposedNew;
+import org.python.expose.ExposedSet;
+import org.python.expose.ExposedType;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+ at ExposedType(name = "_ast.DictComp", base = AST.class)
+public class DictComp extends expr {
+public static final PyType TYPE = PyType.fromClass(DictComp.class);
+    private expr key;
+    public expr getInternalKey() {
+        return key;
+    }
+    @ExposedGet(name = "key")
+    public PyObject getKey() {
+        return key;
+    }
+    @ExposedSet(name = "key")
+    public void setKey(PyObject key) {
+        this.key = AstAdapters.py2expr(key);
+    }
+
+    private expr value;
+    public expr getInternalValue() {
+        return value;
+    }
+    @ExposedGet(name = "value")
+    public PyObject getValue() {
+        return value;
+    }
+    @ExposedSet(name = "value")
+    public void setValue(PyObject value) {
+        this.value = AstAdapters.py2expr(value);
+    }
+
+    private java.util.List<comprehension> generators;
+    public java.util.List<comprehension> getInternalGenerators() {
+        return generators;
+    }
+    @ExposedGet(name = "generators")
+    public PyObject getGenerators() {
+        return new AstList(generators, AstAdapters.comprehensionAdapter);
+    }
+    @ExposedSet(name = "generators")
+    public void setGenerators(PyObject generators) {
+        this.generators = AstAdapters.py2comprehensionList(generators);
+    }
+
+
+    private final static PyString[] fields =
+    new PyString[] {new PyString("key"), new PyString("value"), new PyString("generators")};
+    @ExposedGet(name = "_fields")
+    public PyString[] get_fields() { return fields; }
+
+    private final static PyString[] attributes =
+    new PyString[] {new PyString("lineno"), new PyString("col_offset")};
+    @ExposedGet(name = "_attributes")
+    public PyString[] get_attributes() { return attributes; }
+
+    public DictComp(PyType subType) {
+        super(subType);
+    }
+    public DictComp() {
+        this(TYPE);
+    }
+    @ExposedNew
+    @ExposedMethod
+    public void DictComp___init__(PyObject[] args, String[] keywords) {
+        ArgParser ap = new ArgParser("DictComp", args, keywords, new String[]
+            {"key", "value", "generators", "lineno", "col_offset"}, 3, true);
+        setKey(ap.getPyObject(0, Py.None));
+        setValue(ap.getPyObject(1, Py.None));
+        setGenerators(ap.getPyObject(2, Py.None));
+        int lin = ap.getInt(3, -1);
+        if (lin != -1) {
+            setLineno(lin);
+        }
+
+        int col = ap.getInt(4, -1);
+        if (col != -1) {
+            setLineno(col);
+        }
+
+    }
+
+    public DictComp(PyObject key, PyObject value, PyObject generators) {
+        setKey(key);
+        setValue(value);
+        setGenerators(generators);
+    }
+
+    public DictComp(Token token, expr key, expr value, java.util.List<comprehension> generators) {
+        super(token);
+        this.key = key;
+        addChild(key);
+        this.value = value;
+        addChild(value);
+        this.generators = generators;
+        if (generators == null) {
+            this.generators = new ArrayList<comprehension>();
+        }
+        for(PythonTree t : this.generators) {
+            addChild(t);
+        }
+    }
+
+    public DictComp(Integer ttype, Token token, expr key, expr value, java.util.List<comprehension>
+    generators) {
+        super(ttype, token);
+        this.key = key;
+        addChild(key);
+        this.value = value;
+        addChild(value);
+        this.generators = generators;
+        if (generators == null) {
+            this.generators = new ArrayList<comprehension>();
+        }
+        for(PythonTree t : this.generators) {
+            addChild(t);
+        }
+    }
+
+    public DictComp(PythonTree tree, expr key, expr value, java.util.List<comprehension>
+    generators) {
+        super(tree);
+        this.key = key;
+        addChild(key);
+        this.value = value;
+        addChild(value);
+        this.generators = generators;
+        if (generators == null) {
+            this.generators = new ArrayList<comprehension>();
+        }
+        for(PythonTree t : this.generators) {
+            addChild(t);
+        }
+    }
+
+    @ExposedGet(name = "repr")
+    public String toString() {
+        return "DictComp";
+    }
+
+    public String toStringTree() {
+        StringBuffer sb = new StringBuffer("DictComp(");
+        sb.append("key=");
+        sb.append(dumpThis(key));
+        sb.append(",");
+        sb.append("value=");
+        sb.append(dumpThis(value));
+        sb.append(",");
+        sb.append("generators=");
+        sb.append(dumpThis(generators));
+        sb.append(",");
+        sb.append(")");
+        return sb.toString();
+    }
+
+    public <R> R accept(VisitorIF<R> visitor) throws Exception {
+        return visitor.visitDictComp(this);
+    }
+
+    public void traverse(VisitorIF<?> visitor) throws Exception {
+        if (key != null)
+            key.accept(visitor);
+        if (value != null)
+            value.accept(visitor);
+        if (generators != null) {
+            for (PythonTree t : generators) {
+                if (t != null)
+                    t.accept(visitor);
+            }
+        }
+    }
+
+    private int lineno = -1;
+    @ExposedGet(name = "lineno")
+    public int getLineno() {
+        if (lineno != -1) {
+            return lineno;
+        }
+        return getLine();
+    }
+
+    @ExposedSet(name = "lineno")
+    public void setLineno(int num) {
+        lineno = num;
+    }
+
+    private int col_offset = -1;
+    @ExposedGet(name = "col_offset")
+    public int getCol_offset() {
+        if (col_offset != -1) {
+            return col_offset;
+        }
+        return getCharPositionInLine();
+    }
+
+    @ExposedSet(name = "col_offset")
+    public void setCol_offset(int num) {
+        col_offset = num;
+    }
+
+}
diff --git a/src/org/python/antlr/ast/Set.java b/src/org/python/antlr/ast/Set.java
new file mode 100644
--- /dev/null
+++ b/src/org/python/antlr/ast/Set.java
@@ -0,0 +1,171 @@
+// Autogenerated AST node
+package org.python.antlr.ast;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.Token;
+import org.python.antlr.AST;
+import org.python.antlr.PythonTree;
+import org.python.antlr.adapter.AstAdapters;
+import org.python.antlr.base.excepthandler;
+import org.python.antlr.base.expr;
+import org.python.antlr.base.mod;
+import org.python.antlr.base.slice;
+import org.python.antlr.base.stmt;
+import org.python.core.ArgParser;
+import org.python.core.AstList;
+import org.python.core.Py;
+import org.python.core.PyObject;
+import org.python.core.PyString;
+import org.python.core.PyType;
+import org.python.expose.ExposedGet;
+import org.python.expose.ExposedMethod;
+import org.python.expose.ExposedNew;
+import org.python.expose.ExposedSet;
+import org.python.expose.ExposedType;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+ at ExposedType(name = "_ast.Set", base = AST.class)
+public class Set extends expr {
+public static final PyType TYPE = PyType.fromClass(Set.class);
+    private java.util.List<expr> elts;
+    public java.util.List<expr> getInternalElts() {
+        return elts;
+    }
+    @ExposedGet(name = "elts")
+    public PyObject getElts() {
+        return new AstList(elts, AstAdapters.exprAdapter);
+    }
+    @ExposedSet(name = "elts")
+    public void setElts(PyObject elts) {
+        this.elts = AstAdapters.py2exprList(elts);
+    }
+
+
+    private final static PyString[] fields =
+    new PyString[] {new PyString("elts")};
+    @ExposedGet(name = "_fields")
+    public PyString[] get_fields() { return fields; }
+
+    private final static PyString[] attributes =
+    new PyString[] {new PyString("lineno"), new PyString("col_offset")};
+    @ExposedGet(name = "_attributes")
+    public PyString[] get_attributes() { return attributes; }
+
+    public Set(PyType subType) {
+        super(subType);
+    }
+    public Set() {
+        this(TYPE);
+    }
+    @ExposedNew
+    @ExposedMethod
+    public void Set___init__(PyObject[] args, String[] keywords) {
+        ArgParser ap = new ArgParser("Set", args, keywords, new String[]
+            {"elts", "lineno", "col_offset"}, 1, true);
+        setElts(ap.getPyObject(0, Py.None));
+        int lin = ap.getInt(1, -1);
+        if (lin != -1) {
+            setLineno(lin);
+        }
+
+        int col = ap.getInt(2, -1);
+        if (col != -1) {
+            setLineno(col);
+        }
+
+    }
+
+    public Set(PyObject elts) {
+        setElts(elts);
+    }
+
+    public Set(Token token, java.util.List<expr> elts) {
+        super(token);
+        this.elts = elts;
+        if (elts == null) {
+            this.elts = new ArrayList<expr>();
+        }
+        for(PythonTree t : this.elts) {
+            addChild(t);
+        }
+    }
+
+    public Set(Integer ttype, Token token, java.util.List<expr> elts) {
+        super(ttype, token);
+        this.elts = elts;
+        if (elts == null) {
+            this.elts = new ArrayList<expr>();
+        }
+        for(PythonTree t : this.elts) {
+            addChild(t);
+        }
+    }
+
+    public Set(PythonTree tree, java.util.List<expr> elts) {
+        super(tree);
+        this.elts = elts;
+        if (elts == null) {
+            this.elts = new ArrayList<expr>();
+        }
+        for(PythonTree t : this.elts) {
+            addChild(t);
+        }
+    }
+
+    @ExposedGet(name = "repr")
+    public String toString() {
+        return "Set";
+    }
+
+    public String toStringTree() {
+        StringBuffer sb = new StringBuffer("Set(");
+        sb.append("elts=");
+        sb.append(dumpThis(elts));
+        sb.append(",");
+        sb.append(")");
+        return sb.toString();
+    }
+
+    public <R> R accept(VisitorIF<R> visitor) throws Exception {
+        return visitor.visitSet(this);
+    }
+
+    public void traverse(VisitorIF<?> visitor) throws Exception {
+        if (elts != null) {
+            for (PythonTree t : elts) {
+                if (t != null)
+                    t.accept(visitor);
+            }
+        }
+    }
+
+    private int lineno = -1;
+    @ExposedGet(name = "lineno")
+    public int getLineno() {
+        if (lineno != -1) {
+            return lineno;
+        }
+        return getLine();
+    }
+
+    @ExposedSet(name = "lineno")
+    public void setLineno(int num) {
+        lineno = num;
+    }
+
+    private int col_offset = -1;
+    @ExposedGet(name = "col_offset")
+    public int getCol_offset() {
+        if (col_offset != -1) {
+            return col_offset;
+        }
+        return getCharPositionInLine();
+    }
+
+    @ExposedSet(name = "col_offset")
+    public void setCol_offset(int num) {
+        col_offset = num;
+    }
+
+}
diff --git a/src/org/python/antlr/ast/SetComp.java b/src/org/python/antlr/ast/SetComp.java
new file mode 100644
--- /dev/null
+++ b/src/org/python/antlr/ast/SetComp.java
@@ -0,0 +1,197 @@
+// Autogenerated AST node
+package org.python.antlr.ast;
+import org.antlr.runtime.CommonToken;
+import org.antlr.runtime.Token;
+import org.python.antlr.AST;
+import org.python.antlr.PythonTree;
+import org.python.antlr.adapter.AstAdapters;
+import org.python.antlr.base.excepthandler;
+import org.python.antlr.base.expr;
+import org.python.antlr.base.mod;
+import org.python.antlr.base.slice;
+import org.python.antlr.base.stmt;
+import org.python.core.ArgParser;
+import org.python.core.AstList;
+import org.python.core.Py;
+import org.python.core.PyObject;
+import org.python.core.PyString;
+import org.python.core.PyType;
+import org.python.expose.ExposedGet;
+import org.python.expose.ExposedMethod;
+import org.python.expose.ExposedNew;
+import org.python.expose.ExposedSet;
+import org.python.expose.ExposedType;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+ at ExposedType(name = "_ast.SetComp", base = AST.class)
+public class SetComp extends expr {
+public static final PyType TYPE = PyType.fromClass(SetComp.class);
+    private expr elt;
+    public expr getInternalElt() {
+        return elt;
+    }
+    @ExposedGet(name = "elt")
+    public PyObject getElt() {
+        return elt;
+    }
+    @ExposedSet(name = "elt")
+    public void setElt(PyObject elt) {
+        this.elt = AstAdapters.py2expr(elt);
+    }
+
+    private java.util.List<comprehension> generators;
+    public java.util.List<comprehension> getInternalGenerators() {
+        return generators;
+    }
+    @ExposedGet(name = "generators")
+    public PyObject getGenerators() {
+        return new AstList(generators, AstAdapters.comprehensionAdapter);
+    }
+    @ExposedSet(name = "generators")
+    public void setGenerators(PyObject generators) {
+        this.generators = AstAdapters.py2comprehensionList(generators);
+    }
+
+
+    private final static PyString[] fields =
+    new PyString[] {new PyString("elt"), new PyString("generators")};
+    @ExposedGet(name = "_fields")
+    public PyString[] get_fields() { return fields; }
+
+    private final static PyString[] attributes =
+    new PyString[] {new PyString("lineno"), new PyString("col_offset")};
+    @ExposedGet(name = "_attributes")
+    public PyString[] get_attributes() { return attributes; }
+
+    public SetComp(PyType subType) {
+        super(subType);
+    }
+    public SetComp() {
+        this(TYPE);
+    }
+    @ExposedNew
+    @ExposedMethod
+    public void SetComp___init__(PyObject[] args, String[] keywords) {
+        ArgParser ap = new ArgParser("SetComp", args, keywords, new String[]
+            {"elt", "generators", "lineno", "col_offset"}, 2, true);
+        setElt(ap.getPyObject(0, Py.None));
+        setGenerators(ap.getPyObject(1, Py.None));
+        int lin = ap.getInt(2, -1);
+        if (lin != -1) {
+            setLineno(lin);
+        }
+
+        int col = ap.getInt(3, -1);
+        if (col != -1) {
+            setLineno(col);
+        }
+
+    }
+
+    public SetComp(PyObject elt, PyObject generators) {
+        setElt(elt);
+        setGenerators(generators);
+    }
+
+    public SetComp(Token token, expr elt, java.util.List<comprehension> generators) {
+        super(token);
+        this.elt = elt;
+        addChild(elt);
+        this.generators = generators;
+        if (generators == null) {
+            this.generators = new ArrayList<comprehension>();
+        }
+        for(PythonTree t : this.generators) {
+            addChild(t);
+        }
+    }
+
+    public SetComp(Integer ttype, Token token, expr elt, java.util.List<comprehension> generators) {
+        super(ttype, token);
+        this.elt = elt;
+        addChild(elt);
+        this.generators = generators;
+        if (generators == null) {
+            this.generators = new ArrayList<comprehension>();
+        }
+        for(PythonTree t : this.generators) {
+            addChild(t);
+        }
+    }
+
+    public SetComp(PythonTree tree, expr elt, java.util.List<comprehension> generators) {
+        super(tree);
+        this.elt = elt;
+        addChild(elt);
+        this.generators = generators;
+        if (generators == null) {
+            this.generators = new ArrayList<comprehension>();
+        }
+        for(PythonTree t : this.generators) {
+            addChild(t);
+        }
+    }
+
+    @ExposedGet(name = "repr")
+    public String toString() {
+        return "SetComp";
+    }
+
+    public String toStringTree() {
+        StringBuffer sb = new StringBuffer("SetComp(");
+        sb.append("elt=");
+        sb.append(dumpThis(elt));
+        sb.append(",");
+        sb.append("generators=");
+        sb.append(dumpThis(generators));
+        sb.append(",");
+        sb.append(")");
+        return sb.toString();
+    }
+
+    public <R> R accept(VisitorIF<R> visitor) throws Exception {
+        return visitor.visitSetComp(this);
+    }
+
+    public void traverse(VisitorIF<?> visitor) throws Exception {
+        if (elt != null)
+            elt.accept(visitor);
+        if (generators != null) {
+            for (PythonTree t : generators) {
+                if (t != null)
+                    t.accept(visitor);
+            }
+        }
+    }
+
+    private int lineno = -1;
+    @ExposedGet(name = "lineno")
+    public int getLineno() {
+        if (lineno != -1) {
+            return lineno;
+        }
+        return getLine();
+    }
+
+    @ExposedSet(name = "lineno")
+    public void setLineno(int num) {
+        lineno = num;
+    }
+
+    private int col_offset = -1;
+    @ExposedGet(name = "col_offset")
+    public int getCol_offset() {
+        if (col_offset != -1) {
+            return col_offset;
+        }
+        return getCharPositionInLine();
+    }
+
+    @ExposedSet(name = "col_offset")
+    public void setCol_offset(int num) {
+        col_offset = num;
+    }
+
+}
diff --git a/src/org/python/antlr/ast/VisitorBase.java b/src/org/python/antlr/ast/VisitorBase.java
--- a/src/org/python/antlr/ast/VisitorBase.java
+++ b/src/org/python/antlr/ast/VisitorBase.java
@@ -221,12 +221,30 @@
         return ret;
     }
 
+    public R visitSet(Set node) throws Exception {
+        R ret = unhandled_node(node);
+        traverse(node);
+        return ret;
+    }
+
     public R visitListComp(ListComp node) throws Exception {
         R ret = unhandled_node(node);
         traverse(node);
         return ret;
     }
 
+    public R visitSetComp(SetComp node) throws Exception {
+        R ret = unhandled_node(node);
+        traverse(node);
+        return ret;
+    }
+
+    public R visitDictComp(DictComp node) throws Exception {
+        R ret = unhandled_node(node);
+        traverse(node);
+        return ret;
+    }
+
     public R visitGeneratorExp(GeneratorExp node) throws Exception {
         R ret = unhandled_node(node);
         traverse(node);
diff --git a/src/org/python/antlr/ast/VisitorIF.java b/src/org/python/antlr/ast/VisitorIF.java
--- a/src/org/python/antlr/ast/VisitorIF.java
+++ b/src/org/python/antlr/ast/VisitorIF.java
@@ -35,7 +35,10 @@
     public R visitLambda(Lambda node) throws Exception;
     public R visitIfExp(IfExp node) throws Exception;
     public R visitDict(Dict node) throws Exception;
+    public R visitSet(Set node) throws Exception;
     public R visitListComp(ListComp node) throws Exception;
+    public R visitSetComp(SetComp node) throws Exception;
+    public R visitDictComp(DictComp node) throws Exception;
     public R visitGeneratorExp(GeneratorExp node) throws Exception;
     public R visitYield(Yield node) throws Exception;
     public R visitCompare(Compare node) throws Exception;
diff --git a/src/org/python/compiler/CodeCompiler.java b/src/org/python/compiler/CodeCompiler.java
--- a/src/org/python/compiler/CodeCompiler.java
+++ b/src/org/python/compiler/CodeCompiler.java
@@ -52,6 +52,7 @@
 import org.python.antlr.ast.Raise;
 import org.python.antlr.ast.Repr;
 import org.python.antlr.ast.Return;
+import org.python.antlr.ast.Set;
 import org.python.antlr.ast.Slice;
 import org.python.antlr.ast.Str;
 import org.python.antlr.ast.Subscript;
@@ -88,6 +89,7 @@
 import org.python.core.PyList;
 import org.python.core.PyLong;
 import org.python.core.PyObject;
+import org.python.core.PySet;
 import org.python.core.PySlice;
 import org.python.core.PyString;
 import org.python.core.PyTuple;
@@ -2180,6 +2182,19 @@
     }
 
     @Override
+    public Object visitSet(Set node) throws Exception {
+        int content = makeArray(node.getInternalElts());
+
+        code.new_(p(PySet.class));
+        code.dup();
+        code.aload(content);
+        code.invokespecial(p(PySet.class), "<init>", sig(Void.TYPE, PyObject[].class));
+        freeArray(content);
+        return null;
+    }
+
+
+    @Override
     public Object visitRepr(Repr node) throws Exception {
         visit(node.getInternalValue());
         code.invokevirtual(p(PyObject.class), "__repr__", sig(PyString.class));
diff --git a/src/org/python/core/BaseSet.java b/src/org/python/core/BaseSet.java
--- a/src/org/python/core/BaseSet.java
+++ b/src/org/python/core/BaseSet.java
@@ -42,6 +42,19 @@
     }
 
     /**
+     * Update the underlying set with the contents of the iterable.
+     */
+    protected static Set<PyObject> _update(Set<PyObject> set, PyObject[] data) {
+        if (data == null) {
+            return set;
+        }
+        for (PyObject item : data) {
+            set.add(item);
+        }
+        return set;
+    }
+
+    /**
      * The union of <code>this</code> with <code>other</code>. <p/> <br/> (I.e. all elements
      * that are in either set)
      *
diff --git a/src/org/python/core/PySet.java b/src/org/python/core/PySet.java
--- a/src/org/python/core/PySet.java
+++ b/src/org/python/core/PySet.java
@@ -26,6 +26,10 @@
         super(TYPE, _update(Generic.<PyObject>concurrentSet(), data));
     }
 
+    public PySet(PyObject[] data) {
+        super(TYPE, _update(Generic.<PyObject>concurrentSet(), data));
+    }
+
     @ExposedNew
     @ExposedMethod(doc = BuiltinDocs.set___init___doc)
     final void set___init__(PyObject[] args, String[] kwds) {

-- 
Repository URL: http://hg.python.org/jython


More information about the Jython-checkins mailing list