mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
Merged revisions 55225-55227,55229-55269 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk ................ r55238 | guido.van.rossum | 2007-05-10 16:46:05 -0700 (Thu, 10 May 2007) | 9 lines Merged revisions 55227 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r55227 | guido.van.rossum | 2007-05-10 10:20:15 -0700 (Thu, 10 May 2007) | 2 lines Fix a bug in test_c_api() that caused a negative refcount. ........ ................ r55246 | neal.norwitz | 2007-05-11 00:01:52 -0700 (Fri, 11 May 2007) | 1 line Remove commands.getstatus() it is obsolete. ................ r55248 | neal.norwitz | 2007-05-11 00:29:05 -0700 (Fri, 11 May 2007) | 2 lines Remove bsddb185 support. ................ r55249 | neal.norwitz | 2007-05-11 00:29:50 -0700 (Fri, 11 May 2007) | 1 line Remove bsddb185 module too ................ r55250 | neal.norwitz | 2007-05-11 00:32:13 -0700 (Fri, 11 May 2007) | 1 line bsddb185: Gotta remove from the file checked in, not Setup ................ r55251 | neal.norwitz | 2007-05-11 00:53:26 -0700 (Fri, 11 May 2007) | 1 line Remove obsolete IRIX modules (as much as I could find, there is probably more) ................ r55252 | neal.norwitz | 2007-05-11 00:55:35 -0700 (Fri, 11 May 2007) | 1 line Remove SGI turd. ................ r55254 | georg.brandl | 2007-05-11 03:11:01 -0700 (Fri, 11 May 2007) | 2 lines Add a case for set comprehensions to the "cannot assign to" switch. ................ r55255 | georg.brandl | 2007-05-11 03:11:25 -0700 (Fri, 11 May 2007) | 2 lines Fix wrong imports. ................ r55261 | georg.brandl | 2007-05-11 07:37:48 -0700 (Fri, 11 May 2007) | 2 lines Remove removed tex files. ................ r55262 | georg.brandl | 2007-05-11 08:28:41 -0700 (Fri, 11 May 2007) | 2 lines Commit PEP 3132 implementation. ................ r55264 | georg.brandl | 2007-05-11 08:50:19 -0700 (Fri, 11 May 2007) | 2 lines Check in the inevitable AST version number and format Py_ssize_t with %zd. ................ r55265 | neal.norwitz | 2007-05-11 09:12:22 -0700 (Fri, 11 May 2007) | 1 line Remove mention of os.popen* and popen2.* since these will be removed. ................ r55266 | neal.norwitz | 2007-05-11 09:19:57 -0700 (Fri, 11 May 2007) | 1 line Get doc to build again (almost, the doc is fine) ................ r55267 | neal.norwitz | 2007-05-11 09:21:02 -0700 (Fri, 11 May 2007) | 1 line Really get doc to build (remove use of string module) ................ r55269 | neal.norwitz | 2007-05-11 09:29:43 -0700 (Fri, 11 May 2007) | 1 line Add some notes to cleanup later ................
This commit is contained in:
parent
bdde01168f
commit
0368b726a1
57 changed files with 842 additions and 22519 deletions
|
@ -245,6 +245,11 @@ static char *Subscript_fields[]={
|
|||
"slice",
|
||||
"ctx",
|
||||
};
|
||||
static PyTypeObject *Starred_type;
|
||||
static char *Starred_fields[]={
|
||||
"value",
|
||||
"ctx",
|
||||
};
|
||||
static PyTypeObject *Name_type;
|
||||
static char *Name_fields[]={
|
||||
"id",
|
||||
|
@ -571,6 +576,8 @@ static int init_types(void)
|
|||
if (!Attribute_type) return 0;
|
||||
Subscript_type = make_type("Subscript", expr_type, Subscript_fields, 3);
|
||||
if (!Subscript_type) return 0;
|
||||
Starred_type = make_type("Starred", expr_type, Starred_fields, 2);
|
||||
if (!Starred_type) return 0;
|
||||
Name_type = make_type("Name", expr_type, Name_fields, 2);
|
||||
if (!Name_type) return 0;
|
||||
List_type = make_type("List", expr_type, List_fields, 2);
|
||||
|
@ -1661,6 +1668,32 @@ Subscript(expr_ty value, slice_ty slice, expr_context_ty ctx, int lineno, int
|
|||
return p;
|
||||
}
|
||||
|
||||
expr_ty
|
||||
Starred(expr_ty value, expr_context_ty ctx, int lineno, int col_offset, PyArena
|
||||
*arena)
|
||||
{
|
||||
expr_ty p;
|
||||
if (!value) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"field value is required for Starred");
|
||||
return NULL;
|
||||
}
|
||||
if (!ctx) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"field ctx is required for Starred");
|
||||
return NULL;
|
||||
}
|
||||
p = (expr_ty)PyArena_Malloc(arena, sizeof(*p));
|
||||
if (!p)
|
||||
return NULL;
|
||||
p->kind = Starred_kind;
|
||||
p->v.Starred.value = value;
|
||||
p->v.Starred.ctx = ctx;
|
||||
p->lineno = lineno;
|
||||
p->col_offset = col_offset;
|
||||
return p;
|
||||
}
|
||||
|
||||
expr_ty
|
||||
Name(identifier id, expr_context_ty ctx, int lineno, int col_offset, PyArena
|
||||
*arena)
|
||||
|
@ -2606,6 +2639,20 @@ ast2obj_expr(void* _o)
|
|||
goto failed;
|
||||
Py_DECREF(value);
|
||||
break;
|
||||
case Starred_kind:
|
||||
result = PyType_GenericNew(Starred_type, NULL, NULL);
|
||||
if (!result) goto failed;
|
||||
value = ast2obj_expr(o->v.Starred.value);
|
||||
if (!value) goto failed;
|
||||
if (PyObject_SetAttrString(result, "value", value) == -1)
|
||||
goto failed;
|
||||
Py_DECREF(value);
|
||||
value = ast2obj_expr_context(o->v.Starred.ctx);
|
||||
if (!value) goto failed;
|
||||
if (PyObject_SetAttrString(result, "ctx", value) == -1)
|
||||
goto failed;
|
||||
Py_DECREF(value);
|
||||
break;
|
||||
case Name_kind:
|
||||
result = PyType_GenericNew(Name_type, NULL, NULL);
|
||||
if (!result) goto failed;
|
||||
|
@ -3180,6 +3227,8 @@ init_ast(void)
|
|||
0) return;
|
||||
if (PyDict_SetItemString(d, "Subscript", (PyObject*)Subscript_type) <
|
||||
0) return;
|
||||
if (PyDict_SetItemString(d, "Starred", (PyObject*)Starred_type) < 0)
|
||||
return;
|
||||
if (PyDict_SetItemString(d, "Name", (PyObject*)Name_type) < 0) return;
|
||||
if (PyDict_SetItemString(d, "List", (PyObject*)List_type) < 0) return;
|
||||
if (PyDict_SetItemString(d, "Tuple", (PyObject*)Tuple_type) < 0) return;
|
||||
|
|
28
Python/ast.c
28
Python/ast.c
|
@ -355,6 +355,11 @@ set_context(expr_ty e, expr_context_ty ctx, const node *n)
|
|||
case Subscript_kind:
|
||||
e->v.Subscript.ctx = ctx;
|
||||
break;
|
||||
case Starred_kind:
|
||||
e->v.Starred.ctx = ctx;
|
||||
if (!set_context(e->v.Starred.value, ctx, n))
|
||||
return 0;
|
||||
break;
|
||||
case Name_kind:
|
||||
if (ctx == Store &&
|
||||
!strcmp(PyString_AS_STRING(e->v.Name.id), "None")) {
|
||||
|
@ -392,6 +397,9 @@ set_context(expr_ty e, expr_context_ty ctx, const node *n)
|
|||
case ListComp_kind:
|
||||
expr_name = "list comprehension";
|
||||
break;
|
||||
case SetComp_kind:
|
||||
expr_name = "set comprehension";
|
||||
break;
|
||||
case Dict_kind:
|
||||
case Set_kind:
|
||||
case Num_kind:
|
||||
|
@ -1661,6 +1669,21 @@ ast_for_power(struct compiling *c, const node *n)
|
|||
return e;
|
||||
}
|
||||
|
||||
static expr_ty
|
||||
ast_for_starred(struct compiling *c, const node *n)
|
||||
{
|
||||
expr_ty tmp;
|
||||
REQ(n, star_expr);
|
||||
|
||||
tmp = ast_for_expr(c, CHILD(n, 1));
|
||||
if (!tmp)
|
||||
return NULL;
|
||||
|
||||
/* The Load context is changed later. */
|
||||
return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
|
||||
}
|
||||
|
||||
|
||||
/* Do not name a variable 'expr'! Will cause a compile error.
|
||||
*/
|
||||
|
||||
|
@ -1772,6 +1795,11 @@ ast_for_expr(struct compiling *c, const node *n)
|
|||
}
|
||||
break;
|
||||
|
||||
case star_expr:
|
||||
if (TYPE(CHILD(n, 0)) == STAR) {
|
||||
return ast_for_starred(c, n);
|
||||
}
|
||||
/* Fallthrough */
|
||||
/* The next five cases all handle BinOps. The main body of code
|
||||
is the same in each case, but the switch turned inside out to
|
||||
reuse the code for each type of operator.
|
||||
|
|
|
@ -477,7 +477,7 @@ enum why_code {
|
|||
};
|
||||
|
||||
static enum why_code do_raise(PyObject *, PyObject *, PyObject *);
|
||||
static int unpack_iterable(PyObject *, int, PyObject **);
|
||||
static int unpack_iterable(PyObject *, int, int, PyObject **);
|
||||
|
||||
/* for manipulating the thread switch and periodic "stuff" - used to be
|
||||
per thread, now just a pair o' globals */
|
||||
|
@ -1656,7 +1656,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
|||
Py_INCREF(w);
|
||||
PUSH(w);
|
||||
}
|
||||
} else if (unpack_iterable(v, oparg,
|
||||
} else if (unpack_iterable(v, oparg, -1,
|
||||
stack_pointer + oparg)) {
|
||||
stack_pointer += oparg;
|
||||
} else {
|
||||
|
@ -1666,6 +1666,21 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
|
|||
Py_DECREF(v);
|
||||
break;
|
||||
|
||||
case UNPACK_EX:
|
||||
{
|
||||
int totalargs = 1 + (oparg & 0xFF) + (oparg >> 8);
|
||||
v = POP();
|
||||
|
||||
if (unpack_iterable(v, oparg & 0xFF, oparg >> 8,
|
||||
stack_pointer + totalargs)) {
|
||||
stack_pointer += totalargs;
|
||||
} else {
|
||||
why = WHY_EXCEPTION;
|
||||
}
|
||||
Py_DECREF(v);
|
||||
break;
|
||||
}
|
||||
|
||||
case STORE_ATTR:
|
||||
w = GETITEM(names, oparg);
|
||||
v = TOP();
|
||||
|
@ -3077,14 +3092,20 @@ do_raise(PyObject *type, PyObject *value, PyObject *tb)
|
|||
}
|
||||
|
||||
/* Iterate v argcnt times and store the results on the stack (via decreasing
|
||||
sp). Return 1 for success, 0 if error. */
|
||||
sp). Return 1 for success, 0 if error.
|
||||
|
||||
If argcntafter == -1, do a simple unpack. If it is >= 0, do an unpack
|
||||
with a variable target.
|
||||
*/
|
||||
|
||||
static int
|
||||
unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
|
||||
unpack_iterable(PyObject *v, int argcnt, int argcntafter, PyObject **sp)
|
||||
{
|
||||
int i = 0;
|
||||
int i = 0, j = 0;
|
||||
Py_ssize_t ll = 0;
|
||||
PyObject *it; /* iter(v) */
|
||||
PyObject *w;
|
||||
PyObject *l = NULL; /* variable list */
|
||||
|
||||
assert(v != NULL);
|
||||
|
||||
|
@ -3106,17 +3127,42 @@ unpack_iterable(PyObject *v, int argcnt, PyObject **sp)
|
|||
*--sp = w;
|
||||
}
|
||||
|
||||
/* We better have exhausted the iterator now. */
|
||||
w = PyIter_Next(it);
|
||||
if (w == NULL) {
|
||||
if (PyErr_Occurred())
|
||||
goto Error;
|
||||
Py_DECREF(it);
|
||||
return 1;
|
||||
if (argcntafter == -1) {
|
||||
/* We better have exhausted the iterator now. */
|
||||
w = PyIter_Next(it);
|
||||
if (w == NULL) {
|
||||
if (PyErr_Occurred())
|
||||
goto Error;
|
||||
Py_DECREF(it);
|
||||
return 1;
|
||||
}
|
||||
Py_DECREF(w);
|
||||
PyErr_SetString(PyExc_ValueError, "too many values to unpack");
|
||||
goto Error;
|
||||
}
|
||||
Py_DECREF(w);
|
||||
PyErr_SetString(PyExc_ValueError, "too many values to unpack");
|
||||
/* fall through */
|
||||
|
||||
l = PySequence_List(it);
|
||||
if (l == NULL)
|
||||
goto Error;
|
||||
*--sp = l;
|
||||
i++;
|
||||
|
||||
ll = PyList_GET_SIZE(l);
|
||||
if (ll < argcntafter) {
|
||||
PyErr_Format(PyExc_ValueError, "need more than %zd values to unpack",
|
||||
argcnt + ll);
|
||||
goto Error;
|
||||
}
|
||||
|
||||
/* Pop the "after-variable" args off the list. */
|
||||
for (j = argcntafter; j > 0; j--, i++) {
|
||||
*--sp = PyList_GET_ITEM(l, ll - j);
|
||||
}
|
||||
/* Resize the list. */
|
||||
((PyListObject *)l)->ob_size = ll - argcntafter;
|
||||
Py_DECREF(it);
|
||||
return 1;
|
||||
|
||||
Error:
|
||||
for (; i > 0; i--, sp++)
|
||||
Py_DECREF(*sp);
|
||||
|
|
|
@ -786,6 +786,8 @@ opcode_stack_effect(int opcode, int oparg)
|
|||
return 0;
|
||||
case UNPACK_SEQUENCE:
|
||||
return oparg-1;
|
||||
case UNPACK_EX:
|
||||
return (oparg&0xFF) + (oparg>>8);
|
||||
case FOR_ITER:
|
||||
return 1;
|
||||
|
||||
|
@ -2617,7 +2619,21 @@ compiler_list(struct compiler *c, expr_ty e)
|
|||
{
|
||||
int n = asdl_seq_LEN(e->v.List.elts);
|
||||
if (e->v.List.ctx == Store) {
|
||||
ADDOP_I(c, UNPACK_SEQUENCE, n);
|
||||
int i, seen_star = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
expr_ty elt = asdl_seq_GET(e->v.List.elts, i);
|
||||
if (elt->kind == Starred_kind && !seen_star) {
|
||||
ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
|
||||
seen_star = 1;
|
||||
asdl_seq_SET(e->v.List.elts, i, elt->v.Starred.value);
|
||||
} else if (elt->kind == Starred_kind) {
|
||||
return compiler_error(c,
|
||||
"two starred expressions in assignment");
|
||||
}
|
||||
}
|
||||
if (!seen_star) {
|
||||
ADDOP_I(c, UNPACK_SEQUENCE, n);
|
||||
}
|
||||
}
|
||||
VISIT_SEQ(c, expr, e->v.List.elts);
|
||||
if (e->v.List.ctx == Load) {
|
||||
|
@ -2631,7 +2647,21 @@ compiler_tuple(struct compiler *c, expr_ty e)
|
|||
{
|
||||
int n = asdl_seq_LEN(e->v.Tuple.elts);
|
||||
if (e->v.Tuple.ctx == Store) {
|
||||
ADDOP_I(c, UNPACK_SEQUENCE, n);
|
||||
int i, seen_star = 0;
|
||||
for (i = 0; i < n; i++) {
|
||||
expr_ty elt = asdl_seq_GET(e->v.Tuple.elts, i);
|
||||
if (elt->kind == Starred_kind && !seen_star) {
|
||||
ADDOP_I(c, UNPACK_EX, (i + ((n-i-1) << 8)));
|
||||
seen_star = 1;
|
||||
asdl_seq_SET(e->v.Tuple.elts, i, elt->v.Starred.value);
|
||||
} else if (elt->kind == Starred_kind) {
|
||||
return compiler_error(c,
|
||||
"two starred expressions in assignment");
|
||||
}
|
||||
}
|
||||
if (!seen_star) {
|
||||
ADDOP_I(c, UNPACK_SEQUENCE, n);
|
||||
}
|
||||
}
|
||||
VISIT_SEQ(c, expr, e->v.Tuple.elts);
|
||||
if (e->v.Tuple.ctx == Load) {
|
||||
|
@ -3257,6 +3287,18 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
|
|||
return 0;
|
||||
}
|
||||
break;
|
||||
case Starred_kind:
|
||||
switch (e->v.Starred.ctx) {
|
||||
case Store:
|
||||
/* In all legitimate cases, the Starred node was already replaced
|
||||
* by compiler_list/compiler_tuple. XXX: is that okay? */
|
||||
return compiler_error(c,
|
||||
"starred assignment target must be in a list or tuple");
|
||||
default:
|
||||
return compiler_error(c,
|
||||
"can use starred expression only as assignment target");
|
||||
}
|
||||
break;
|
||||
case Name_kind:
|
||||
return compiler_nameop(c, e->v.Name.id, e->v.Name.ctx);
|
||||
/* child nodes of List and Tuple will have expr_context set */
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1294,6 +1294,9 @@ symtable_visit_expr(struct symtable *st, expr_ty e)
|
|||
VISIT(st, expr, e->v.Subscript.value);
|
||||
VISIT(st, slice, e->v.Subscript.slice);
|
||||
break;
|
||||
case Starred_kind:
|
||||
VISIT(st, expr, e->v.Starred.value);
|
||||
break;
|
||||
case Name_kind:
|
||||
if (!symtable_add_def(st, e->v.Name.id,
|
||||
e->v.Name.ctx == Load ? USE : DEF_LOCAL))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue