mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
* import.c (get_module): pass .py filename to parse_file, not .pyc filename!
* funcobject.c (func_repr): don't call getstringvalue(None) for anonymous functions. * bltinmodule.c: removed lambda (which is now a built-in function); removed implied lambda for string arg to filter/map/reduce. * Grammar, graminit.[ch], compile.[ch]: replaced lambda as built-in function by lambda as grammar entity: instead of "lambda('x: x+1')" you write "lambda x: x+1". * Xtmodule.c (checkargdict): return 0, not NULL, for error.
This commit is contained in:
parent
8732d6aeea
commit
590baa4a7a
8 changed files with 757 additions and 783 deletions
|
@ -153,7 +153,7 @@ newcodeobject(code, consts, names, filename, name)
|
|||
if (code == NULL || !is_stringobject(code) ||
|
||||
consts == NULL || !is_listobject(consts) ||
|
||||
names == NULL || !is_listobject(names) ||
|
||||
name == NULL || !is_stringobject(name)) {
|
||||
name == NULL || !(is_stringobject(name) || name == None)) {
|
||||
err_badcall();
|
||||
return NULL;
|
||||
}
|
||||
|
@ -194,7 +194,6 @@ struct compiling {
|
|||
int c_nexti; /* index into c_code */
|
||||
int c_errors; /* counts errors occurred */
|
||||
int c_infunction; /* set when compiling a function */
|
||||
int c_inlambda; /* set when compiling an expression */
|
||||
int c_loops; /* counts nested loops */
|
||||
int c_begin; /* begin of current loop, for 'continue' */
|
||||
int c_block[MAXBLOCKS]; /* stack of block types */
|
||||
|
@ -236,7 +235,7 @@ block_pop(c, type)
|
|||
|
||||
/* Prototypes */
|
||||
|
||||
static int com_init PROTO((struct compiling *, char *, int));
|
||||
static int com_init PROTO((struct compiling *, char *));
|
||||
static void com_free PROTO((struct compiling *));
|
||||
static void com_done PROTO((struct compiling *));
|
||||
static void com_node PROTO((struct compiling *, struct _node *));
|
||||
|
@ -252,10 +251,9 @@ static void com_addopname PROTO((struct compiling *, int, node *));
|
|||
static void com_list PROTO((struct compiling *, node *, int));
|
||||
|
||||
static int
|
||||
com_init(c, filename, inlambda)
|
||||
com_init(c, filename)
|
||||
struct compiling *c;
|
||||
char *filename;
|
||||
int inlambda;
|
||||
{
|
||||
if ((c->c_code = newsizedstringobject((char *)NULL, 1000)) == NULL)
|
||||
goto fail_3;
|
||||
|
@ -268,7 +266,6 @@ com_init(c, filename, inlambda)
|
|||
c->c_nexti = 0;
|
||||
c->c_errors = 0;
|
||||
c->c_infunction = 0;
|
||||
c->c_inlambda = inlambda;
|
||||
c->c_loops = 0;
|
||||
c->c_begin = 0;
|
||||
c->c_nblocks = 0;
|
||||
|
@ -662,6 +659,18 @@ com_atom(c, n)
|
|||
}
|
||||
com_addoparg(c, LOAD_CONST, i);
|
||||
break;
|
||||
case lambdef:
|
||||
if ((v = (object *) compile(ch, c->c_filename)) == NULL) {
|
||||
c->c_errors++;
|
||||
i = 255;
|
||||
}
|
||||
else {
|
||||
i = com_addconst(c, v);
|
||||
DECREF(v);
|
||||
}
|
||||
com_addoparg(c, LOAD_CONST, i);
|
||||
com_addbyte(c, BUILD_FUNCTION);
|
||||
break;
|
||||
case NAME:
|
||||
com_addopname(c, LOAD_NAME, ch);
|
||||
break;
|
||||
|
@ -1825,7 +1834,7 @@ com_funcdef(c, n)
|
|||
{
|
||||
object *v;
|
||||
REQ(n, funcdef); /* funcdef: 'def' NAME parameters ':' suite */
|
||||
v = (object *)_compile(n, c->c_filename, 0);
|
||||
v = (object *)compile(n, c->c_filename);
|
||||
if (v == NULL)
|
||||
c->c_errors++;
|
||||
else {
|
||||
|
@ -1837,25 +1846,6 @@ com_funcdef(c, n)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
com_lambda(c, n)
|
||||
struct compiling *c;
|
||||
node *n;
|
||||
{
|
||||
object *v;
|
||||
REQ(n, lambda_input);
|
||||
v = (object *)_compile(n, c->c_filename, 1);
|
||||
if (v == NULL)
|
||||
c->c_errors++;
|
||||
else {
|
||||
int i = com_addconst(c, v);
|
||||
DECREF(v);
|
||||
com_addoparg(c, LOAD_CONST, i);
|
||||
com_addbyte(c, BUILD_FUNCTION);
|
||||
com_addbyte(c, RETURN_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
com_bases(c, n)
|
||||
struct compiling *c;
|
||||
|
@ -1891,7 +1881,7 @@ com_classdef(c, n)
|
|||
com_addoparg(c, BUILD_TUPLE, 0);
|
||||
else
|
||||
com_bases(c, CHILD(n, 3));
|
||||
v = (object *)_compile(n, c->c_filename, 0);
|
||||
v = (object *)compile(n, c->c_filename);
|
||||
if (v == NULL)
|
||||
c->c_errors++;
|
||||
else {
|
||||
|
@ -2149,13 +2139,25 @@ compile_funcdef(c, n)
|
|||
}
|
||||
|
||||
static void
|
||||
compile_lambda(c, n)
|
||||
compile_lambdef(c, n)
|
||||
struct compiling *c;
|
||||
node *n;
|
||||
{
|
||||
REQ(n, lambda_input)
|
||||
com_arglist(c, CHILD(n, 0));
|
||||
com_node(c, CHILD(n, 2));
|
||||
node *ch;
|
||||
REQ(n, lambdef); /* lambdef: 'lambda' [parameters] ':' test */
|
||||
c->c_name = NULL;
|
||||
|
||||
ch = CHILD(n, 1);
|
||||
if (TYPE(ch) == COLON) {
|
||||
com_addoparg(c, UNPACK_ARG, 0);
|
||||
com_node(c, CHILD(n, 2));
|
||||
}
|
||||
else {
|
||||
com_addoparg(c, RESERVE_FAST, com_addconst(c, None));
|
||||
com_arglist(c, ch);
|
||||
com_node(c, CHILD(n, 3));
|
||||
}
|
||||
|
||||
com_addbyte(c, RETURN_VALUE);
|
||||
}
|
||||
|
||||
|
@ -2183,15 +2185,15 @@ compile_node(c, n)
|
|||
com_addbyte(c, RETURN_VALUE);
|
||||
break;
|
||||
|
||||
case lambda_input: /* Built-in function lambda() */
|
||||
(c->c_inlambda ? compile_lambda : com_lambda)(c, n);
|
||||
break;
|
||||
|
||||
case eval_input: /* Built-in functions eval() and input() */
|
||||
case eval_input: /* Built-in function input() */
|
||||
com_node(c, CHILD(n, 0));
|
||||
com_addbyte(c, RETURN_VALUE);
|
||||
break;
|
||||
|
||||
case lambdef: /* anonymous function definition */
|
||||
compile_lambdef(c, n);
|
||||
break;
|
||||
|
||||
case funcdef: /* A function definition */
|
||||
compile_funcdef(c, n);
|
||||
break;
|
||||
|
@ -2347,24 +2349,28 @@ optimize(c)
|
|||
}
|
||||
|
||||
codeobject *
|
||||
_compile(n, filename, inlambda)
|
||||
compile(n, filename)
|
||||
node *n;
|
||||
char *filename;
|
||||
int inlambda;
|
||||
{
|
||||
struct compiling sc;
|
||||
codeobject *co;
|
||||
if (!com_init(&sc, filename, inlambda))
|
||||
if (!com_init(&sc, filename))
|
||||
return NULL;
|
||||
compile_node(&sc, n);
|
||||
com_done(&sc);
|
||||
if (TYPE(n) == funcdef && sc.c_errors == 0)
|
||||
if ((TYPE(n) == funcdef || TYPE(n) == lambdef) && sc.c_errors == 0)
|
||||
optimize(&sc);
|
||||
co = NULL;
|
||||
if (sc.c_errors == 0) {
|
||||
object *v, *w;
|
||||
v = newstringobject(sc.c_filename);
|
||||
w = newstringobject(sc.c_name);
|
||||
if (sc.c_name)
|
||||
w = newstringobject(sc.c_name);
|
||||
else {
|
||||
INCREF(None);
|
||||
w = None;
|
||||
}
|
||||
if (v != NULL && w != NULL)
|
||||
co = newcodeobject(sc.c_code, sc.c_consts,
|
||||
sc.c_names, v, w);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue