diff options
| author | Antoine Pitrou <solipsis@pitrou.net> | 2010-05-09 15:52:27 (GMT) | 
|---|---|---|
| committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-05-09 15:52:27 (GMT) | 
| commit | f95a1b3c53bdd678b64aa608d4375660033460c3 (patch) | |
| tree | a8bee40b1b14e28ff5978ea519f3035a3c399912 /Python/compile.c | |
| parent | bd250300191133d276a71b395b6428081bf825b8 (diff) | |
| download | cpython-f95a1b3c53bdd678b64aa608d4375660033460c3.zip cpython-f95a1b3c53bdd678b64aa608d4375660033460c3.tar.gz cpython-f95a1b3c53bdd678b64aa608d4375660033460c3.tar.bz2  | |
Recorded merge of revisions 81029 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r81029 | antoine.pitrou | 2010-05-09 16:46:46 +0200 (dim., 09 mai 2010) | 3 lines
  Untabify C files. Will watch buildbots.
........
Diffstat (limited to 'Python/compile.c')
| -rw-r--r-- | Python/compile.c | 6416 | 
1 files changed, 3208 insertions, 3208 deletions
diff --git a/Python/compile.c b/Python/compile.c index 62fa46c..fa7dcef 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -5,10 +5,10 @@   * PyCodeObject.  The compiler makes several passes to build the code   * object:   *   1. Checks for future statements.  See future.c - *   2. Builds a symbol table.	See symtable.c. + *   2. Builds a symbol table.  See symtable.c.   *   3. Generate code for basic blocks.  See compiler_mod() in this file.   *   4. Assemble the basic blocks into final code.  See assemble() in - *	this file.	  + *      this file.   *   5. Optimize the byte code (peephole optimizations).  See peephole.c   *   * Note that compiler_mod() suggests module, but the module ast type @@ -45,37 +45,37 @@ int Py_OptimizeFlag = 0;  #define COMP_DICTCOMP 3  struct instr { -	unsigned i_jabs : 1; -	unsigned i_jrel : 1; -	unsigned i_hasarg : 1; -	unsigned char i_opcode; -	int i_oparg; -	struct basicblock_ *i_target; /* target block (if jump instruction) */ -	int i_lineno; +    unsigned i_jabs : 1; +    unsigned i_jrel : 1; +    unsigned i_hasarg : 1; +    unsigned char i_opcode; +    int i_oparg; +    struct basicblock_ *i_target; /* target block (if jump instruction) */ +    int i_lineno;  };  typedef struct basicblock_ {      /* Each basicblock in a compilation unit is linked via b_list in the         reverse order that the block are allocated.  b_list points to the next         block, not to be confused with b_next, which is next by control flow. */ -	struct basicblock_ *b_list; -	/* number of instructions used */ -	int b_iused; -	/* length of instruction array (b_instr) */ -	int b_ialloc; -	/* pointer to an array of instructions, initially NULL */ -	struct instr *b_instr; -	/* If b_next is non-NULL, it is a pointer to the next -	   block reached by normal control flow. */ -	struct basicblock_ *b_next; -	/* b_seen is used to perform a DFS of basicblocks. */ -	unsigned b_seen : 1; -	/* b_return is true if a RETURN_VALUE opcode is inserted. */ -	unsigned b_return : 1; -	/* depth of stack upon entry of block, computed by stackdepth() */ -	int b_startdepth; -	/* instruction offset for block, computed by assemble_jump_offsets() */ -	int b_offset; +    struct basicblock_ *b_list; +    /* number of instructions used */ +    int b_iused; +    /* length of instruction array (b_instr) */ +    int b_ialloc; +    /* pointer to an array of instructions, initially NULL */ +    struct instr *b_instr; +    /* If b_next is non-NULL, it is a pointer to the next +       block reached by normal control flow. */ +    struct basicblock_ *b_next; +    /* b_seen is used to perform a DFS of basicblocks. */ +    unsigned b_seen : 1; +    /* b_return is true if a RETURN_VALUE opcode is inserted. */ +    unsigned b_return : 1; +    /* depth of stack upon entry of block, computed by stackdepth() */ +    int b_startdepth; +    /* instruction offset for block, computed by assemble_jump_offsets() */ +    int b_offset;  } basicblock;  /* fblockinfo tracks the current frame block. @@ -88,64 +88,64 @@ compiler IR.  enum fblocktype { LOOP, EXCEPT, FINALLY_TRY, FINALLY_END };  struct fblockinfo { -	enum fblocktype fb_type; -	basicblock *fb_block; +    enum fblocktype fb_type; +    basicblock *fb_block;  };  /* The following items change on entry and exit of code blocks.     They must be saved and restored when returning to a block.  */  struct compiler_unit { -	PySTEntryObject *u_ste; - -	PyObject *u_name; -	/* The following fields are dicts that map objects to -	   the index of them in co_XXX.	 The index is used as -	   the argument for opcodes that refer to those collections. -	*/ -	PyObject *u_consts;    /* all constants */ -	PyObject *u_names;     /* all names */ -	PyObject *u_varnames;  /* local variables */ -	PyObject *u_cellvars;  /* cell variables */ -	PyObject *u_freevars;  /* free variables */ - -	PyObject *u_private;	/* for private name mangling */ - -	int u_argcount;	   /* number of arguments for block */  -	int u_kwonlyargcount; /* number of keyword only arguments for block */ -	/* Pointer to the most recently allocated block.  By following b_list -	   members, you can reach all early allocated blocks. */ -	basicblock *u_blocks; -	basicblock *u_curblock; /* pointer to current block */ - -	int u_nfblocks; -	struct fblockinfo u_fblock[CO_MAXBLOCKS]; - -	int u_firstlineno; /* the first lineno of the block */ -	int u_lineno;	   /* the lineno for the current stmt */ -	int u_lineno_set;  /* boolean to indicate whether instr -			      has been generated with current lineno */ +    PySTEntryObject *u_ste; + +    PyObject *u_name; +    /* The following fields are dicts that map objects to +       the index of them in co_XXX.      The index is used as +       the argument for opcodes that refer to those collections. +    */ +    PyObject *u_consts;    /* all constants */ +    PyObject *u_names;     /* all names */ +    PyObject *u_varnames;  /* local variables */ +    PyObject *u_cellvars;  /* cell variables */ +    PyObject *u_freevars;  /* free variables */ + +    PyObject *u_private;        /* for private name mangling */ + +    int u_argcount;        /* number of arguments for block */ +    int u_kwonlyargcount; /* number of keyword only arguments for block */ +    /* Pointer to the most recently allocated block.  By following b_list +       members, you can reach all early allocated blocks. */ +    basicblock *u_blocks; +    basicblock *u_curblock; /* pointer to current block */ + +    int u_nfblocks; +    struct fblockinfo u_fblock[CO_MAXBLOCKS]; + +    int u_firstlineno; /* the first lineno of the block */ +    int u_lineno;          /* the lineno for the current stmt */ +    int u_lineno_set;  /* boolean to indicate whether instr +                          has been generated with current lineno */  }; -/* This struct captures the global state of a compilation.   +/* This struct captures the global state of a compilation.  The u pointer points to the current compilation unit, while units -for enclosing blocks are stored in c_stack.	The u and c_stack are +for enclosing blocks are stored in c_stack.     The u and c_stack are  managed by compiler_enter_scope() and compiler_exit_scope().  */  struct compiler { -	const char *c_filename; -	struct symtable *c_st; -	PyFutureFeatures *c_future; /* pointer to module's __future__ */ -	PyCompilerFlags *c_flags; +    const char *c_filename; +    struct symtable *c_st; +    PyFutureFeatures *c_future; /* pointer to module's __future__ */ +    PyCompilerFlags *c_flags; -	int c_interactive;	 /* true if in interactive mode */ -	int c_nestlevel; +    int c_interactive;           /* true if in interactive mode */ +    int c_nestlevel; -	struct compiler_unit *u; /* compiler state for current block */ -	PyObject *c_stack;	 /* Python list holding compiler_unit ptrs */ -	PyArena *c_arena;	 /* pointer to memory allocation arena */ +    struct compiler_unit *u; /* compiler state for current block */ +    PyObject *c_stack;           /* Python list holding compiler_unit ptrs */ +    PyArena *c_arena;            /* pointer to memory allocation arena */  };  static int compiler_enter_scope(struct compiler *, identifier, void *, int); @@ -166,12 +166,12 @@ static int compiler_visit_keyword(struct compiler *, keyword_ty);  static int compiler_visit_expr(struct compiler *, expr_ty);  static int compiler_augassign(struct compiler *, stmt_ty);  static int compiler_visit_slice(struct compiler *, slice_ty, -				expr_context_ty); +                                expr_context_ty);  static int compiler_push_fblock(struct compiler *, enum fblocktype, -				basicblock *); +                                basicblock *);  static void compiler_pop_fblock(struct compiler *, enum fblocktype, -				basicblock *); +                                basicblock *);  /* Returns true if there is a loop on the fblock stack. */  static int compiler_in_loop(struct compiler *); @@ -180,10 +180,10 @@ static int expr_constant(expr_ty e);  static int compiler_with(struct compiler *, stmt_ty);  static int compiler_call_helper(struct compiler *c, int n, -				asdl_seq *args, -				asdl_seq *keywords, -				expr_ty starargs, -				expr_ty kwargs); +                                asdl_seq *args, +                                asdl_seq *keywords, +                                expr_ty starargs, +                                expr_ty kwargs);  static PyCodeObject *assemble(struct compiler *, int addNone);  static PyObject *__doc__; @@ -193,172 +193,172 @@ static PyObject *__doc__;  PyObject *  _Py_Mangle(PyObject *privateobj, PyObject *ident)  { -	/* Name mangling: __private becomes _classname__private. -	   This is independent from how the name is used. */ -	const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident); -	Py_UNICODE *buffer; -	size_t nlen, plen; -	if (privateobj == NULL || !PyUnicode_Check(privateobj) || -	    name == NULL || name[0] != '_' || name[1] != '_') { -		Py_INCREF(ident); -		return ident; -	} -	p = PyUnicode_AS_UNICODE(privateobj); -	nlen = Py_UNICODE_strlen(name); -	/* Don't mangle __id__ or names with dots. - -	   The only time a name with a dot can occur is when -	   we are compiling an import statement that has a  -	   package name. - -	   TODO(jhylton): Decide whether we want to support -	   mangling of the module name, e.g. __M.X. -	*/ -	if ((name[nlen-1] == '_' && name[nlen-2] == '_')  -	    || Py_UNICODE_strchr(name, '.')) { -		Py_INCREF(ident); -		return ident; /* Don't mangle __whatever__ */ -	} -	/* Strip leading underscores from class name */ -	while (*p == '_') -		p++; -	if (*p == 0) { -		Py_INCREF(ident); -		return ident; /* Don't mangle if class is just underscores */ -	} -	plen = Py_UNICODE_strlen(p); - -	assert(1 <= PY_SSIZE_T_MAX - nlen); -	assert(1 + nlen <= PY_SSIZE_T_MAX - plen); - -	ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen); -	if (!ident) -		return 0; -	/* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ -	buffer = PyUnicode_AS_UNICODE(ident); -	buffer[0] = '_'; -	Py_UNICODE_strncpy(buffer+1, p, plen); -	Py_UNICODE_strcpy(buffer+1+plen, name); -	return ident; +    /* Name mangling: __private becomes _classname__private. +       This is independent from how the name is used. */ +    const Py_UNICODE *p, *name = PyUnicode_AS_UNICODE(ident); +    Py_UNICODE *buffer; +    size_t nlen, plen; +    if (privateobj == NULL || !PyUnicode_Check(privateobj) || +        name == NULL || name[0] != '_' || name[1] != '_') { +        Py_INCREF(ident); +        return ident; +    } +    p = PyUnicode_AS_UNICODE(privateobj); +    nlen = Py_UNICODE_strlen(name); +    /* Don't mangle __id__ or names with dots. + +       The only time a name with a dot can occur is when +       we are compiling an import statement that has a +       package name. + +       TODO(jhylton): Decide whether we want to support +       mangling of the module name, e.g. __M.X. +    */ +    if ((name[nlen-1] == '_' && name[nlen-2] == '_') +        || Py_UNICODE_strchr(name, '.')) { +        Py_INCREF(ident); +        return ident; /* Don't mangle __whatever__ */ +    } +    /* Strip leading underscores from class name */ +    while (*p == '_') +        p++; +    if (*p == 0) { +        Py_INCREF(ident); +        return ident; /* Don't mangle if class is just underscores */ +    } +    plen = Py_UNICODE_strlen(p); + +    assert(1 <= PY_SSIZE_T_MAX - nlen); +    assert(1 + nlen <= PY_SSIZE_T_MAX - plen); + +    ident = PyUnicode_FromStringAndSize(NULL, 1 + nlen + plen); +    if (!ident) +        return 0; +    /* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */ +    buffer = PyUnicode_AS_UNICODE(ident); +    buffer[0] = '_'; +    Py_UNICODE_strncpy(buffer+1, p, plen); +    Py_UNICODE_strcpy(buffer+1+plen, name); +    return ident;  }  static int  compiler_init(struct compiler *c)  { -	memset(c, 0, sizeof(struct compiler)); +    memset(c, 0, sizeof(struct compiler)); -	c->c_stack = PyList_New(0); -	if (!c->c_stack) -		return 0; +    c->c_stack = PyList_New(0); +    if (!c->c_stack) +        return 0; -	return 1; +    return 1;  }  PyCodeObject *  PyAST_Compile(mod_ty mod, const char *filename, PyCompilerFlags *flags, -	      PyArena *arena) -{ -	struct compiler c; -	PyCodeObject *co = NULL; -	PyCompilerFlags local_flags; -	int merged; - -	if (!__doc__) { -		__doc__ = PyUnicode_InternFromString("__doc__"); -		if (!__doc__) -			return NULL; -	} - -	if (!compiler_init(&c)) -		return NULL; -	c.c_filename = filename; -	c.c_arena = arena; -	c.c_future = PyFuture_FromAST(mod, filename); -	if (c.c_future == NULL) -		goto finally; -	if (!flags) { -		local_flags.cf_flags = 0; -		flags = &local_flags; -	} -	merged = c.c_future->ff_features | flags->cf_flags; -	c.c_future->ff_features = merged; -	flags->cf_flags = merged; -	c.c_flags = flags; -	c.c_nestlevel = 0; - -	c.c_st = PySymtable_Build(mod, filename, c.c_future); -	if (c.c_st == NULL) { -		if (!PyErr_Occurred()) -			PyErr_SetString(PyExc_SystemError, "no symtable"); -		goto finally; -	} - -	co = compiler_mod(&c, mod); +              PyArena *arena) +{ +    struct compiler c; +    PyCodeObject *co = NULL; +    PyCompilerFlags local_flags; +    int merged; + +    if (!__doc__) { +        __doc__ = PyUnicode_InternFromString("__doc__"); +        if (!__doc__) +            return NULL; +    } + +    if (!compiler_init(&c)) +        return NULL; +    c.c_filename = filename; +    c.c_arena = arena; +    c.c_future = PyFuture_FromAST(mod, filename); +    if (c.c_future == NULL) +        goto finally; +    if (!flags) { +        local_flags.cf_flags = 0; +        flags = &local_flags; +    } +    merged = c.c_future->ff_features | flags->cf_flags; +    c.c_future->ff_features = merged; +    flags->cf_flags = merged; +    c.c_flags = flags; +    c.c_nestlevel = 0; + +    c.c_st = PySymtable_Build(mod, filename, c.c_future); +    if (c.c_st == NULL) { +        if (!PyErr_Occurred()) +            PyErr_SetString(PyExc_SystemError, "no symtable"); +        goto finally; +    } + +    co = compiler_mod(&c, mod);   finally: -	compiler_free(&c); -	assert(co || PyErr_Occurred()); -	return co; +    compiler_free(&c); +    assert(co || PyErr_Occurred()); +    return co;  }  PyCodeObject *  PyNode_Compile(struct _node *n, const char *filename)  { -	PyCodeObject *co = NULL; -	mod_ty mod; -	PyArena *arena = PyArena_New(); -	if (!arena) -		return NULL; -	mod = PyAST_FromNode(n, NULL, filename, arena); -	if (mod) -		co = PyAST_Compile(mod, filename, NULL, arena); -	PyArena_Free(arena); -	return co; +    PyCodeObject *co = NULL; +    mod_ty mod; +    PyArena *arena = PyArena_New(); +    if (!arena) +        return NULL; +    mod = PyAST_FromNode(n, NULL, filename, arena); +    if (mod) +        co = PyAST_Compile(mod, filename, NULL, arena); +    PyArena_Free(arena); +    return co;  }  static void  compiler_free(struct compiler *c)  { -	if (c->c_st) -		PySymtable_Free(c->c_st); -	if (c->c_future) -		PyObject_Free(c->c_future); -	Py_DECREF(c->c_stack); +    if (c->c_st) +        PySymtable_Free(c->c_st); +    if (c->c_future) +        PyObject_Free(c->c_future); +    Py_DECREF(c->c_stack);  }  static PyObject *  list2dict(PyObject *list)  { -	Py_ssize_t i, n; -	PyObject *v, *k; -	PyObject *dict = PyDict_New(); -	if (!dict) return NULL; - -	n = PyList_Size(list); -	for (i = 0; i < n; i++) { -		v = PyLong_FromLong(i); -		if (!v) { -			Py_DECREF(dict); -			return NULL; -		} -		k = PyList_GET_ITEM(list, i); -		k = PyTuple_Pack(2, k, k->ob_type); -		if (k == NULL || PyDict_SetItem(dict, k, v) < 0) { -			Py_XDECREF(k); -			Py_DECREF(v); -			Py_DECREF(dict); -			return NULL; -		} -		Py_DECREF(k); -		Py_DECREF(v); -	} -	return dict; +    Py_ssize_t i, n; +    PyObject *v, *k; +    PyObject *dict = PyDict_New(); +    if (!dict) return NULL; + +    n = PyList_Size(list); +    for (i = 0; i < n; i++) { +        v = PyLong_FromLong(i); +        if (!v) { +            Py_DECREF(dict); +            return NULL; +        } +        k = PyList_GET_ITEM(list, i); +        k = PyTuple_Pack(2, k, k->ob_type); +        if (k == NULL || PyDict_SetItem(dict, k, v) < 0) { +            Py_XDECREF(k); +            Py_DECREF(v); +            Py_DECREF(dict); +            return NULL; +        } +        Py_DECREF(k); +        Py_DECREF(v); +    } +    return dict;  }  /* Return new dict containing names from src that match scope(s).  src is a symbol table dictionary.  If the scope of a name matches -either scope_type or flag is set, insert it into the new dict.	The +either scope_type or flag is set, insert it into the new dict.  The  values are integers, starting at offset and increasing by one for  each key.  */ @@ -366,182 +366,182 @@ each key.  static PyObject *  dictbytype(PyObject *src, int scope_type, int flag, int offset)  { -	Py_ssize_t pos = 0, i = offset, scope; -	PyObject *k, *v, *dest = PyDict_New(); - -	assert(offset >= 0); -	if (dest == NULL) -		return NULL; - -	while (PyDict_Next(src, &pos, &k, &v)) { -		/* XXX this should probably be a macro in symtable.h */ -		long vi; -		assert(PyLong_Check(v)); -		vi = PyLong_AS_LONG(v); -		scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK; - -		if (scope == scope_type || vi & flag) { -			PyObject *tuple, *item = PyLong_FromLong(i); -			if (item == NULL) { -				Py_DECREF(dest); -				return NULL; -			} -			i++; -			tuple = PyTuple_Pack(2, k, k->ob_type); -			if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) { -				Py_DECREF(item); -				Py_DECREF(dest); -				Py_XDECREF(tuple); -				return NULL; -			} -			Py_DECREF(item); -			Py_DECREF(tuple); -		} -	} -	return dest; +    Py_ssize_t pos = 0, i = offset, scope; +    PyObject *k, *v, *dest = PyDict_New(); + +    assert(offset >= 0); +    if (dest == NULL) +        return NULL; + +    while (PyDict_Next(src, &pos, &k, &v)) { +        /* XXX this should probably be a macro in symtable.h */ +        long vi; +        assert(PyLong_Check(v)); +        vi = PyLong_AS_LONG(v); +        scope = (vi >> SCOPE_OFFSET) & SCOPE_MASK; + +        if (scope == scope_type || vi & flag) { +            PyObject *tuple, *item = PyLong_FromLong(i); +            if (item == NULL) { +                Py_DECREF(dest); +                return NULL; +            } +            i++; +            tuple = PyTuple_Pack(2, k, k->ob_type); +            if (!tuple || PyDict_SetItem(dest, tuple, item) < 0) { +                Py_DECREF(item); +                Py_DECREF(dest); +                Py_XDECREF(tuple); +                return NULL; +            } +            Py_DECREF(item); +            Py_DECREF(tuple); +        } +    } +    return dest;  }  static void  compiler_unit_check(struct compiler_unit *u)  { -	basicblock *block; -	for (block = u->u_blocks; block != NULL; block = block->b_list) { -		assert((void *)block != (void *)0xcbcbcbcb); -		assert((void *)block != (void *)0xfbfbfbfb); -		assert((void *)block != (void *)0xdbdbdbdb); -		if (block->b_instr != NULL) { -			assert(block->b_ialloc > 0); -			assert(block->b_iused > 0); -			assert(block->b_ialloc >= block->b_iused); -		} -		else { -			assert (block->b_iused == 0); -			assert (block->b_ialloc == 0); -		} -	} +    basicblock *block; +    for (block = u->u_blocks; block != NULL; block = block->b_list) { +        assert((void *)block != (void *)0xcbcbcbcb); +        assert((void *)block != (void *)0xfbfbfbfb); +        assert((void *)block != (void *)0xdbdbdbdb); +        if (block->b_instr != NULL) { +            assert(block->b_ialloc > 0); +            assert(block->b_iused > 0); +            assert(block->b_ialloc >= block->b_iused); +        } +        else { +            assert (block->b_iused == 0); +            assert (block->b_ialloc == 0); +        } +    }  }  static void  compiler_unit_free(struct compiler_unit *u)  { -	basicblock *b, *next; - -	compiler_unit_check(u); -	b = u->u_blocks; -	while (b != NULL) { -		if (b->b_instr) -			PyObject_Free((void *)b->b_instr); -		next = b->b_list; -		PyObject_Free((void *)b); -		b = next; -	} -	Py_CLEAR(u->u_ste); -	Py_CLEAR(u->u_name); -	Py_CLEAR(u->u_consts); -	Py_CLEAR(u->u_names); -	Py_CLEAR(u->u_varnames); -	Py_CLEAR(u->u_freevars); -	Py_CLEAR(u->u_cellvars); -	Py_CLEAR(u->u_private); -	PyObject_Free(u); +    basicblock *b, *next; + +    compiler_unit_check(u); +    b = u->u_blocks; +    while (b != NULL) { +        if (b->b_instr) +            PyObject_Free((void *)b->b_instr); +        next = b->b_list; +        PyObject_Free((void *)b); +        b = next; +    } +    Py_CLEAR(u->u_ste); +    Py_CLEAR(u->u_name); +    Py_CLEAR(u->u_consts); +    Py_CLEAR(u->u_names); +    Py_CLEAR(u->u_varnames); +    Py_CLEAR(u->u_freevars); +    Py_CLEAR(u->u_cellvars); +    Py_CLEAR(u->u_private); +    PyObject_Free(u);  }  static int  compiler_enter_scope(struct compiler *c, identifier name, void *key, -		     int lineno) -{ -	struct compiler_unit *u; - -	u = (struct compiler_unit *)PyObject_Malloc(sizeof( -						struct compiler_unit)); -	if (!u) { -		PyErr_NoMemory(); -		return 0; -	} -	memset(u, 0, sizeof(struct compiler_unit)); -	u->u_argcount = 0; -	u->u_kwonlyargcount = 0; -	u->u_ste = PySymtable_Lookup(c->c_st, key); -	if (!u->u_ste) { -		compiler_unit_free(u); -		return 0; -	} -	Py_INCREF(name); -	u->u_name = name; -	u->u_varnames = list2dict(u->u_ste->ste_varnames); -	u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); -	if (!u->u_varnames || !u->u_cellvars) { -		compiler_unit_free(u); -		return 0; -	} - -	u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, -				   PyDict_Size(u->u_cellvars)); -	if (!u->u_freevars) { -		compiler_unit_free(u); -		return 0; -	} - -	u->u_blocks = NULL; -	u->u_nfblocks = 0; -	u->u_firstlineno = lineno; -	u->u_lineno = 0; -	u->u_lineno_set = 0; -	u->u_consts = PyDict_New(); -	if (!u->u_consts) { -		compiler_unit_free(u); -		return 0; -	} -	u->u_names = PyDict_New(); -	if (!u->u_names) { -		compiler_unit_free(u); -		return 0; -	} - -	u->u_private = NULL; - -	/* Push the old compiler_unit on the stack. */ -	if (c->u) { -		PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL); -		if (!capsule || PyList_Append(c->c_stack, capsule) < 0) { -			Py_XDECREF(capsule); -			compiler_unit_free(u); -			return 0; -		} -		Py_DECREF(capsule); -		u->u_private = c->u->u_private; -		Py_XINCREF(u->u_private); -	} -	c->u = u; - -	c->c_nestlevel++; -	if (compiler_use_new_block(c) == NULL) -		return 0; - -	return 1; +                     int lineno) +{ +    struct compiler_unit *u; + +    u = (struct compiler_unit *)PyObject_Malloc(sizeof( +                                            struct compiler_unit)); +    if (!u) { +        PyErr_NoMemory(); +        return 0; +    } +    memset(u, 0, sizeof(struct compiler_unit)); +    u->u_argcount = 0; +    u->u_kwonlyargcount = 0; +    u->u_ste = PySymtable_Lookup(c->c_st, key); +    if (!u->u_ste) { +        compiler_unit_free(u); +        return 0; +    } +    Py_INCREF(name); +    u->u_name = name; +    u->u_varnames = list2dict(u->u_ste->ste_varnames); +    u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); +    if (!u->u_varnames || !u->u_cellvars) { +        compiler_unit_free(u); +        return 0; +    } + +    u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, +                               PyDict_Size(u->u_cellvars)); +    if (!u->u_freevars) { +        compiler_unit_free(u); +        return 0; +    } + +    u->u_blocks = NULL; +    u->u_nfblocks = 0; +    u->u_firstlineno = lineno; +    u->u_lineno = 0; +    u->u_lineno_set = 0; +    u->u_consts = PyDict_New(); +    if (!u->u_consts) { +        compiler_unit_free(u); +        return 0; +    } +    u->u_names = PyDict_New(); +    if (!u->u_names) { +        compiler_unit_free(u); +        return 0; +    } + +    u->u_private = NULL; + +    /* Push the old compiler_unit on the stack. */ +    if (c->u) { +        PyObject *capsule = PyCapsule_New(c->u, COMPILER_CAPSULE_NAME_COMPILER_UNIT, NULL); +        if (!capsule || PyList_Append(c->c_stack, capsule) < 0) { +            Py_XDECREF(capsule); +            compiler_unit_free(u); +            return 0; +        } +        Py_DECREF(capsule); +        u->u_private = c->u->u_private; +        Py_XINCREF(u->u_private); +    } +    c->u = u; + +    c->c_nestlevel++; +    if (compiler_use_new_block(c) == NULL) +        return 0; + +    return 1;  }  static void  compiler_exit_scope(struct compiler *c)  { -	int n; -	PyObject *capsule; - -	c->c_nestlevel--; -	compiler_unit_free(c->u); -	/* Restore c->u to the parent unit. */ -	n = PyList_GET_SIZE(c->c_stack) - 1; -	if (n >= 0) { -		capsule = PyList_GET_ITEM(c->c_stack, n); -		c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); -		assert(c->u); -		/* we are deleting from a list so this really shouldn't fail */ -		if (PySequence_DelItem(c->c_stack, n) < 0) -			Py_FatalError("compiler_exit_scope()"); -		compiler_unit_check(c->u); -	} -	else -		c->u = NULL; +    int n; +    PyObject *capsule; + +    c->c_nestlevel--; +    compiler_unit_free(c->u); +    /* Restore c->u to the parent unit. */ +    n = PyList_GET_SIZE(c->c_stack) - 1; +    if (n >= 0) { +        capsule = PyList_GET_ITEM(c->c_stack, n); +        c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, COMPILER_CAPSULE_NAME_COMPILER_UNIT); +        assert(c->u); +        /* we are deleting from a list so this really shouldn't fail */ +        if (PySequence_DelItem(c->c_stack, n) < 0) +            Py_FatalError("compiler_exit_scope()"); +        compiler_unit_check(c->u); +    } +    else +        c->u = NULL;  } @@ -552,50 +552,50 @@ compiler_exit_scope(struct compiler *c)  static basicblock *  compiler_new_block(struct compiler *c)  { -	basicblock *b; -	struct compiler_unit *u; +    basicblock *b; +    struct compiler_unit *u; -	u = c->u; -	b = (basicblock *)PyObject_Malloc(sizeof(basicblock)); -	if (b == NULL) { -		PyErr_NoMemory(); -		return NULL; -	} -	memset((void *)b, 0, sizeof(basicblock)); -	/* Extend the singly linked list of blocks with new block. */ -	b->b_list = u->u_blocks; -	u->u_blocks = b; -	return b; +    u = c->u; +    b = (basicblock *)PyObject_Malloc(sizeof(basicblock)); +    if (b == NULL) { +        PyErr_NoMemory(); +        return NULL; +    } +    memset((void *)b, 0, sizeof(basicblock)); +    /* Extend the singly linked list of blocks with new block. */ +    b->b_list = u->u_blocks; +    u->u_blocks = b; +    return b;  }  static basicblock *  compiler_use_new_block(struct compiler *c)  { -	basicblock *block = compiler_new_block(c); -	if (block == NULL) -		return NULL; -	c->u->u_curblock = block; -	return block; +    basicblock *block = compiler_new_block(c); +    if (block == NULL) +        return NULL; +    c->u->u_curblock = block; +    return block;  }  static basicblock *  compiler_next_block(struct compiler *c)  { -	basicblock *block = compiler_new_block(c); -	if (block == NULL) -		return NULL; -	c->u->u_curblock->b_next = block; -	c->u->u_curblock = block; -	return block; +    basicblock *block = compiler_new_block(c); +    if (block == NULL) +        return NULL; +    c->u->u_curblock->b_next = block; +    c->u->u_curblock = block; +    return block;  }  static basicblock *  compiler_use_next_block(struct compiler *c, basicblock *block)  { -	assert(block != NULL); -	c->u->u_curblock->b_next = block; -	c->u->u_curblock = block; -	return block; +    assert(block != NULL); +    c->u->u_curblock->b_next = block; +    c->u->u_curblock = block; +    return block;  }  /* Returns the offset of the next instruction in the current block's @@ -606,44 +606,44 @@ compiler_use_next_block(struct compiler *c, basicblock *block)  static int  compiler_next_instr(struct compiler *c, basicblock *b)  { -	assert(b != NULL); -	if (b->b_instr == NULL) { -		b->b_instr = (struct instr *)PyObject_Malloc( -				 sizeof(struct instr) * DEFAULT_BLOCK_SIZE); -		if (b->b_instr == NULL) { -			PyErr_NoMemory(); -			return -1; -		} -		b->b_ialloc = DEFAULT_BLOCK_SIZE; -		memset((char *)b->b_instr, 0, -		       sizeof(struct instr) * DEFAULT_BLOCK_SIZE); -	} -	else if (b->b_iused == b->b_ialloc) { -		struct instr *tmp; -		size_t oldsize, newsize; -		oldsize = b->b_ialloc * sizeof(struct instr); -		newsize = oldsize << 1; - -		if (oldsize > (PY_SIZE_MAX >> 1)) { -			PyErr_NoMemory(); -			return -1; -		} - -		if (newsize == 0) { -			PyErr_NoMemory(); -			return -1; -		} -		b->b_ialloc <<= 1; -		tmp = (struct instr *)PyObject_Realloc( -						(void *)b->b_instr, newsize); -		if (tmp == NULL) { -			PyErr_NoMemory(); -			return -1; -		} -		b->b_instr = tmp; -		memset((char *)b->b_instr + oldsize, 0, newsize - oldsize); -	} -	return b->b_iused++; +    assert(b != NULL); +    if (b->b_instr == NULL) { +        b->b_instr = (struct instr *)PyObject_Malloc( +                         sizeof(struct instr) * DEFAULT_BLOCK_SIZE); +        if (b->b_instr == NULL) { +            PyErr_NoMemory(); +            return -1; +        } +        b->b_ialloc = DEFAULT_BLOCK_SIZE; +        memset((char *)b->b_instr, 0, +               sizeof(struct instr) * DEFAULT_BLOCK_SIZE); +    } +    else if (b->b_iused == b->b_ialloc) { +        struct instr *tmp; +        size_t oldsize, newsize; +        oldsize = b->b_ialloc * sizeof(struct instr); +        newsize = oldsize << 1; + +        if (oldsize > (PY_SIZE_MAX >> 1)) { +            PyErr_NoMemory(); +            return -1; +        } + +        if (newsize == 0) { +            PyErr_NoMemory(); +            return -1; +        } +        b->b_ialloc <<= 1; +        tmp = (struct instr *)PyObject_Realloc( +                                        (void *)b->b_instr, newsize); +        if (tmp == NULL) { +            PyErr_NoMemory(); +            return -1; +        } +        b->b_instr = tmp; +        memset((char *)b->b_instr + oldsize, 0, newsize - oldsize); +    } +    return b->b_iused++;  }  /* Set the i_lineno member of the instruction at offset off if the @@ -661,210 +661,210 @@ compiler_next_instr(struct compiler *c, basicblock *b)  static void  compiler_set_lineno(struct compiler *c, int off)  { -	basicblock *b; -	if (c->u->u_lineno_set) -		return; -	c->u->u_lineno_set = 1; -	b = c->u->u_curblock; -	b->b_instr[off].i_lineno = c->u->u_lineno; +    basicblock *b; +    if (c->u->u_lineno_set) +        return; +    c->u->u_lineno_set = 1; +    b = c->u->u_curblock; +    b->b_instr[off].i_lineno = c->u->u_lineno;  }  static int  opcode_stack_effect(int opcode, int oparg)  { -	switch (opcode) { -		case POP_TOP: -			return -1; -		case ROT_TWO: -		case ROT_THREE: -			return 0; -		case DUP_TOP: -			return 1; -		case ROT_FOUR: -			return 0; - -		case UNARY_POSITIVE: -		case UNARY_NEGATIVE: -		case UNARY_NOT: -		case UNARY_INVERT: -			return 0; - -		case SET_ADD: -		case LIST_APPEND: -			return -1; -		case MAP_ADD: -			return -2; - -		case BINARY_POWER: -		case BINARY_MULTIPLY: -		case BINARY_MODULO: -		case BINARY_ADD: -		case BINARY_SUBTRACT: -		case BINARY_SUBSCR: -		case BINARY_FLOOR_DIVIDE: -		case BINARY_TRUE_DIVIDE: -			return -1; -		case INPLACE_FLOOR_DIVIDE: -		case INPLACE_TRUE_DIVIDE: -			return -1; - -		case INPLACE_ADD: -		case INPLACE_SUBTRACT: -		case INPLACE_MULTIPLY: -		case INPLACE_MODULO: -			return -1; -		case STORE_SUBSCR: -			return -3; -		case STORE_MAP: -			return -2; -		case DELETE_SUBSCR: -			return -2; - -		case BINARY_LSHIFT: -		case BINARY_RSHIFT: -		case BINARY_AND: -		case BINARY_XOR: -		case BINARY_OR: -			return -1; -		case INPLACE_POWER: -			return -1; -		case GET_ITER: -			return 0; - -		case PRINT_EXPR: -			return -1; -		case LOAD_BUILD_CLASS: -			return 1; -		case INPLACE_LSHIFT: -		case INPLACE_RSHIFT: -		case INPLACE_AND: -		case INPLACE_XOR: -		case INPLACE_OR: -			return -1; -		case BREAK_LOOP: -			return 0; -	        case SETUP_WITH: -			return 7; -		case WITH_CLEANUP: -			return -1; /* XXX Sometimes more */ -		case STORE_LOCALS: -			return -1; -		case RETURN_VALUE: -			return -1; -		case IMPORT_STAR: -			return -1; -		case YIELD_VALUE: -			return 0; - -		case POP_BLOCK: -			return 0; -		case POP_EXCEPT: -			return 0;  /* -3 except if bad bytecode */ -		case END_FINALLY: -			return -1; /* or -2 or -3 if exception occurred */ - -		case STORE_NAME: -			return -1; -		case DELETE_NAME: -			return 0; -		case UNPACK_SEQUENCE: -			return oparg-1; -		case UNPACK_EX: -			return (oparg&0xFF) + (oparg>>8); -		case FOR_ITER: -			return 1; /* or -1, at end of iterator */ - -		case STORE_ATTR: -			return -2; -		case DELETE_ATTR: -			return -1; -		case STORE_GLOBAL: -			return -1; -		case DELETE_GLOBAL: -			return 0; -		case DUP_TOPX: -			return oparg; -		case LOAD_CONST: -			return 1; -		case LOAD_NAME: -			return 1; -		case BUILD_TUPLE: -		case BUILD_LIST: -		case BUILD_SET: -			return 1-oparg; -		case BUILD_MAP: -			return 1; -		case LOAD_ATTR: -			return 0; -		case COMPARE_OP: -			return -1; -		case IMPORT_NAME: -			return -1; -		case IMPORT_FROM: -			return 1; - -		case JUMP_FORWARD: -		case JUMP_IF_TRUE_OR_POP:  /* -1 if jump not taken */ -		case JUMP_IF_FALSE_OR_POP:  /*  "" */ -		case JUMP_ABSOLUTE: -			return 0; - -		case POP_JUMP_IF_FALSE: -		case POP_JUMP_IF_TRUE: -			return -1; - -		case LOAD_GLOBAL: -			return 1; - -		case CONTINUE_LOOP: -			return 0; -		case SETUP_LOOP: -			return 0; -		case SETUP_EXCEPT: -		case SETUP_FINALLY: -			return 6; /* can push 3 values for the new exception -				+ 3 others for the previous exception state */ - -		case LOAD_FAST: -			return 1; -		case STORE_FAST: -			return -1; -		case DELETE_FAST: -			return 0; - -		case RAISE_VARARGS: -			return -oparg; +    switch (opcode) { +        case POP_TOP: +            return -1; +        case ROT_TWO: +        case ROT_THREE: +            return 0; +        case DUP_TOP: +            return 1; +        case ROT_FOUR: +            return 0; + +        case UNARY_POSITIVE: +        case UNARY_NEGATIVE: +        case UNARY_NOT: +        case UNARY_INVERT: +            return 0; + +        case SET_ADD: +        case LIST_APPEND: +            return -1; +        case MAP_ADD: +            return -2; + +        case BINARY_POWER: +        case BINARY_MULTIPLY: +        case BINARY_MODULO: +        case BINARY_ADD: +        case BINARY_SUBTRACT: +        case BINARY_SUBSCR: +        case BINARY_FLOOR_DIVIDE: +        case BINARY_TRUE_DIVIDE: +            return -1; +        case INPLACE_FLOOR_DIVIDE: +        case INPLACE_TRUE_DIVIDE: +            return -1; + +        case INPLACE_ADD: +        case INPLACE_SUBTRACT: +        case INPLACE_MULTIPLY: +        case INPLACE_MODULO: +            return -1; +        case STORE_SUBSCR: +            return -3; +        case STORE_MAP: +            return -2; +        case DELETE_SUBSCR: +            return -2; + +        case BINARY_LSHIFT: +        case BINARY_RSHIFT: +        case BINARY_AND: +        case BINARY_XOR: +        case BINARY_OR: +            return -1; +        case INPLACE_POWER: +            return -1; +        case GET_ITER: +            return 0; + +        case PRINT_EXPR: +            return -1; +        case LOAD_BUILD_CLASS: +            return 1; +        case INPLACE_LSHIFT: +        case INPLACE_RSHIFT: +        case INPLACE_AND: +        case INPLACE_XOR: +        case INPLACE_OR: +            return -1; +        case BREAK_LOOP: +            return 0; +        case SETUP_WITH: +            return 7; +        case WITH_CLEANUP: +            return -1; /* XXX Sometimes more */ +        case STORE_LOCALS: +            return -1; +        case RETURN_VALUE: +            return -1; +        case IMPORT_STAR: +            return -1; +        case YIELD_VALUE: +            return 0; + +        case POP_BLOCK: +            return 0; +        case POP_EXCEPT: +            return 0;  /* -3 except if bad bytecode */ +        case END_FINALLY: +            return -1; /* or -2 or -3 if exception occurred */ + +        case STORE_NAME: +            return -1; +        case DELETE_NAME: +            return 0; +        case UNPACK_SEQUENCE: +            return oparg-1; +        case UNPACK_EX: +            return (oparg&0xFF) + (oparg>>8); +        case FOR_ITER: +            return 1; /* or -1, at end of iterator */ + +        case STORE_ATTR: +            return -2; +        case DELETE_ATTR: +            return -1; +        case STORE_GLOBAL: +            return -1; +        case DELETE_GLOBAL: +            return 0; +        case DUP_TOPX: +            return oparg; +        case LOAD_CONST: +            return 1; +        case LOAD_NAME: +            return 1; +        case BUILD_TUPLE: +        case BUILD_LIST: +        case BUILD_SET: +            return 1-oparg; +        case BUILD_MAP: +            return 1; +        case LOAD_ATTR: +            return 0; +        case COMPARE_OP: +            return -1; +        case IMPORT_NAME: +            return -1; +        case IMPORT_FROM: +            return 1; + +        case JUMP_FORWARD: +        case JUMP_IF_TRUE_OR_POP:  /* -1 if jump not taken */ +        case JUMP_IF_FALSE_OR_POP:  /*  "" */ +        case JUMP_ABSOLUTE: +            return 0; + +        case POP_JUMP_IF_FALSE: +        case POP_JUMP_IF_TRUE: +            return -1; + +        case LOAD_GLOBAL: +            return 1; + +        case CONTINUE_LOOP: +            return 0; +        case SETUP_LOOP: +            return 0; +        case SETUP_EXCEPT: +        case SETUP_FINALLY: +            return 6; /* can push 3 values for the new exception +                + 3 others for the previous exception state */ + +        case LOAD_FAST: +            return 1; +        case STORE_FAST: +            return -1; +        case DELETE_FAST: +            return 0; + +        case RAISE_VARARGS: +            return -oparg;  #define NARGS(o) (((o) % 256) + 2*(((o) / 256) % 256)) -		case CALL_FUNCTION: -			return -NARGS(oparg); -		case CALL_FUNCTION_VAR: -		case CALL_FUNCTION_KW: -			return -NARGS(oparg)-1; -		case CALL_FUNCTION_VAR_KW: -			return -NARGS(oparg)-2; -		case MAKE_FUNCTION: -			return -NARGS(oparg) - ((oparg >> 16) & 0xffff); -		case MAKE_CLOSURE: -			return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff); +        case CALL_FUNCTION: +            return -NARGS(oparg); +        case CALL_FUNCTION_VAR: +        case CALL_FUNCTION_KW: +            return -NARGS(oparg)-1; +        case CALL_FUNCTION_VAR_KW: +            return -NARGS(oparg)-2; +        case MAKE_FUNCTION: +            return -NARGS(oparg) - ((oparg >> 16) & 0xffff); +        case MAKE_CLOSURE: +            return -1 - NARGS(oparg) - ((oparg >> 16) & 0xffff);  #undef NARGS -		case BUILD_SLICE: -			if (oparg == 3) -				return -2; -			else -				return -1; - -		case LOAD_CLOSURE: -			return 1; -		case LOAD_DEREF: -			return 1; -		case STORE_DEREF: -			return -1; -		default: -			fprintf(stderr, "opcode = %d\n", opcode); -			Py_FatalError("opcode_stack_effect()"); - -	} -	return 0; /* not reachable */ +        case BUILD_SLICE: +            if (oparg == 3) +                return -2; +            else +                return -1; + +        case LOAD_CLOSURE: +            return 1; +        case LOAD_DEREF: +            return 1; +        case STORE_DEREF: +            return -1; +        default: +            fprintf(stderr, "opcode = %d\n", opcode); +            Py_FatalError("opcode_stack_effect()"); + +    } +    return 0; /* not reachable */  }  /* Add an opcode with no argument. @@ -874,116 +874,116 @@ opcode_stack_effect(int opcode, int oparg)  static int  compiler_addop(struct compiler *c, int opcode)  { -	basicblock *b; -	struct instr *i; -	int off; -	off = compiler_next_instr(c, c->u->u_curblock); -	if (off < 0) -		return 0; -	b = c->u->u_curblock; -	i = &b->b_instr[off]; -	i->i_opcode = opcode; -	i->i_hasarg = 0; -	if (opcode == RETURN_VALUE) -		b->b_return = 1; -	compiler_set_lineno(c, off); -	return 1; +    basicblock *b; +    struct instr *i; +    int off; +    off = compiler_next_instr(c, c->u->u_curblock); +    if (off < 0) +        return 0; +    b = c->u->u_curblock; +    i = &b->b_instr[off]; +    i->i_opcode = opcode; +    i->i_hasarg = 0; +    if (opcode == RETURN_VALUE) +        b->b_return = 1; +    compiler_set_lineno(c, off); +    return 1;  }  static int  compiler_add_o(struct compiler *c, PyObject *dict, PyObject *o)  { -	PyObject *t, *v; -	Py_ssize_t arg; -	double d; - -	/* necessary to make sure types aren't coerced (e.g., int and long) */ -        /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */ -        if (PyFloat_Check(o)) { -		d = PyFloat_AS_DOUBLE(o); -		/* all we need is to make the tuple different in either the 0.0 -		 * or -0.0 case from all others, just to avoid the "coercion". -		 */ -		if (d == 0.0 && copysign(1.0, d) < 0.0) -			t = PyTuple_Pack(3, o, o->ob_type, Py_None); -		else -			t = PyTuple_Pack(2, o, o->ob_type); -	} -	else if (PyComplex_Check(o)) { -		Py_complex z; -		int real_negzero, imag_negzero; -		/* For the complex case we must make complex(x, 0.) -		   different from complex(x, -0.) and complex(0., y) -		   different from complex(-0., y), for any x and y. -		   All four complex zeros must be distinguished.*/ -		z = PyComplex_AsCComplex(o); -		real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0; -		imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0; -		if (real_negzero && imag_negzero) { -			t = PyTuple_Pack(5, o, o->ob_type, -					 Py_None, Py_None, Py_None); -		} -		else if (imag_negzero) { -			t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None); -		} -		else if (real_negzero) { -			t = PyTuple_Pack(3, o, o->ob_type, Py_None); -		} -		else { -			t = PyTuple_Pack(2, o, o->ob_type); -		} -        } -	else { -		t = PyTuple_Pack(2, o, o->ob_type); -        } -	if (t == NULL) -		return -1; - -	v = PyDict_GetItem(dict, t); -	if (!v) { -                if (PyErr_Occurred()) -                        return -1; -		arg = PyDict_Size(dict); -		v = PyLong_FromLong(arg); -		if (!v) { -			Py_DECREF(t); -			return -1; -		} -		if (PyDict_SetItem(dict, t, v) < 0) { -			Py_DECREF(t); -			Py_DECREF(v); -			return -1; -		} -		Py_DECREF(v); -	} -	else -		arg = PyLong_AsLong(v); -	Py_DECREF(t); -	return arg; +    PyObject *t, *v; +    Py_ssize_t arg; +    double d; + +    /* necessary to make sure types aren't coerced (e.g., int and long) */ +    /* _and_ to distinguish 0.0 from -0.0 e.g. on IEEE platforms */ +    if (PyFloat_Check(o)) { +        d = PyFloat_AS_DOUBLE(o); +        /* all we need is to make the tuple different in either the 0.0 +         * or -0.0 case from all others, just to avoid the "coercion". +         */ +        if (d == 0.0 && copysign(1.0, d) < 0.0) +            t = PyTuple_Pack(3, o, o->ob_type, Py_None); +        else +            t = PyTuple_Pack(2, o, o->ob_type); +    } +    else if (PyComplex_Check(o)) { +        Py_complex z; +        int real_negzero, imag_negzero; +        /* For the complex case we must make complex(x, 0.) +           different from complex(x, -0.) and complex(0., y) +           different from complex(-0., y), for any x and y. +           All four complex zeros must be distinguished.*/ +        z = PyComplex_AsCComplex(o); +        real_negzero = z.real == 0.0 && copysign(1.0, z.real) < 0.0; +        imag_negzero = z.imag == 0.0 && copysign(1.0, z.imag) < 0.0; +        if (real_negzero && imag_negzero) { +            t = PyTuple_Pack(5, o, o->ob_type, +                             Py_None, Py_None, Py_None); +        } +        else if (imag_negzero) { +            t = PyTuple_Pack(4, o, o->ob_type, Py_None, Py_None); +        } +        else if (real_negzero) { +            t = PyTuple_Pack(3, o, o->ob_type, Py_None); +        } +        else { +            t = PyTuple_Pack(2, o, o->ob_type); +        } +    } +    else { +        t = PyTuple_Pack(2, o, o->ob_type); +    } +    if (t == NULL) +        return -1; + +    v = PyDict_GetItem(dict, t); +    if (!v) { +        if (PyErr_Occurred()) +            return -1; +        arg = PyDict_Size(dict); +        v = PyLong_FromLong(arg); +        if (!v) { +            Py_DECREF(t); +            return -1; +        } +        if (PyDict_SetItem(dict, t, v) < 0) { +            Py_DECREF(t); +            Py_DECREF(v); +            return -1; +        } +        Py_DECREF(v); +    } +    else +        arg = PyLong_AsLong(v); +    Py_DECREF(t); +    return arg;  }  static int  compiler_addop_o(struct compiler *c, int opcode, PyObject *dict, -		     PyObject *o) +                     PyObject *o)  {      int arg = compiler_add_o(c, dict, o);      if (arg < 0) -	return 0; +    return 0;      return compiler_addop_i(c, opcode, arg);  }  static int  compiler_addop_name(struct compiler *c, int opcode, PyObject *dict, -		    PyObject *o) +                    PyObject *o)  {      int arg;      PyObject *mangled = _Py_Mangle(c->u->u_private, o);      if (!mangled) -	return 0; +    return 0;      arg = compiler_add_o(c, dict, mangled);      Py_DECREF(mangled);      if (arg < 0) -	return 0; +    return 0;      return compiler_addop_i(c, opcode, arg);  } @@ -994,43 +994,43 @@ compiler_addop_name(struct compiler *c, int opcode, PyObject *dict,  static int  compiler_addop_i(struct compiler *c, int opcode, int oparg)  { -	struct instr *i; -	int off; -	off = compiler_next_instr(c, c->u->u_curblock); -	if (off < 0) -		return 0; -	i = &c->u->u_curblock->b_instr[off]; -	i->i_opcode = opcode; -	i->i_oparg = oparg; -	i->i_hasarg = 1; -	compiler_set_lineno(c, off); -	return 1; +    struct instr *i; +    int off; +    off = compiler_next_instr(c, c->u->u_curblock); +    if (off < 0) +        return 0; +    i = &c->u->u_curblock->b_instr[off]; +    i->i_opcode = opcode; +    i->i_oparg = oparg; +    i->i_hasarg = 1; +    compiler_set_lineno(c, off); +    return 1;  }  static int  compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)  { -	struct instr *i; -	int off; - -	assert(b != NULL); -	off = compiler_next_instr(c, c->u->u_curblock); -	if (off < 0) -		return 0; -	i = &c->u->u_curblock->b_instr[off]; -	i->i_opcode = opcode; -	i->i_target = b; -	i->i_hasarg = 1; -	if (absolute) -		i->i_jabs = 1; -	else -		i->i_jrel = 1; -	compiler_set_lineno(c, off); -	return 1; -} - -/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle.	(I'd -   like to find better names.)	NEW_BLOCK() creates a new block and sets +    struct instr *i; +    int off; + +    assert(b != NULL); +    off = compiler_next_instr(c, c->u->u_curblock); +    if (off < 0) +        return 0; +    i = &c->u->u_curblock->b_instr[off]; +    i->i_opcode = opcode; +    i->i_target = b; +    i->i_hasarg = 1; +    if (absolute) +        i->i_jabs = 1; +    else +        i->i_jrel = 1; +    compiler_set_lineno(c, off); +    return 1; +} + +/* The distinction between NEW_BLOCK and NEXT_BLOCK is subtle.  (I'd +   like to find better names.)  NEW_BLOCK() creates a new block and sets     it as the current block.  NEXT_BLOCK() also creates an implicit jump     from the current block to the new block.  */ @@ -1041,50 +1041,50 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)  #define NEW_BLOCK(C) { \ -	if (compiler_use_new_block((C)) == NULL) \ -		return 0; \ +    if (compiler_use_new_block((C)) == NULL) \ +        return 0; \  }  #define NEXT_BLOCK(C) { \ -	if (compiler_next_block((C)) == NULL) \ -		return 0; \ +    if (compiler_next_block((C)) == NULL) \ +        return 0; \  }  #define ADDOP(C, OP) { \ -	if (!compiler_addop((C), (OP))) \ -		return 0; \ +    if (!compiler_addop((C), (OP))) \ +        return 0; \  }  #define ADDOP_IN_SCOPE(C, OP) { \ -	if (!compiler_addop((C), (OP))) { \ -		compiler_exit_scope(c); \ -		return 0; \ -	} \ +    if (!compiler_addop((C), (OP))) { \ +        compiler_exit_scope(c); \ +        return 0; \ +    } \  }  #define ADDOP_O(C, OP, O, TYPE) { \ -	if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \ -		return 0; \ +    if (!compiler_addop_o((C), (OP), (C)->u->u_ ## TYPE, (O))) \ +        return 0; \  }  #define ADDOP_NAME(C, OP, O, TYPE) { \ -	if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \ -		return 0; \ +    if (!compiler_addop_name((C), (OP), (C)->u->u_ ## TYPE, (O))) \ +        return 0; \  }  #define ADDOP_I(C, OP, O) { \ -	if (!compiler_addop_i((C), (OP), (O))) \ -		return 0; \ +    if (!compiler_addop_i((C), (OP), (O))) \ +        return 0; \  }  #define ADDOP_JABS(C, OP, O) { \ -	if (!compiler_addop_j((C), (OP), (O), 1)) \ -		return 0; \ +    if (!compiler_addop_j((C), (OP), (O), 1)) \ +        return 0; \  }  #define ADDOP_JREL(C, OP, O) { \ -	if (!compiler_addop_j((C), (OP), (O), 0)) \ -		return 0; \ +    if (!compiler_addop_j((C), (OP), (O), 0)) \ +        return 0; \  }  /* VISIT and VISIT_SEQ takes an ASDL type as their second argument.  They use @@ -1092,49 +1092,49 @@ compiler_addop_j(struct compiler *c, int opcode, basicblock *b, int absolute)  */  #define VISIT(C, TYPE, V) {\ -	if (!compiler_visit_ ## TYPE((C), (V))) \ -		return 0; \ +    if (!compiler_visit_ ## TYPE((C), (V))) \ +        return 0; \  }  #define VISIT_IN_SCOPE(C, TYPE, V) {\ -	if (!compiler_visit_ ## TYPE((C), (V))) { \ -		compiler_exit_scope(c); \ -		return 0; \ -	} \ +    if (!compiler_visit_ ## TYPE((C), (V))) { \ +        compiler_exit_scope(c); \ +        return 0; \ +    } \  }  #define VISIT_SLICE(C, V, CTX) {\ -	if (!compiler_visit_slice((C), (V), (CTX))) \ -		return 0; \ +    if (!compiler_visit_slice((C), (V), (CTX))) \ +        return 0; \  }  #define VISIT_SEQ(C, TYPE, SEQ) { \ -	int _i; \ -	asdl_seq *seq = (SEQ); /* avoid variable capture */ \ -	for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ -		TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ -		if (!compiler_visit_ ## TYPE((C), elt)) \ -			return 0; \ -	} \ +    int _i; \ +    asdl_seq *seq = (SEQ); /* avoid variable capture */ \ +    for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ +        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ +        if (!compiler_visit_ ## TYPE((C), elt)) \ +            return 0; \ +    } \  }  #define VISIT_SEQ_IN_SCOPE(C, TYPE, SEQ) { \ -	int _i; \ -	asdl_seq *seq = (SEQ); /* avoid variable capture */ \ -	for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ -		TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ -		if (!compiler_visit_ ## TYPE((C), elt)) { \ -			compiler_exit_scope(c); \ -			return 0; \ -		} \ -	} \ +    int _i; \ +    asdl_seq *seq = (SEQ); /* avoid variable capture */ \ +    for (_i = 0; _i < asdl_seq_LEN(seq); _i++) { \ +        TYPE ## _ty elt = (TYPE ## _ty)asdl_seq_GET(seq, _i); \ +        if (!compiler_visit_ ## TYPE((C), elt)) { \ +            compiler_exit_scope(c); \ +            return 0; \ +        } \ +    } \  }  static int  compiler_isdocstring(stmt_ty s)  {      if (s->kind != Expr_kind) -	return 0; +    return 0;      return s->v.Expr.value->kind == Str_kind;  } @@ -1143,67 +1143,67 @@ compiler_isdocstring(stmt_ty s)  static int  compiler_body(struct compiler *c, asdl_seq *stmts)  { -	int i = 0; -	stmt_ty st; - -	if (!asdl_seq_LEN(stmts)) -		return 1; -	st = (stmt_ty)asdl_seq_GET(stmts, 0); -	if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) { -		/* don't generate docstrings if -OO */ -		i = 1; -		VISIT(c, expr, st->v.Expr.value); -		if (!compiler_nameop(c, __doc__, Store)) -			return 0; -	} -	for (; i < asdl_seq_LEN(stmts); i++) -	    VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i)); -	return 1; +    int i = 0; +    stmt_ty st; + +    if (!asdl_seq_LEN(stmts)) +        return 1; +    st = (stmt_ty)asdl_seq_GET(stmts, 0); +    if (compiler_isdocstring(st) && Py_OptimizeFlag < 2) { +        /* don't generate docstrings if -OO */ +        i = 1; +        VISIT(c, expr, st->v.Expr.value); +        if (!compiler_nameop(c, __doc__, Store)) +            return 0; +    } +    for (; i < asdl_seq_LEN(stmts); i++) +        VISIT(c, stmt, (stmt_ty)asdl_seq_GET(stmts, i)); +    return 1;  }  static PyCodeObject *  compiler_mod(struct compiler *c, mod_ty mod)  { -	PyCodeObject *co; -	int addNone = 1; -	static PyObject *module; -	if (!module) { -		module = PyUnicode_InternFromString("<module>"); -		if (!module) -			return NULL; -	} -	/* Use 0 for firstlineno initially, will fixup in assemble(). */ -	if (!compiler_enter_scope(c, module, mod, 0)) -		return NULL; -	switch (mod->kind) { -	case Module_kind:  -		if (!compiler_body(c, mod->v.Module.body)) { -			compiler_exit_scope(c); -			return 0; -		} -		break; -	case Interactive_kind: -		c->c_interactive = 1; -		VISIT_SEQ_IN_SCOPE(c, stmt,  -					mod->v.Interactive.body); -		break; -	case Expression_kind: -		VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); -		addNone = 0; -		break; -	case Suite_kind: -		PyErr_SetString(PyExc_SystemError, -				"suite should not be possible"); -		return 0; -	default: -		PyErr_Format(PyExc_SystemError, -			     "module kind %d should not be possible", -			     mod->kind); -		return 0; -	} -	co = assemble(c, addNone); -	compiler_exit_scope(c); -	return co; +    PyCodeObject *co; +    int addNone = 1; +    static PyObject *module; +    if (!module) { +        module = PyUnicode_InternFromString("<module>"); +        if (!module) +            return NULL; +    } +    /* Use 0 for firstlineno initially, will fixup in assemble(). */ +    if (!compiler_enter_scope(c, module, mod, 0)) +        return NULL; +    switch (mod->kind) { +    case Module_kind: +        if (!compiler_body(c, mod->v.Module.body)) { +            compiler_exit_scope(c); +            return 0; +        } +        break; +    case Interactive_kind: +        c->c_interactive = 1; +        VISIT_SEQ_IN_SCOPE(c, stmt, +                                mod->v.Interactive.body); +        break; +    case Expression_kind: +        VISIT_IN_SCOPE(c, expr, mod->v.Expression.body); +        addNone = 0; +        break; +    case Suite_kind: +        PyErr_SetString(PyExc_SystemError, +                        "suite should not be possible"); +        return 0; +    default: +        PyErr_Format(PyExc_SystemError, +                     "module kind %d should not be possible", +                     mod->kind); +        return 0; +    } +    co = assemble(c, addNone); +    compiler_exit_scope(c); +    return co;  }  /* The test for LOCAL must come before the test for FREE in order to @@ -1214,24 +1214,24 @@ compiler_mod(struct compiler *c, mod_ty mod)  static int  get_ref_type(struct compiler *c, PyObject *name)  { -	int scope = PyST_GetScope(c->u->u_ste, name); -	if (scope == 0) { -	    char buf[350]; -	    PyOS_snprintf(buf, sizeof(buf), -			  "unknown scope for %.100s in %.100s(%s) in %s\n" -			  "symbols: %s\nlocals: %s\nglobals: %s", -			  PyBytes_AS_STRING(name),  -			  PyBytes_AS_STRING(c->u->u_name),  -			  PyObject_REPR(c->u->u_ste->ste_id), -			  c->c_filename, -			  PyObject_REPR(c->u->u_ste->ste_symbols), -			  PyObject_REPR(c->u->u_varnames), -			  PyObject_REPR(c->u->u_names) -		); -	    Py_FatalError(buf); -	} +    int scope = PyST_GetScope(c->u->u_ste, name); +    if (scope == 0) { +        char buf[350]; +        PyOS_snprintf(buf, sizeof(buf), +                      "unknown scope for %.100s in %.100s(%s) in %s\n" +                      "symbols: %s\nlocals: %s\nglobals: %s", +                      PyBytes_AS_STRING(name), +                      PyBytes_AS_STRING(c->u->u_name), +                      PyObject_REPR(c->u->u_ste->ste_id), +                      c->c_filename, +                      PyObject_REPR(c->u->u_ste->ste_symbols), +                      PyObject_REPR(c->u->u_varnames), +                      PyObject_REPR(c->u->u_names) +        ); +        Py_FatalError(buf); +    } -	return scope; +    return scope;  }  static int @@ -1240,636 +1240,636 @@ compiler_lookup_arg(PyObject *dict, PyObject *name)      PyObject *k, *v;      k = PyTuple_Pack(2, name, name->ob_type);      if (k == NULL) -	return -1; +    return -1;      v = PyDict_GetItem(dict, k);      Py_DECREF(k);      if (v == NULL) -	return -1; +    return -1;      return PyLong_AS_LONG(v);  }  static int  compiler_make_closure(struct compiler *c, PyCodeObject *co, int args)  { -	int i, free = PyCode_GetNumFree(co); -	if (free == 0) { -	    ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); -	    ADDOP_I(c, MAKE_FUNCTION, args); -	    return 1; -	} -	for (i = 0; i < free; ++i) { -		/* Bypass com_addop_varname because it will generate -		   LOAD_DEREF but LOAD_CLOSURE is needed.  -		*/ -		PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); -		int arg, reftype; - -		/* Special case: If a class contains a method with a -		   free variable that has the same name as a method, -		   the name will be considered free *and* local in the -		   class.  It should be handled by the closure, as -		   well as by the normal name loookup logic. -		*/ -		reftype = get_ref_type(c, name); -		if (reftype == CELL) -			arg = compiler_lookup_arg(c->u->u_cellvars, name); -		else /* (reftype == FREE) */ -			arg = compiler_lookup_arg(c->u->u_freevars, name); -		if (arg == -1) { -			fprintf(stderr, -				"lookup %s in %s %d %d\n" -				"freevars of %s: %s\n", -				PyObject_REPR(name),  -				PyBytes_AS_STRING(c->u->u_name),  -				reftype, arg, -				_PyUnicode_AsString(co->co_name), -				PyObject_REPR(co->co_freevars)); -			Py_FatalError("compiler_make_closure()"); -		} -		ADDOP_I(c, LOAD_CLOSURE, arg); -	} -	ADDOP_I(c, BUILD_TUPLE, free); -	ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); -	ADDOP_I(c, MAKE_CLOSURE, args); -	return 1; +    int i, free = PyCode_GetNumFree(co); +    if (free == 0) { +        ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); +        ADDOP_I(c, MAKE_FUNCTION, args); +        return 1; +    } +    for (i = 0; i < free; ++i) { +        /* Bypass com_addop_varname because it will generate +           LOAD_DEREF but LOAD_CLOSURE is needed. +        */ +        PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i); +        int arg, reftype; + +        /* Special case: If a class contains a method with a +           free variable that has the same name as a method, +           the name will be considered free *and* local in the +           class.  It should be handled by the closure, as +           well as by the normal name loookup logic. +        */ +        reftype = get_ref_type(c, name); +        if (reftype == CELL) +            arg = compiler_lookup_arg(c->u->u_cellvars, name); +        else /* (reftype == FREE) */ +            arg = compiler_lookup_arg(c->u->u_freevars, name); +        if (arg == -1) { +            fprintf(stderr, +                "lookup %s in %s %d %d\n" +                "freevars of %s: %s\n", +                PyObject_REPR(name), +                PyBytes_AS_STRING(c->u->u_name), +                reftype, arg, +                _PyUnicode_AsString(co->co_name), +                PyObject_REPR(co->co_freevars)); +            Py_FatalError("compiler_make_closure()"); +        } +        ADDOP_I(c, LOAD_CLOSURE, arg); +    } +    ADDOP_I(c, BUILD_TUPLE, free); +    ADDOP_O(c, LOAD_CONST, (PyObject*)co, consts); +    ADDOP_I(c, MAKE_CLOSURE, args); +    return 1;  }  static int  compiler_decorators(struct compiler *c, asdl_seq* decos)  { -	int i; +    int i; -	if (!decos) -		return 1; +    if (!decos) +        return 1; -	for (i = 0; i < asdl_seq_LEN(decos); i++) { -		VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i)); -	} -	return 1; +    for (i = 0; i < asdl_seq_LEN(decos); i++) { +        VISIT(c, expr, (expr_ty)asdl_seq_GET(decos, i)); +    } +    return 1;  }  static int  compiler_visit_kwonlydefaults(struct compiler *c, asdl_seq *kwonlyargs, -	                      asdl_seq *kw_defaults) -{ -	int i, default_count = 0; -	for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) { -		arg_ty arg = asdl_seq_GET(kwonlyargs, i); -		expr_ty default_ = asdl_seq_GET(kw_defaults, i); -		if (default_) { -			ADDOP_O(c, LOAD_CONST, arg->arg, consts); -			if (!compiler_visit_expr(c, default_)) { -			    return -1; -			} -			default_count++; -		} -	} -	return default_count; +                              asdl_seq *kw_defaults) +{ +    int i, default_count = 0; +    for (i = 0; i < asdl_seq_LEN(kwonlyargs); i++) { +        arg_ty arg = asdl_seq_GET(kwonlyargs, i); +        expr_ty default_ = asdl_seq_GET(kw_defaults, i); +        if (default_) { +            ADDOP_O(c, LOAD_CONST, arg->arg, consts); +            if (!compiler_visit_expr(c, default_)) { +                return -1; +            } +            default_count++; +        } +    } +    return default_count;  }  static int  compiler_visit_argannotation(struct compiler *c, identifier id,      expr_ty annotation, PyObject *names)  { -	if (annotation) { -		VISIT(c, expr, annotation); -		if (PyList_Append(names, id)) -			return -1; -	} -	return 0; +    if (annotation) { +        VISIT(c, expr, annotation); +        if (PyList_Append(names, id)) +            return -1; +    } +    return 0;  }  static int  compiler_visit_argannotations(struct compiler *c, asdl_seq* args,                                PyObject *names)  { -	int i, error; -	for (i = 0; i < asdl_seq_LEN(args); i++) { -		arg_ty arg = (arg_ty)asdl_seq_GET(args, i); -		error = compiler_visit_argannotation( -				c, -			        arg->arg, -			        arg->annotation, -			        names); -		if (error) -			return error; -	} -	return 0; +    int i, error; +    for (i = 0; i < asdl_seq_LEN(args); i++) { +        arg_ty arg = (arg_ty)asdl_seq_GET(args, i); +        error = compiler_visit_argannotation( +                        c, +                        arg->arg, +                        arg->annotation, +                        names); +        if (error) +            return error; +    } +    return 0;  }  static int  compiler_visit_annotations(struct compiler *c, arguments_ty args,                             expr_ty returns)  { -	/* Push arg annotations and a list of the argument names. Return the # -	   of items pushed. The expressions are evaluated out-of-order wrt the  -	   source code.  -	    -	   More than 2^16-1 annotations is a SyntaxError. Returns -1 on error. -	   */ -	static identifier return_str; -	PyObject *names; -	int len; -	names = PyList_New(0); -	if (!names) -		return -1; - -	if (compiler_visit_argannotations(c, args->args, names)) -		goto error; -	if (args->varargannotation && -	    compiler_visit_argannotation(c, args->vararg, -	                                 args->varargannotation, names)) -		goto error; -	if (compiler_visit_argannotations(c, args->kwonlyargs, names)) -		goto error; -	if (args->kwargannotation && -	    compiler_visit_argannotation(c, args->kwarg, -	                                 args->kwargannotation, names)) -		goto error; - -	if (!return_str) { -		return_str = PyUnicode_InternFromString("return"); -		if (!return_str) -			goto error; -	} -	if (compiler_visit_argannotation(c, return_str, returns, names)) { -		goto error; -	} - -	len = PyList_GET_SIZE(names); -	if (len > 65534) { -		/* len must fit in 16 bits, and len is incremented below */ -		PyErr_SetString(PyExc_SyntaxError, -				"too many annotations"); -		goto error; -	}	 -	if (len) { -		/* convert names to a tuple and place on stack */ -		PyObject *elt; -		int i; -		PyObject *s = PyTuple_New(len); -		if (!s) -			goto error; -		for (i = 0; i < len; i++) { -			elt = PyList_GET_ITEM(names, i); -			Py_INCREF(elt); -			PyTuple_SET_ITEM(s, i, elt); -		} -		ADDOP_O(c, LOAD_CONST, s, consts); -		Py_DECREF(s); -		len++; /* include the just-pushed tuple */ -	} -	Py_DECREF(names); -	return len; +    /* Push arg annotations and a list of the argument names. Return the # +       of items pushed. The expressions are evaluated out-of-order wrt the +       source code. + +       More than 2^16-1 annotations is a SyntaxError. Returns -1 on error. +       */ +    static identifier return_str; +    PyObject *names; +    int len; +    names = PyList_New(0); +    if (!names) +        return -1; + +    if (compiler_visit_argannotations(c, args->args, names)) +        goto error; +    if (args->varargannotation && +        compiler_visit_argannotation(c, args->vararg, +                                     args->varargannotation, names)) +        goto error; +    if (compiler_visit_argannotations(c, args->kwonlyargs, names)) +        goto error; +    if (args->kwargannotation && +        compiler_visit_argannotation(c, args->kwarg, +                                     args->kwargannotation, names)) +        goto error; + +    if (!return_str) { +        return_str = PyUnicode_InternFromString("return"); +        if (!return_str) +            goto error; +    } +    if (compiler_visit_argannotation(c, return_str, returns, names)) { +        goto error; +    } + +    len = PyList_GET_SIZE(names); +    if (len > 65534) { +        /* len must fit in 16 bits, and len is incremented below */ +        PyErr_SetString(PyExc_SyntaxError, +                        "too many annotations"); +        goto error; +    } +    if (len) { +        /* convert names to a tuple and place on stack */ +        PyObject *elt; +        int i; +        PyObject *s = PyTuple_New(len); +        if (!s) +            goto error; +        for (i = 0; i < len; i++) { +            elt = PyList_GET_ITEM(names, i); +            Py_INCREF(elt); +            PyTuple_SET_ITEM(s, i, elt); +        } +        ADDOP_O(c, LOAD_CONST, s, consts); +        Py_DECREF(s); +        len++; /* include the just-pushed tuple */ +    } +    Py_DECREF(names); +    return len;  error: -	Py_DECREF(names); -	return -1; +    Py_DECREF(names); +    return -1;  }  static int  compiler_function(struct compiler *c, stmt_ty s)  { -	PyCodeObject *co; -	PyObject *first_const = Py_None; -	arguments_ty args = s->v.FunctionDef.args; -	expr_ty returns = s->v.FunctionDef.returns; -	asdl_seq* decos = s->v.FunctionDef.decorator_list; -	stmt_ty st; -	int i, n, docstring, kw_default_count = 0, arglength; -	int num_annotations; - -	assert(s->kind == FunctionDef_kind); - -	if (!compiler_decorators(c, decos)) -		return 0; -	if (args->kwonlyargs) { -		int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, -						        args->kw_defaults); -		if (res < 0) -			return 0; -		kw_default_count = res; -	} -	if (args->defaults) -		VISIT_SEQ(c, expr, args->defaults); -	num_annotations = compiler_visit_annotations(c, args, returns); -	if (num_annotations < 0) -		return 0; -	assert((num_annotations & 0xFFFF) == num_annotations); - -	if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s, -				  s->lineno)) -		return 0; - -	st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0); -	docstring = compiler_isdocstring(st); -	if (docstring && Py_OptimizeFlag < 2) -	    first_const = st->v.Expr.value->v.Str.s; -	if (compiler_add_o(c, c->u->u_consts, first_const) < 0)	 { -	    compiler_exit_scope(c); -	    return 0; -	} - -	c->u->u_argcount = asdl_seq_LEN(args->args); -	c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); -	n = asdl_seq_LEN(s->v.FunctionDef.body); -	/* if there was a docstring, we need to skip the first statement */ -	for (i = docstring; i < n; i++) { -		st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i); -		VISIT_IN_SCOPE(c, stmt, st); -	} -	co = assemble(c, 1); -	compiler_exit_scope(c); -	if (co == NULL) -		return 0; - -	arglength = asdl_seq_LEN(args->defaults); -	arglength |= kw_default_count << 8; -	arglength |= num_annotations << 16; -	compiler_make_closure(c, co, arglength); -	Py_DECREF(co); - -        /* decorators */ -	for (i = 0; i < asdl_seq_LEN(decos); i++) { -		ADDOP_I(c, CALL_FUNCTION, 1); -	} - -	return compiler_nameop(c, s->v.FunctionDef.name, Store); +    PyCodeObject *co; +    PyObject *first_const = Py_None; +    arguments_ty args = s->v.FunctionDef.args; +    expr_ty returns = s->v.FunctionDef.returns; +    asdl_seq* decos = s->v.FunctionDef.decorator_list; +    stmt_ty st; +    int i, n, docstring, kw_default_count = 0, arglength; +    int num_annotations; + +    assert(s->kind == FunctionDef_kind); + +    if (!compiler_decorators(c, decos)) +        return 0; +    if (args->kwonlyargs) { +        int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, +                                                args->kw_defaults); +        if (res < 0) +            return 0; +        kw_default_count = res; +    } +    if (args->defaults) +        VISIT_SEQ(c, expr, args->defaults); +    num_annotations = compiler_visit_annotations(c, args, returns); +    if (num_annotations < 0) +        return 0; +    assert((num_annotations & 0xFFFF) == num_annotations); + +    if (!compiler_enter_scope(c, s->v.FunctionDef.name, (void *)s, +                              s->lineno)) +        return 0; + +    st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, 0); +    docstring = compiler_isdocstring(st); +    if (docstring && Py_OptimizeFlag < 2) +        first_const = st->v.Expr.value->v.Str.s; +    if (compiler_add_o(c, c->u->u_consts, first_const) < 0)      { +        compiler_exit_scope(c); +        return 0; +    } + +    c->u->u_argcount = asdl_seq_LEN(args->args); +    c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); +    n = asdl_seq_LEN(s->v.FunctionDef.body); +    /* if there was a docstring, we need to skip the first statement */ +    for (i = docstring; i < n; i++) { +        st = (stmt_ty)asdl_seq_GET(s->v.FunctionDef.body, i); +        VISIT_IN_SCOPE(c, stmt, st); +    } +    co = assemble(c, 1); +    compiler_exit_scope(c); +    if (co == NULL) +        return 0; + +    arglength = asdl_seq_LEN(args->defaults); +    arglength |= kw_default_count << 8; +    arglength |= num_annotations << 16; +    compiler_make_closure(c, co, arglength); +    Py_DECREF(co); + +    /* decorators */ +    for (i = 0; i < asdl_seq_LEN(decos); i++) { +        ADDOP_I(c, CALL_FUNCTION, 1); +    } + +    return compiler_nameop(c, s->v.FunctionDef.name, Store);  }  static int  compiler_class(struct compiler *c, stmt_ty s)  { -	PyCodeObject *co; -	PyObject *str; -	int i; -	asdl_seq* decos = s->v.ClassDef.decorator_list; - -        if (!compiler_decorators(c, decos)) -                return 0; - -	/* ultimately generate code for: -	     <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>) -	   where: -	     <func> is a function/closure created from the class body; -                    it has a single argument (__locals__) where the dict -		    (or MutableSequence) representing the locals is passed -	     <name> is the class name -             <bases> is the positional arguments and *varargs argument -	     <keywords> is the keyword arguments and **kwds argument -	   This borrows from compiler_call. -	*/ - -	/* 1. compile the class body into a code object */ -	if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno)) -		return 0; -	/* this block represents what we do in the new scope */ -	{ -		/* use the class name for name mangling */ -		Py_INCREF(s->v.ClassDef.name); -		Py_XDECREF(c->u->u_private); -		c->u->u_private = s->v.ClassDef.name; -		/* force it to have one mandatory argument */ -		c->u->u_argcount = 1; -		/* load the first argument (__locals__) ... */ -		ADDOP_I(c, LOAD_FAST, 0); -		/* ... and store it into f_locals */ -		ADDOP_IN_SCOPE(c, STORE_LOCALS); -		/* load (global) __name__ ... */ -		str = PyUnicode_InternFromString("__name__"); -		if (!str || !compiler_nameop(c, str, Load)) { -			Py_XDECREF(str); -			compiler_exit_scope(c); -			return 0; -		} -		Py_DECREF(str); -		/* ... and store it as __module__ */ -		str = PyUnicode_InternFromString("__module__"); -		if (!str || !compiler_nameop(c, str, Store)) { -			Py_XDECREF(str); -			compiler_exit_scope(c); -			return 0; -		} -		Py_DECREF(str); -		/* compile the body proper */ -		if (!compiler_body(c, s->v.ClassDef.body)) { -			compiler_exit_scope(c); -			return 0; -		} -		/* return the (empty) __class__ cell */ -		str = PyUnicode_InternFromString("__class__"); -		if (str == NULL) { -			compiler_exit_scope(c); -			return 0; -		} -		i = compiler_lookup_arg(c->u->u_cellvars, str); -		Py_DECREF(str); -		if (i == -1) { -			/* This happens when nobody references the cell */ -			PyErr_Clear(); -			/* Return None */ -			ADDOP_O(c, LOAD_CONST, Py_None, consts); -                } -		else { -			/* Return the cell where to store __class__ */ -			ADDOP_I(c, LOAD_CLOSURE, i); -		} -		ADDOP_IN_SCOPE(c, RETURN_VALUE); -		/* create the code object */ -		co = assemble(c, 1); -	} -	/* leave the new scope */ -	compiler_exit_scope(c); -	if (co == NULL) -		return 0; - -	/* 2. load the 'build_class' function */ -	ADDOP(c, LOAD_BUILD_CLASS); - -	/* 3. load a function (or closure) made from the code object */ -	compiler_make_closure(c, co, 0); -	Py_DECREF(co); - -	/* 4. load class name */ -	ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts); - -	/* 5. generate the rest of the code for the call */ -	if (!compiler_call_helper(c, 2, -				  s->v.ClassDef.bases, -				  s->v.ClassDef.keywords, -				  s->v.ClassDef.starargs, -				  s->v.ClassDef.kwargs)) -		return 0; - -	/* 6. apply decorators */ -        for (i = 0; i < asdl_seq_LEN(decos); i++) { -                ADDOP_I(c, CALL_FUNCTION, 1); +    PyCodeObject *co; +    PyObject *str; +    int i; +    asdl_seq* decos = s->v.ClassDef.decorator_list; + +    if (!compiler_decorators(c, decos)) +        return 0; + +    /* ultimately generate code for: +         <name> = __build_class__(<func>, <name>, *<bases>, **<keywords>) +       where: +         <func> is a function/closure created from the class body; +            it has a single argument (__locals__) where the dict +            (or MutableSequence) representing the locals is passed +         <name> is the class name +         <bases> is the positional arguments and *varargs argument +         <keywords> is the keyword arguments and **kwds argument +       This borrows from compiler_call. +    */ + +    /* 1. compile the class body into a code object */ +    if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, s->lineno)) +        return 0; +    /* this block represents what we do in the new scope */ +    { +        /* use the class name for name mangling */ +        Py_INCREF(s->v.ClassDef.name); +        Py_XDECREF(c->u->u_private); +        c->u->u_private = s->v.ClassDef.name; +        /* force it to have one mandatory argument */ +        c->u->u_argcount = 1; +        /* load the first argument (__locals__) ... */ +        ADDOP_I(c, LOAD_FAST, 0); +        /* ... and store it into f_locals */ +        ADDOP_IN_SCOPE(c, STORE_LOCALS); +        /* load (global) __name__ ... */ +        str = PyUnicode_InternFromString("__name__"); +        if (!str || !compiler_nameop(c, str, Load)) { +            Py_XDECREF(str); +            compiler_exit_scope(c); +            return 0; +        } +        Py_DECREF(str); +        /* ... and store it as __module__ */ +        str = PyUnicode_InternFromString("__module__"); +        if (!str || !compiler_nameop(c, str, Store)) { +            Py_XDECREF(str); +            compiler_exit_scope(c); +            return 0; +        } +        Py_DECREF(str); +        /* compile the body proper */ +        if (!compiler_body(c, s->v.ClassDef.body)) { +            compiler_exit_scope(c); +            return 0; +        } +        /* return the (empty) __class__ cell */ +        str = PyUnicode_InternFromString("__class__"); +        if (str == NULL) { +            compiler_exit_scope(c); +            return 0; +        } +        i = compiler_lookup_arg(c->u->u_cellvars, str); +        Py_DECREF(str); +        if (i == -1) { +            /* This happens when nobody references the cell */ +            PyErr_Clear(); +            /* Return None */ +            ADDOP_O(c, LOAD_CONST, Py_None, consts); +        } +        else { +            /* Return the cell where to store __class__ */ +            ADDOP_I(c, LOAD_CLOSURE, i);          } +        ADDOP_IN_SCOPE(c, RETURN_VALUE); +        /* create the code object */ +        co = assemble(c, 1); +    } +    /* leave the new scope */ +    compiler_exit_scope(c); +    if (co == NULL) +        return 0; + +    /* 2. load the 'build_class' function */ +    ADDOP(c, LOAD_BUILD_CLASS); + +    /* 3. load a function (or closure) made from the code object */ +    compiler_make_closure(c, co, 0); +    Py_DECREF(co); + +    /* 4. load class name */ +    ADDOP_O(c, LOAD_CONST, s->v.ClassDef.name, consts); + +    /* 5. generate the rest of the code for the call */ +    if (!compiler_call_helper(c, 2, +                              s->v.ClassDef.bases, +                              s->v.ClassDef.keywords, +                              s->v.ClassDef.starargs, +                              s->v.ClassDef.kwargs)) +        return 0; + +    /* 6. apply decorators */ +    for (i = 0; i < asdl_seq_LEN(decos); i++) { +        ADDOP_I(c, CALL_FUNCTION, 1); +    } -	/* 7. store into <name> */ -	if (!compiler_nameop(c, s->v.ClassDef.name, Store)) -		return 0; -	return 1; +    /* 7. store into <name> */ +    if (!compiler_nameop(c, s->v.ClassDef.name, Store)) +        return 0; +    return 1;  }  static int  compiler_ifexp(struct compiler *c, expr_ty e)  { -	basicblock *end, *next; -	 -	assert(e->kind == IfExp_kind); -	end = compiler_new_block(c); -	if (end == NULL) -		return 0; -	next = compiler_new_block(c); -	if (next == NULL) -		return 0; -	VISIT(c, expr, e->v.IfExp.test); -	ADDOP_JABS(c, POP_JUMP_IF_FALSE, next); -	VISIT(c, expr, e->v.IfExp.body); -	ADDOP_JREL(c, JUMP_FORWARD, end); -	compiler_use_next_block(c, next); -	VISIT(c, expr, e->v.IfExp.orelse); -	compiler_use_next_block(c, end); -	return 1; +    basicblock *end, *next; + +    assert(e->kind == IfExp_kind); +    end = compiler_new_block(c); +    if (end == NULL) +        return 0; +    next = compiler_new_block(c); +    if (next == NULL) +        return 0; +    VISIT(c, expr, e->v.IfExp.test); +    ADDOP_JABS(c, POP_JUMP_IF_FALSE, next); +    VISIT(c, expr, e->v.IfExp.body); +    ADDOP_JREL(c, JUMP_FORWARD, end); +    compiler_use_next_block(c, next); +    VISIT(c, expr, e->v.IfExp.orelse); +    compiler_use_next_block(c, end); +    return 1;  }  static int  compiler_lambda(struct compiler *c, expr_ty e)  { -	PyCodeObject *co; -	static identifier name; -	int kw_default_count = 0, arglength; -	arguments_ty args = e->v.Lambda.args; -	assert(e->kind == Lambda_kind); - -	if (!name) { -		name = PyUnicode_InternFromString("<lambda>"); -		if (!name) -			return 0; -	} - -	if (args->kwonlyargs) { -		int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, -						        args->kw_defaults); -		if (res < 0) return 0; -		kw_default_count = res; -	} -	if (args->defaults) -		VISIT_SEQ(c, expr, args->defaults); -	if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) -		return 0; - -	/* Make None the first constant, so the lambda can't have a -	   docstring. */ -	if (compiler_add_o(c, c->u->u_consts, Py_None) < 0) -		return 0; -	 -	c->u->u_argcount = asdl_seq_LEN(args->args); -	c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); -	VISIT_IN_SCOPE(c, expr, e->v.Lambda.body); -	if (c->u->u_ste->ste_generator) { -		ADDOP_IN_SCOPE(c, POP_TOP); -	} -	else { -		ADDOP_IN_SCOPE(c, RETURN_VALUE); -	} -	co = assemble(c, 1); -	compiler_exit_scope(c); -	if (co == NULL) -		return 0; - -	arglength = asdl_seq_LEN(args->defaults); -	arglength |= kw_default_count << 8; -	compiler_make_closure(c, co, arglength); -	Py_DECREF(co); - -	return 1; +    PyCodeObject *co; +    static identifier name; +    int kw_default_count = 0, arglength; +    arguments_ty args = e->v.Lambda.args; +    assert(e->kind == Lambda_kind); + +    if (!name) { +        name = PyUnicode_InternFromString("<lambda>"); +        if (!name) +            return 0; +    } + +    if (args->kwonlyargs) { +        int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, +                                                args->kw_defaults); +        if (res < 0) return 0; +        kw_default_count = res; +    } +    if (args->defaults) +        VISIT_SEQ(c, expr, args->defaults); +    if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) +        return 0; + +    /* Make None the first constant, so the lambda can't have a +       docstring. */ +    if (compiler_add_o(c, c->u->u_consts, Py_None) < 0) +        return 0; + +    c->u->u_argcount = asdl_seq_LEN(args->args); +    c->u->u_kwonlyargcount = asdl_seq_LEN(args->kwonlyargs); +    VISIT_IN_SCOPE(c, expr, e->v.Lambda.body); +    if (c->u->u_ste->ste_generator) { +        ADDOP_IN_SCOPE(c, POP_TOP); +    } +    else { +        ADDOP_IN_SCOPE(c, RETURN_VALUE); +    } +    co = assemble(c, 1); +    compiler_exit_scope(c); +    if (co == NULL) +        return 0; + +    arglength = asdl_seq_LEN(args->defaults); +    arglength |= kw_default_count << 8; +    compiler_make_closure(c, co, arglength); +    Py_DECREF(co); + +    return 1;  }  static int  compiler_if(struct compiler *c, stmt_ty s)  { -	basicblock *end, *next; -	int constant; -	assert(s->kind == If_kind); -	end = compiler_new_block(c); -	if (end == NULL) -		return 0; -	 -	constant = expr_constant(s->v.If.test); -	/* constant = 0: "if 0" -	 * constant = 1: "if 1", "if 2", ... -	 * constant = -1: rest */ -	if (constant == 0) { -		if (s->v.If.orelse) -			VISIT_SEQ(c, stmt, s->v.If.orelse); -	} else if (constant == 1) { -		VISIT_SEQ(c, stmt, s->v.If.body); -	} else { -		if (s->v.If.orelse) { -			next = compiler_new_block(c); -			if (next == NULL) -			    return 0; -		} -		else -			next = end; -		VISIT(c, expr, s->v.If.test); -		ADDOP_JABS(c, POP_JUMP_IF_FALSE, next); -		VISIT_SEQ(c, stmt, s->v.If.body); -		ADDOP_JREL(c, JUMP_FORWARD, end); -		if (s->v.If.orelse) { -			compiler_use_next_block(c, next); -			VISIT_SEQ(c, stmt, s->v.If.orelse); -		} -	} -	compiler_use_next_block(c, end); -	return 1; +    basicblock *end, *next; +    int constant; +    assert(s->kind == If_kind); +    end = compiler_new_block(c); +    if (end == NULL) +        return 0; + +    constant = expr_constant(s->v.If.test); +    /* constant = 0: "if 0" +     * constant = 1: "if 1", "if 2", ... +     * constant = -1: rest */ +    if (constant == 0) { +        if (s->v.If.orelse) +            VISIT_SEQ(c, stmt, s->v.If.orelse); +    } else if (constant == 1) { +        VISIT_SEQ(c, stmt, s->v.If.body); +    } else { +        if (s->v.If.orelse) { +            next = compiler_new_block(c); +            if (next == NULL) +                return 0; +        } +        else +            next = end; +        VISIT(c, expr, s->v.If.test); +        ADDOP_JABS(c, POP_JUMP_IF_FALSE, next); +        VISIT_SEQ(c, stmt, s->v.If.body); +        ADDOP_JREL(c, JUMP_FORWARD, end); +        if (s->v.If.orelse) { +            compiler_use_next_block(c, next); +            VISIT_SEQ(c, stmt, s->v.If.orelse); +        } +    } +    compiler_use_next_block(c, end); +    return 1;  }  static int  compiler_for(struct compiler *c, stmt_ty s)  { -	basicblock *start, *cleanup, *end; - -	start = compiler_new_block(c); -	cleanup = compiler_new_block(c); -	end = compiler_new_block(c); -	if (start == NULL || end == NULL || cleanup == NULL) -		return 0; -	ADDOP_JREL(c, SETUP_LOOP, end); -	if (!compiler_push_fblock(c, LOOP, start)) -		return 0; -	VISIT(c, expr, s->v.For.iter); -	ADDOP(c, GET_ITER); -	compiler_use_next_block(c, start); -	ADDOP_JREL(c, FOR_ITER, cleanup); -	VISIT(c, expr, s->v.For.target); -	VISIT_SEQ(c, stmt, s->v.For.body); -	ADDOP_JABS(c, JUMP_ABSOLUTE, start); -	compiler_use_next_block(c, cleanup); -	ADDOP(c, POP_BLOCK); -	compiler_pop_fblock(c, LOOP, start); -	VISIT_SEQ(c, stmt, s->v.For.orelse); -	compiler_use_next_block(c, end); -	return 1; +    basicblock *start, *cleanup, *end; + +    start = compiler_new_block(c); +    cleanup = compiler_new_block(c); +    end = compiler_new_block(c); +    if (start == NULL || end == NULL || cleanup == NULL) +        return 0; +    ADDOP_JREL(c, SETUP_LOOP, end); +    if (!compiler_push_fblock(c, LOOP, start)) +        return 0; +    VISIT(c, expr, s->v.For.iter); +    ADDOP(c, GET_ITER); +    compiler_use_next_block(c, start); +    ADDOP_JREL(c, FOR_ITER, cleanup); +    VISIT(c, expr, s->v.For.target); +    VISIT_SEQ(c, stmt, s->v.For.body); +    ADDOP_JABS(c, JUMP_ABSOLUTE, start); +    compiler_use_next_block(c, cleanup); +    ADDOP(c, POP_BLOCK); +    compiler_pop_fblock(c, LOOP, start); +    VISIT_SEQ(c, stmt, s->v.For.orelse); +    compiler_use_next_block(c, end); +    return 1;  }  static int  compiler_while(struct compiler *c, stmt_ty s)  { -	basicblock *loop, *orelse, *end, *anchor = NULL; -	int constant = expr_constant(s->v.While.test); - -	if (constant == 0) { -		if (s->v.While.orelse) -			VISIT_SEQ(c, stmt, s->v.While.orelse); -		return 1; -	} -	loop = compiler_new_block(c); -	end = compiler_new_block(c); -	if (constant == -1) { -		anchor = compiler_new_block(c); -		if (anchor == NULL) -			return 0; -	} -	if (loop == NULL || end == NULL) -		return 0; -	if (s->v.While.orelse) { -		orelse = compiler_new_block(c); -		if (orelse == NULL) -			return 0; -	} -	else -		orelse = NULL; - -	ADDOP_JREL(c, SETUP_LOOP, end); -	compiler_use_next_block(c, loop); -	if (!compiler_push_fblock(c, LOOP, loop)) -		return 0; -	if (constant == -1) { -		VISIT(c, expr, s->v.While.test); -		ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor); -	} -	VISIT_SEQ(c, stmt, s->v.While.body); -	ADDOP_JABS(c, JUMP_ABSOLUTE, loop); - -	/* XXX should the two POP instructions be in a separate block -	   if there is no else clause ? -	*/ - -	if (constant == -1) { -		compiler_use_next_block(c, anchor); -		ADDOP(c, POP_BLOCK); -	} -	compiler_pop_fblock(c, LOOP, loop); -	if (orelse != NULL) /* what if orelse is just pass? */ -		VISIT_SEQ(c, stmt, s->v.While.orelse); -	compiler_use_next_block(c, end); - -	return 1; +    basicblock *loop, *orelse, *end, *anchor = NULL; +    int constant = expr_constant(s->v.While.test); + +    if (constant == 0) { +        if (s->v.While.orelse) +            VISIT_SEQ(c, stmt, s->v.While.orelse); +        return 1; +    } +    loop = compiler_new_block(c); +    end = compiler_new_block(c); +    if (constant == -1) { +        anchor = compiler_new_block(c); +        if (anchor == NULL) +            return 0; +    } +    if (loop == NULL || end == NULL) +        return 0; +    if (s->v.While.orelse) { +        orelse = compiler_new_block(c); +        if (orelse == NULL) +            return 0; +    } +    else +        orelse = NULL; + +    ADDOP_JREL(c, SETUP_LOOP, end); +    compiler_use_next_block(c, loop); +    if (!compiler_push_fblock(c, LOOP, loop)) +        return 0; +    if (constant == -1) { +        VISIT(c, expr, s->v.While.test); +        ADDOP_JABS(c, POP_JUMP_IF_FALSE, anchor); +    } +    VISIT_SEQ(c, stmt, s->v.While.body); +    ADDOP_JABS(c, JUMP_ABSOLUTE, loop); + +    /* XXX should the two POP instructions be in a separate block +       if there is no else clause ? +    */ + +    if (constant == -1) { +        compiler_use_next_block(c, anchor); +        ADDOP(c, POP_BLOCK); +    } +    compiler_pop_fblock(c, LOOP, loop); +    if (orelse != NULL) /* what if orelse is just pass? */ +        VISIT_SEQ(c, stmt, s->v.While.orelse); +    compiler_use_next_block(c, end); + +    return 1;  }  static int  compiler_continue(struct compiler *c)  { -	static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop"; -	static const char IN_FINALLY_ERROR_MSG[] =  -			"'continue' not supported inside 'finally' clause"; -	int i; - -	if (!c->u->u_nfblocks) -		return compiler_error(c, LOOP_ERROR_MSG); -	i = c->u->u_nfblocks - 1; -	switch (c->u->u_fblock[i].fb_type) { -	case LOOP: -		ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block); -		break; -	case EXCEPT: -	case FINALLY_TRY: -		while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) { -			/* Prevent continue anywhere under a finally -			      even if hidden in a sub-try or except. */ -			if (c->u->u_fblock[i].fb_type == FINALLY_END) -				return compiler_error(c, IN_FINALLY_ERROR_MSG); -		} -		if (i == -1) -			return compiler_error(c, LOOP_ERROR_MSG); -		ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block); -		break; -	case FINALLY_END: -		return compiler_error(c, IN_FINALLY_ERROR_MSG); -	} - -	return 1; +    static const char LOOP_ERROR_MSG[] = "'continue' not properly in loop"; +    static const char IN_FINALLY_ERROR_MSG[] = +                    "'continue' not supported inside 'finally' clause"; +    int i; + +    if (!c->u->u_nfblocks) +        return compiler_error(c, LOOP_ERROR_MSG); +    i = c->u->u_nfblocks - 1; +    switch (c->u->u_fblock[i].fb_type) { +    case LOOP: +        ADDOP_JABS(c, JUMP_ABSOLUTE, c->u->u_fblock[i].fb_block); +        break; +    case EXCEPT: +    case FINALLY_TRY: +        while (--i >= 0 && c->u->u_fblock[i].fb_type != LOOP) { +            /* Prevent continue anywhere under a finally +                  even if hidden in a sub-try or except. */ +            if (c->u->u_fblock[i].fb_type == FINALLY_END) +                return compiler_error(c, IN_FINALLY_ERROR_MSG); +        } +        if (i == -1) +            return compiler_error(c, LOOP_ERROR_MSG); +        ADDOP_JABS(c, CONTINUE_LOOP, c->u->u_fblock[i].fb_block); +        break; +    case FINALLY_END: +        return compiler_error(c, IN_FINALLY_ERROR_MSG); +    } + +    return 1;  }  /* Code generated for "try: <body> finally: <finalbody>" is as follows: -    -		SETUP_FINALLY	L -		<code for body> -		POP_BLOCK -		LOAD_CONST	<None> -	L:	<code for finalbody> -		END_FINALLY -    + +        SETUP_FINALLY           L +        <code for body> +        POP_BLOCK +        LOAD_CONST              <None> +    L:          <code for finalbody> +        END_FINALLY +     The special instructions use the block stack.  Each block     stack entry contains the instruction that created it (here     SETUP_FINALLY), the level of the value stack at the time the     block stack entry was created, and a label (here L). -    +     SETUP_FINALLY: -	Pushes the current value stack level and the label -	onto the block stack. +    Pushes the current value stack level and the label +    onto the block stack.     POP_BLOCK: -	Pops en entry from the block stack, and pops the value -	stack until its level is the same as indicated on the -	block stack.  (The label is ignored.) +    Pops en entry from the block stack, and pops the value +    stack until its level is the same as indicated on the +    block stack.  (The label is ignored.)     END_FINALLY: -	Pops a variable number of entries from the *value* stack -	and re-raises the exception they specify.  The number of -	entries popped depends on the (pseudo) exception type. -    +    Pops a variable number of entries from the *value* stack +    and re-raises the exception they specify.  The number of +    entries popped depends on the (pseudo) exception type. +     The block stack is unwound when an exception is raised:     when a SETUP_FINALLY entry is found, the exception is pushed     onto the value stack (and the exception condition is cleared), @@ -1880,29 +1880,29 @@ compiler_continue(struct compiler *c)  static int  compiler_try_finally(struct compiler *c, stmt_ty s)  { -	basicblock *body, *end; -	body = compiler_new_block(c); -	end = compiler_new_block(c); -	if (body == NULL || end == NULL) -		return 0; - -	ADDOP_JREL(c, SETUP_FINALLY, end); -	compiler_use_next_block(c, body); -	if (!compiler_push_fblock(c, FINALLY_TRY, body)) -		return 0; -	VISIT_SEQ(c, stmt, s->v.TryFinally.body); -	ADDOP(c, POP_BLOCK); -	compiler_pop_fblock(c, FINALLY_TRY, body); +    basicblock *body, *end; +    body = compiler_new_block(c); +    end = compiler_new_block(c); +    if (body == NULL || end == NULL) +        return 0; + +    ADDOP_JREL(c, SETUP_FINALLY, end); +    compiler_use_next_block(c, body); +    if (!compiler_push_fblock(c, FINALLY_TRY, body)) +        return 0; +    VISIT_SEQ(c, stmt, s->v.TryFinally.body); +    ADDOP(c, POP_BLOCK); +    compiler_pop_fblock(c, FINALLY_TRY, body); -	ADDOP_O(c, LOAD_CONST, Py_None, consts); -	compiler_use_next_block(c, end); -	if (!compiler_push_fblock(c, FINALLY_END, end)) -		return 0; -	VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody); -	ADDOP(c, END_FINALLY); -	compiler_pop_fblock(c, FINALLY_END, end); +    ADDOP_O(c, LOAD_CONST, Py_None, consts); +    compiler_use_next_block(c, end); +    if (!compiler_push_fblock(c, FINALLY_END, end)) +        return 0; +    VISIT_SEQ(c, stmt, s->v.TryFinally.finalbody); +    ADDOP(c, END_FINALLY); +    compiler_pop_fblock(c, FINALLY_END, end); -	return 1; +    return 1;  }  /* @@ -1910,864 +1910,864 @@ compiler_try_finally(struct compiler *c, stmt_ty s)     (The contents of the value stack is shown in [], with the top     at the right; 'tb' is trace-back info, 'val' the exception's     associated value, and 'exc' the exception.) -    -   Value stack		Label	Instruction	Argument -   []				SETUP_EXCEPT	L1 -   []				<code for S> -   []				POP_BLOCK -   []				JUMP_FORWARD	L0 -    -   [tb, val, exc]	L1:	DUP				) -   [tb, val, exc, exc]		<evaluate E1>			) -   [tb, val, exc, exc, E1]	COMPARE_OP	EXC_MATCH	) only if E1 -   [tb, val, exc, 1-or-0]	POP_JUMP_IF_FALSE	L2	) -   [tb, val, exc]		POP -   [tb, val]			<assign to V1>	(or POP if no V1) -   [tb]				POP -   []				<code for S1> -				JUMP_FORWARD	L0 -    -   [tb, val, exc]	L2:	DUP + +   Value stack          Label   Instruction     Argument +   []                           SETUP_EXCEPT    L1 +   []                           <code for S> +   []                           POP_BLOCK +   []                           JUMP_FORWARD    L0 + +   [tb, val, exc]       L1:     DUP                             ) +   [tb, val, exc, exc]          <evaluate E1>                   ) +   [tb, val, exc, exc, E1]      COMPARE_OP      EXC_MATCH       ) only if E1 +   [tb, val, exc, 1-or-0]       POP_JUMP_IF_FALSE       L2      ) +   [tb, val, exc]               POP +   [tb, val]                    <assign to V1>  (or POP if no V1) +   [tb]                         POP +   []                           <code for S1> +                                JUMP_FORWARD    L0 + +   [tb, val, exc]       L2:     DUP     .............................etc....................... -   [tb, val, exc]	Ln+1:	END_FINALLY	# re-raise exception -    -   []			L0:	<next statement> -    +   [tb, val, exc]       Ln+1:   END_FINALLY     # re-raise exception + +   []                   L0:     <next statement> +     Of course, parts are not generated if Vi or Ei is not present.  */  static int  compiler_try_except(struct compiler *c, stmt_ty s)  { -	basicblock *body, *orelse, *except, *end; -	int i, n; - -	body = compiler_new_block(c); -	except = compiler_new_block(c); -	orelse = compiler_new_block(c); -	end = compiler_new_block(c); -	if (body == NULL || except == NULL || orelse == NULL || end == NULL) -		return 0; -	ADDOP_JREL(c, SETUP_EXCEPT, except); -	compiler_use_next_block(c, body); -	if (!compiler_push_fblock(c, EXCEPT, body)) -		return 0; -	VISIT_SEQ(c, stmt, s->v.TryExcept.body); -	ADDOP(c, POP_BLOCK); -	compiler_pop_fblock(c, EXCEPT, body); -	ADDOP_JREL(c, JUMP_FORWARD, orelse); -	n = asdl_seq_LEN(s->v.TryExcept.handlers); -	compiler_use_next_block(c, except); -	for (i = 0; i < n; i++) { -		excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET( -						s->v.TryExcept.handlers, i); -		if (!handler->v.ExceptHandler.type && i < n-1) -		    return compiler_error(c, "default 'except:' must be last"); -		c->u->u_lineno_set = 0; -		c->u->u_lineno = handler->lineno; -		except = compiler_new_block(c); -		if (except == NULL) -			return 0; -		if (handler->v.ExceptHandler.type) { -			ADDOP(c, DUP_TOP); -			VISIT(c, expr, handler->v.ExceptHandler.type); -			ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); -			ADDOP_JABS(c, POP_JUMP_IF_FALSE, except); -		} -		ADDOP(c, POP_TOP); -		if (handler->v.ExceptHandler.name) { -            basicblock *cleanup_end, *cleanup_body; - -            cleanup_end = compiler_new_block(c); -            cleanup_body = compiler_new_block(c); -            if(!(cleanup_end || cleanup_body)) -                return 0; - -            compiler_nameop(c, handler->v.ExceptHandler.name, Store); -            ADDOP(c, POP_TOP); +    basicblock *body, *orelse, *except, *end; +    int i, n; + +    body = compiler_new_block(c); +    except = compiler_new_block(c); +    orelse = compiler_new_block(c); +    end = compiler_new_block(c); +    if (body == NULL || except == NULL || orelse == NULL || end == NULL) +        return 0; +    ADDOP_JREL(c, SETUP_EXCEPT, except); +    compiler_use_next_block(c, body); +    if (!compiler_push_fblock(c, EXCEPT, body)) +        return 0; +    VISIT_SEQ(c, stmt, s->v.TryExcept.body); +    ADDOP(c, POP_BLOCK); +    compiler_pop_fblock(c, EXCEPT, body); +    ADDOP_JREL(c, JUMP_FORWARD, orelse); +    n = asdl_seq_LEN(s->v.TryExcept.handlers); +    compiler_use_next_block(c, except); +    for (i = 0; i < n; i++) { +        excepthandler_ty handler = (excepthandler_ty)asdl_seq_GET( +                                        s->v.TryExcept.handlers, i); +        if (!handler->v.ExceptHandler.type && i < n-1) +            return compiler_error(c, "default 'except:' must be last"); +        c->u->u_lineno_set = 0; +        c->u->u_lineno = handler->lineno; +        except = compiler_new_block(c); +        if (except == NULL) +            return 0; +        if (handler->v.ExceptHandler.type) { +            ADDOP(c, DUP_TOP); +            VISIT(c, expr, handler->v.ExceptHandler.type); +            ADDOP_I(c, COMPARE_OP, PyCmp_EXC_MATCH); +            ADDOP_JABS(c, POP_JUMP_IF_FALSE, except); +        } +        ADDOP(c, POP_TOP); +        if (handler->v.ExceptHandler.name) { +        basicblock *cleanup_end, *cleanup_body; -            /* -                try: -                    # body -                except type as name: -                    try: -                        # body -                    finally: -                        name = None -                        del name -            */ - -            /* second try: */ -            ADDOP_JREL(c, SETUP_FINALLY, cleanup_end); -	        compiler_use_next_block(c, cleanup_body); -	        if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body)) -		        return 0; - -            /* second # body */ -		VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); -	        ADDOP(c, POP_BLOCK); -	        ADDOP(c, POP_EXCEPT); -	        compiler_pop_fblock(c, FINALLY_TRY, cleanup_body); - -            /* finally: */ -	        ADDOP_O(c, LOAD_CONST, Py_None, consts); -	        compiler_use_next_block(c, cleanup_end); -	        if (!compiler_push_fblock(c, FINALLY_END, cleanup_end)) -		        return 0; - -            /* name = None */ -            ADDOP_O(c, LOAD_CONST, Py_None, consts); -            compiler_nameop(c, handler->v.ExceptHandler.name, Store); +        cleanup_end = compiler_new_block(c); +        cleanup_body = compiler_new_block(c); +        if(!(cleanup_end || cleanup_body)) +        return 0; -            /* del name */ -            compiler_nameop(c, handler->v.ExceptHandler.name, Del); +        compiler_nameop(c, handler->v.ExceptHandler.name, Store); +        ADDOP(c, POP_TOP); -	        ADDOP(c, END_FINALLY); -	        compiler_pop_fblock(c, FINALLY_END, cleanup_end); -		} -		else { -            basicblock *cleanup_body; +        /* +        try: +            # body +        except type as name: +            try: +            # body +            finally: +            name = None +            del name +        */ + +        /* second try: */ +        ADDOP_JREL(c, SETUP_FINALLY, cleanup_end); +        compiler_use_next_block(c, cleanup_body); +        if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body)) +            return 0; + +        /* second # body */ +        VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); +        ADDOP(c, POP_BLOCK); +        ADDOP(c, POP_EXCEPT); +        compiler_pop_fblock(c, FINALLY_TRY, cleanup_body); + +        /* finally: */ +        ADDOP_O(c, LOAD_CONST, Py_None, consts); +        compiler_use_next_block(c, cleanup_end); +        if (!compiler_push_fblock(c, FINALLY_END, cleanup_end)) +            return 0; + +        /* name = None */ +        ADDOP_O(c, LOAD_CONST, Py_None, consts); +        compiler_nameop(c, handler->v.ExceptHandler.name, Store); + +        /* del name */ +        compiler_nameop(c, handler->v.ExceptHandler.name, Del); + +        ADDOP(c, END_FINALLY); +        compiler_pop_fblock(c, FINALLY_END, cleanup_end); +        } +        else { +        basicblock *cleanup_body; -            cleanup_body = compiler_new_block(c); -            if(!cleanup_body) -                return 0; +        cleanup_body = compiler_new_block(c); +        if(!cleanup_body) +        return 0; -			ADDOP(c, POP_TOP);              ADDOP(c, POP_TOP); -	        compiler_use_next_block(c, cleanup_body); -	        if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body)) -		        return 0; -		    VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); -	        ADDOP(c, POP_EXCEPT); -	        compiler_pop_fblock(c, FINALLY_TRY, cleanup_body); -		} -		ADDOP_JREL(c, JUMP_FORWARD, end); -		compiler_use_next_block(c, except); -	} -	ADDOP(c, END_FINALLY); -	compiler_use_next_block(c, orelse); -	VISIT_SEQ(c, stmt, s->v.TryExcept.orelse); -	compiler_use_next_block(c, end); -	return 1; +        ADDOP(c, POP_TOP); +        compiler_use_next_block(c, cleanup_body); +        if (!compiler_push_fblock(c, FINALLY_TRY, cleanup_body)) +            return 0; +            VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); +        ADDOP(c, POP_EXCEPT); +        compiler_pop_fblock(c, FINALLY_TRY, cleanup_body); +        } +        ADDOP_JREL(c, JUMP_FORWARD, end); +        compiler_use_next_block(c, except); +    } +    ADDOP(c, END_FINALLY); +    compiler_use_next_block(c, orelse); +    VISIT_SEQ(c, stmt, s->v.TryExcept.orelse); +    compiler_use_next_block(c, end); +    return 1;  }  static int  compiler_import_as(struct compiler *c, identifier name, identifier asname)  { -	/* The IMPORT_NAME opcode was already generated.  This function -	   merely needs to bind the result to a name. - -	   If there is a dot in name, we need to split it and emit a  -	   LOAD_ATTR for each name. -	*/ -	const Py_UNICODE *src = PyUnicode_AS_UNICODE(name); -	const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.'); -	if (dot) { -		/* Consume the base module name to get the first attribute */ -		src = dot + 1; -		while (dot) { -			/* NB src is only defined when dot != NULL */ -			PyObject *attr; -			dot = Py_UNICODE_strchr(src, '.'); -			attr = PyUnicode_FromUnicode(src,  -					    dot ? dot - src : Py_UNICODE_strlen(src)); -			if (!attr) -				return -1; -			ADDOP_O(c, LOAD_ATTR, attr, names); -			Py_DECREF(attr); -			src = dot + 1; -		} -	} -	return compiler_nameop(c, asname, Store); +    /* The IMPORT_NAME opcode was already generated.  This function +       merely needs to bind the result to a name. + +       If there is a dot in name, we need to split it and emit a +       LOAD_ATTR for each name. +    */ +    const Py_UNICODE *src = PyUnicode_AS_UNICODE(name); +    const Py_UNICODE *dot = Py_UNICODE_strchr(src, '.'); +    if (dot) { +        /* Consume the base module name to get the first attribute */ +        src = dot + 1; +        while (dot) { +            /* NB src is only defined when dot != NULL */ +            PyObject *attr; +            dot = Py_UNICODE_strchr(src, '.'); +            attr = PyUnicode_FromUnicode(src, +                                dot ? dot - src : Py_UNICODE_strlen(src)); +            if (!attr) +                return -1; +            ADDOP_O(c, LOAD_ATTR, attr, names); +            Py_DECREF(attr); +            src = dot + 1; +        } +    } +    return compiler_nameop(c, asname, Store);  }  static int  compiler_import(struct compiler *c, stmt_ty s)  { -	/* The Import node stores a module name like a.b.c as a single -	   string.  This is convenient for all cases except -	     import a.b.c as d -	   where we need to parse that string to extract the individual -	   module names.   -	   XXX Perhaps change the representation to make this case simpler? -	 */ -	int i, n = asdl_seq_LEN(s->v.Import.names); - -	for (i = 0; i < n; i++) { -		alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i); -		int r; -		PyObject *level; - -                level = PyLong_FromLong(0); -		if (level == NULL) -			return 0; - -		ADDOP_O(c, LOAD_CONST, level, consts); -		Py_DECREF(level); -		ADDOP_O(c, LOAD_CONST, Py_None, consts); -		ADDOP_NAME(c, IMPORT_NAME, alias->name, names); - -		if (alias->asname) { -			r = compiler_import_as(c, alias->name, alias->asname); -			if (!r) -			    return r; -		} -		else { -			identifier tmp = alias->name; -			const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name); -			Py_UNICODE *dot = Py_UNICODE_strchr(base, '.'); -			if (dot) -				tmp = PyUnicode_FromUnicode(base,  -							    dot - base); -			r = compiler_nameop(c, tmp, Store); -			if (dot) { -				Py_DECREF(tmp); -			} -			if (!r) -				return r; -		} -	} -	return 1; +    /* The Import node stores a module name like a.b.c as a single +       string.  This is convenient for all cases except +         import a.b.c as d +       where we need to parse that string to extract the individual +       module names. +       XXX Perhaps change the representation to make this case simpler? +     */ +    int i, n = asdl_seq_LEN(s->v.Import.names); + +    for (i = 0; i < n; i++) { +        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.Import.names, i); +        int r; +        PyObject *level; + +        level = PyLong_FromLong(0); +        if (level == NULL) +            return 0; + +        ADDOP_O(c, LOAD_CONST, level, consts); +        Py_DECREF(level); +        ADDOP_O(c, LOAD_CONST, Py_None, consts); +        ADDOP_NAME(c, IMPORT_NAME, alias->name, names); + +        if (alias->asname) { +            r = compiler_import_as(c, alias->name, alias->asname); +            if (!r) +                return r; +        } +        else { +            identifier tmp = alias->name; +            const Py_UNICODE *base = PyUnicode_AS_UNICODE(alias->name); +            Py_UNICODE *dot = Py_UNICODE_strchr(base, '.'); +            if (dot) +                tmp = PyUnicode_FromUnicode(base, +                                            dot - base); +            r = compiler_nameop(c, tmp, Store); +            if (dot) { +                Py_DECREF(tmp); +            } +            if (!r) +                return r; +        } +    } +    return 1;  }  static int  compiler_from_import(struct compiler *c, stmt_ty s)  { -	int i, n = asdl_seq_LEN(s->v.ImportFrom.names); - -	PyObject *names = PyTuple_New(n); -	PyObject *level; -	static PyObject *empty_string; - -	if (!empty_string) { -		empty_string = PyUnicode_FromString(""); -		if (!empty_string) -			return 0; -	} -	 -	if (!names) -		return 0; - -        level = PyLong_FromLong(s->v.ImportFrom.level); -	if (!level) { -		Py_DECREF(names); -		return 0; -	} - -	/* build up the names */ -	for (i = 0; i < n; i++) { -		alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); -		Py_INCREF(alias->name); -		PyTuple_SET_ITEM(names, i, alias->name); -	} - -	if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module &&  -	    !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) { -		Py_DECREF(level); -		Py_DECREF(names); -		return compiler_error(c, "from __future__ imports must occur " -				      "at the beginning of the file"); -	} - -	ADDOP_O(c, LOAD_CONST, level, consts); -	Py_DECREF(level); -	ADDOP_O(c, LOAD_CONST, names, consts); -	Py_DECREF(names); -	if (s->v.ImportFrom.module) { -		ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names); -	} -	else { -		ADDOP_NAME(c, IMPORT_NAME, empty_string, names); -	} -	for (i = 0; i < n; i++) { -		alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); -		identifier store_name; - -		if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') { -			assert(n == 1); -			ADDOP(c, IMPORT_STAR); -			return 1; -		} -		     -		ADDOP_NAME(c, IMPORT_FROM, alias->name, names); -		store_name = alias->name; -		if (alias->asname) -			store_name = alias->asname; - -		if (!compiler_nameop(c, store_name, Store)) { -			Py_DECREF(names); -			return 0; -		} -	} -	/* remove imported module */ -	ADDOP(c, POP_TOP); -	return 1; +    int i, n = asdl_seq_LEN(s->v.ImportFrom.names); + +    PyObject *names = PyTuple_New(n); +    PyObject *level; +    static PyObject *empty_string; + +    if (!empty_string) { +        empty_string = PyUnicode_FromString(""); +        if (!empty_string) +            return 0; +    } + +    if (!names) +        return 0; + +    level = PyLong_FromLong(s->v.ImportFrom.level); +    if (!level) { +        Py_DECREF(names); +        return 0; +    } + +    /* build up the names */ +    for (i = 0; i < n; i++) { +        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); +        Py_INCREF(alias->name); +        PyTuple_SET_ITEM(names, i, alias->name); +    } + +    if (s->lineno > c->c_future->ff_lineno && s->v.ImportFrom.module && +        !PyUnicode_CompareWithASCIIString(s->v.ImportFrom.module, "__future__")) { +        Py_DECREF(level); +        Py_DECREF(names); +        return compiler_error(c, "from __future__ imports must occur " +                              "at the beginning of the file"); +    } + +    ADDOP_O(c, LOAD_CONST, level, consts); +    Py_DECREF(level); +    ADDOP_O(c, LOAD_CONST, names, consts); +    Py_DECREF(names); +    if (s->v.ImportFrom.module) { +        ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module, names); +    } +    else { +        ADDOP_NAME(c, IMPORT_NAME, empty_string, names); +    } +    for (i = 0; i < n; i++) { +        alias_ty alias = (alias_ty)asdl_seq_GET(s->v.ImportFrom.names, i); +        identifier store_name; + +        if (i == 0 && *PyUnicode_AS_UNICODE(alias->name) == '*') { +            assert(n == 1); +            ADDOP(c, IMPORT_STAR); +            return 1; +        } + +        ADDOP_NAME(c, IMPORT_FROM, alias->name, names); +        store_name = alias->name; +        if (alias->asname) +            store_name = alias->asname; + +        if (!compiler_nameop(c, store_name, Store)) { +            Py_DECREF(names); +            return 0; +        } +    } +    /* remove imported module */ +    ADDOP(c, POP_TOP); +    return 1;  }  static int  compiler_assert(struct compiler *c, stmt_ty s)  { -	static PyObject *assertion_error = NULL; -	basicblock *end; - -	if (Py_OptimizeFlag) -		return 1; -	if (assertion_error == NULL) { -		assertion_error = PyUnicode_InternFromString("AssertionError"); -		if (assertion_error == NULL) -			return 0; -	} -	if (s->v.Assert.test->kind == Tuple_kind && -	    asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) { -		const char* msg = -			"assertion is always true, perhaps remove parentheses?"; -		if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, -				       c->u->u_lineno, NULL, NULL) == -1) -			return 0; -	} -	VISIT(c, expr, s->v.Assert.test); -	end = compiler_new_block(c); -	if (end == NULL) -		return 0; -	ADDOP_JABS(c, POP_JUMP_IF_TRUE, end); -	ADDOP_O(c, LOAD_GLOBAL, assertion_error, names); -	if (s->v.Assert.msg) { -		VISIT(c, expr, s->v.Assert.msg); -		ADDOP_I(c, CALL_FUNCTION, 1); -	} -	ADDOP_I(c, RAISE_VARARGS, 1); -	compiler_use_next_block(c, end); -	return 1; +    static PyObject *assertion_error = NULL; +    basicblock *end; + +    if (Py_OptimizeFlag) +        return 1; +    if (assertion_error == NULL) { +        assertion_error = PyUnicode_InternFromString("AssertionError"); +        if (assertion_error == NULL) +            return 0; +    } +    if (s->v.Assert.test->kind == Tuple_kind && +        asdl_seq_LEN(s->v.Assert.test->v.Tuple.elts) > 0) { +        const char* msg = +            "assertion is always true, perhaps remove parentheses?"; +        if (PyErr_WarnExplicit(PyExc_SyntaxWarning, msg, c->c_filename, +                               c->u->u_lineno, NULL, NULL) == -1) +            return 0; +    } +    VISIT(c, expr, s->v.Assert.test); +    end = compiler_new_block(c); +    if (end == NULL) +        return 0; +    ADDOP_JABS(c, POP_JUMP_IF_TRUE, end); +    ADDOP_O(c, LOAD_GLOBAL, assertion_error, names); +    if (s->v.Assert.msg) { +        VISIT(c, expr, s->v.Assert.msg); +        ADDOP_I(c, CALL_FUNCTION, 1); +    } +    ADDOP_I(c, RAISE_VARARGS, 1); +    compiler_use_next_block(c, end); +    return 1;  }  static int  compiler_visit_stmt(struct compiler *c, stmt_ty s)  { -	int i, n; - -	/* Always assign a lineno to the next instruction for a stmt. */ -	c->u->u_lineno = s->lineno; -	c->u->u_lineno_set = 0; - -	switch (s->kind) { -	case FunctionDef_kind: -		return compiler_function(c, s); -	case ClassDef_kind: -		return compiler_class(c, s); -	case Return_kind: -		if (c->u->u_ste->ste_type != FunctionBlock) -			return compiler_error(c, "'return' outside function"); -		if (s->v.Return.value) { -			VISIT(c, expr, s->v.Return.value); -		} -		else -			ADDOP_O(c, LOAD_CONST, Py_None, consts); -		ADDOP(c, RETURN_VALUE); -		break; -	case Delete_kind: -		VISIT_SEQ(c, expr, s->v.Delete.targets) -		break; -	case Assign_kind: -		n = asdl_seq_LEN(s->v.Assign.targets); -		VISIT(c, expr, s->v.Assign.value); -		for (i = 0; i < n; i++) { -			if (i < n - 1) -				ADDOP(c, DUP_TOP); -			VISIT(c, expr, -			      (expr_ty)asdl_seq_GET(s->v.Assign.targets, i)); -		} -		break; -	case AugAssign_kind: -		return compiler_augassign(c, s); -	case For_kind: -		return compiler_for(c, s); -	case While_kind: -		return compiler_while(c, s); -	case If_kind: -		return compiler_if(c, s); -	case Raise_kind: -		n = 0; -		if (s->v.Raise.exc) { -			VISIT(c, expr, s->v.Raise.exc); -			n++; -            if (s->v.Raise.cause) { -                VISIT(c, expr, s->v.Raise.cause); -                n++; -            } -		} -		ADDOP_I(c, RAISE_VARARGS, n); -		break; -	case TryExcept_kind: -		return compiler_try_except(c, s); -	case TryFinally_kind: -		return compiler_try_finally(c, s); -	case Assert_kind: -		return compiler_assert(c, s); -	case Import_kind: -		return compiler_import(c, s); -	case ImportFrom_kind: -		return compiler_from_import(c, s); -	case Global_kind: -	case Nonlocal_kind: -		break; -	case Expr_kind: -		if (c->c_interactive && c->c_nestlevel <= 1) { -			VISIT(c, expr, s->v.Expr.value); -			ADDOP(c, PRINT_EXPR); -		} -		else if (s->v.Expr.value->kind != Str_kind && -			 s->v.Expr.value->kind != Num_kind) { -			VISIT(c, expr, s->v.Expr.value); -			ADDOP(c, POP_TOP); -		} -		break; -	case Pass_kind: -		break; -	case Break_kind: -		if (!compiler_in_loop(c)) -			return compiler_error(c, "'break' outside loop"); -		ADDOP(c, BREAK_LOOP); -		break; -	case Continue_kind: -		return compiler_continue(c); -	case With_kind: -		return compiler_with(c, s); -	} -	return 1; +    int i, n; + +    /* Always assign a lineno to the next instruction for a stmt. */ +    c->u->u_lineno = s->lineno; +    c->u->u_lineno_set = 0; + +    switch (s->kind) { +    case FunctionDef_kind: +        return compiler_function(c, s); +    case ClassDef_kind: +        return compiler_class(c, s); +    case Return_kind: +        if (c->u->u_ste->ste_type != FunctionBlock) +            return compiler_error(c, "'return' outside function"); +        if (s->v.Return.value) { +            VISIT(c, expr, s->v.Return.value); +        } +        else +            ADDOP_O(c, LOAD_CONST, Py_None, consts); +        ADDOP(c, RETURN_VALUE); +        break; +    case Delete_kind: +        VISIT_SEQ(c, expr, s->v.Delete.targets) +        break; +    case Assign_kind: +        n = asdl_seq_LEN(s->v.Assign.targets); +        VISIT(c, expr, s->v.Assign.value); +        for (i = 0; i < n; i++) { +            if (i < n - 1) +                ADDOP(c, DUP_TOP); +            VISIT(c, expr, +                  (expr_ty)asdl_seq_GET(s->v.Assign.targets, i)); +        } +        break; +    case AugAssign_kind: +        return compiler_augassign(c, s); +    case For_kind: +        return compiler_for(c, s); +    case While_kind: +        return compiler_while(c, s); +    case If_kind: +        return compiler_if(c, s); +    case Raise_kind: +        n = 0; +        if (s->v.Raise.exc) { +            VISIT(c, expr, s->v.Raise.exc); +            n++; +        if (s->v.Raise.cause) { +        VISIT(c, expr, s->v.Raise.cause); +        n++; +        } +        } +        ADDOP_I(c, RAISE_VARARGS, n); +        break; +    case TryExcept_kind: +        return compiler_try_except(c, s); +    case TryFinally_kind: +        return compiler_try_finally(c, s); +    case Assert_kind: +        return compiler_assert(c, s); +    case Import_kind: +        return compiler_import(c, s); +    case ImportFrom_kind: +        return compiler_from_import(c, s); +    case Global_kind: +    case Nonlocal_kind: +        break; +    case Expr_kind: +        if (c->c_interactive && c->c_nestlevel <= 1) { +            VISIT(c, expr, s->v.Expr.value); +            ADDOP(c, PRINT_EXPR); +        } +        else if (s->v.Expr.value->kind != Str_kind && +                 s->v.Expr.value->kind != Num_kind) { +            VISIT(c, expr, s->v.Expr.value); +            ADDOP(c, POP_TOP); +        } +        break; +    case Pass_kind: +        break; +    case Break_kind: +        if (!compiler_in_loop(c)) +            return compiler_error(c, "'break' outside loop"); +        ADDOP(c, BREAK_LOOP); +        break; +    case Continue_kind: +        return compiler_continue(c); +    case With_kind: +        return compiler_with(c, s); +    } +    return 1;  }  static int  unaryop(unaryop_ty op)  { -	switch (op) { -	case Invert: -		return UNARY_INVERT; -	case Not: -		return UNARY_NOT; -	case UAdd: -		return UNARY_POSITIVE; -	case USub: -		return UNARY_NEGATIVE; -	default: -		PyErr_Format(PyExc_SystemError, -			"unary op %d should not be possible", op); -		return 0; -	} +    switch (op) { +    case Invert: +        return UNARY_INVERT; +    case Not: +        return UNARY_NOT; +    case UAdd: +        return UNARY_POSITIVE; +    case USub: +        return UNARY_NEGATIVE; +    default: +        PyErr_Format(PyExc_SystemError, +            "unary op %d should not be possible", op); +        return 0; +    }  }  static int  binop(struct compiler *c, operator_ty op)  { -	switch (op) { -	case Add: -		return BINARY_ADD; -	case Sub: -		return BINARY_SUBTRACT; -	case Mult: -		return BINARY_MULTIPLY; -	case Div: -		return BINARY_TRUE_DIVIDE; -	case Mod: -		return BINARY_MODULO; -	case Pow: -		return BINARY_POWER; -	case LShift: -		return BINARY_LSHIFT; -	case RShift: -		return BINARY_RSHIFT; -	case BitOr: -		return BINARY_OR; -	case BitXor: -		return BINARY_XOR; -	case BitAnd: -		return BINARY_AND; -	case FloorDiv: -		return BINARY_FLOOR_DIVIDE; -	default: -		PyErr_Format(PyExc_SystemError, -			"binary op %d should not be possible", op); -		return 0; -	} +    switch (op) { +    case Add: +        return BINARY_ADD; +    case Sub: +        return BINARY_SUBTRACT; +    case Mult: +        return BINARY_MULTIPLY; +    case Div: +        return BINARY_TRUE_DIVIDE; +    case Mod: +        return BINARY_MODULO; +    case Pow: +        return BINARY_POWER; +    case LShift: +        return BINARY_LSHIFT; +    case RShift: +        return BINARY_RSHIFT; +    case BitOr: +        return BINARY_OR; +    case BitXor: +        return BINARY_XOR; +    case BitAnd: +        return BINARY_AND; +    case FloorDiv: +        return BINARY_FLOOR_DIVIDE; +    default: +        PyErr_Format(PyExc_SystemError, +            "binary op %d should not be possible", op); +        return 0; +    }  }  static int  cmpop(cmpop_ty op)  { -	switch (op) { -	case Eq: -		return PyCmp_EQ; -	case NotEq: -		return PyCmp_NE; -	case Lt: -		return PyCmp_LT; -	case LtE: -		return PyCmp_LE; -	case Gt: -		return PyCmp_GT; -	case GtE: -		return PyCmp_GE; -	case Is: -		return PyCmp_IS; -	case IsNot: -		return PyCmp_IS_NOT; -	case In: -		return PyCmp_IN; -	case NotIn: -		return PyCmp_NOT_IN; -	default: -		return PyCmp_BAD; -	} +    switch (op) { +    case Eq: +        return PyCmp_EQ; +    case NotEq: +        return PyCmp_NE; +    case Lt: +        return PyCmp_LT; +    case LtE: +        return PyCmp_LE; +    case Gt: +        return PyCmp_GT; +    case GtE: +        return PyCmp_GE; +    case Is: +        return PyCmp_IS; +    case IsNot: +        return PyCmp_IS_NOT; +    case In: +        return PyCmp_IN; +    case NotIn: +        return PyCmp_NOT_IN; +    default: +        return PyCmp_BAD; +    }  }  static int  inplace_binop(struct compiler *c, operator_ty op)  { -	switch (op) { -	case Add: -		return INPLACE_ADD; -	case Sub: -		return INPLACE_SUBTRACT; -	case Mult: -		return INPLACE_MULTIPLY; -	case Div: -		return INPLACE_TRUE_DIVIDE; -	case Mod: -		return INPLACE_MODULO; -	case Pow: -		return INPLACE_POWER; -	case LShift: -		return INPLACE_LSHIFT; -	case RShift: -		return INPLACE_RSHIFT; -	case BitOr: -		return INPLACE_OR; -	case BitXor: -		return INPLACE_XOR; -	case BitAnd: -		return INPLACE_AND; -	case FloorDiv: -		return INPLACE_FLOOR_DIVIDE; -	default: -		PyErr_Format(PyExc_SystemError, -			"inplace binary op %d should not be possible", op); -		return 0; -	} +    switch (op) { +    case Add: +        return INPLACE_ADD; +    case Sub: +        return INPLACE_SUBTRACT; +    case Mult: +        return INPLACE_MULTIPLY; +    case Div: +        return INPLACE_TRUE_DIVIDE; +    case Mod: +        return INPLACE_MODULO; +    case Pow: +        return INPLACE_POWER; +    case LShift: +        return INPLACE_LSHIFT; +    case RShift: +        return INPLACE_RSHIFT; +    case BitOr: +        return INPLACE_OR; +    case BitXor: +        return INPLACE_XOR; +    case BitAnd: +        return INPLACE_AND; +    case FloorDiv: +        return INPLACE_FLOOR_DIVIDE; +    default: +        PyErr_Format(PyExc_SystemError, +            "inplace binary op %d should not be possible", op); +        return 0; +    }  }  static int  compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)  { -	int op, scope, arg; -	enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype; - -	PyObject *dict = c->u->u_names; -	PyObject *mangled; -	/* XXX AugStore isn't used anywhere! */ - -	mangled = _Py_Mangle(c->u->u_private, name); -	if (!mangled) -		return 0; - -	op = 0; -	optype = OP_NAME; -	scope = PyST_GetScope(c->u->u_ste, mangled); -	switch (scope) { -	case FREE: -		dict = c->u->u_freevars; -		optype = OP_DEREF; -		break; -	case CELL: -		dict = c->u->u_cellvars; -		optype = OP_DEREF; -		break; -	case LOCAL: -		if (c->u->u_ste->ste_type == FunctionBlock) -			optype = OP_FAST; -		break; -	case GLOBAL_IMPLICIT: -		if (c->u->u_ste->ste_type == FunctionBlock && -			!c->u->u_ste->ste_unoptimized) -			optype = OP_GLOBAL; -		break; -	case GLOBAL_EXPLICIT: -		optype = OP_GLOBAL; -		break; -	default: -		/* scope can be 0 */ -		break; -	} - -	/* XXX Leave assert here, but handle __doc__ and the like better */ -	assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_'); - -	switch (optype) { -	case OP_DEREF: -		switch (ctx) { -		case Load: op = LOAD_DEREF; break; -		case Store: op = STORE_DEREF; break; -		case AugLoad: -		case AugStore: -			break; -		case Del: -			PyErr_Format(PyExc_SyntaxError, -				     "can not delete variable '%S' referenced " -				     "in nested scope", -				     name); -			Py_DECREF(mangled); -			return 0; -		case Param: -		default: -			PyErr_SetString(PyExc_SystemError, -					"param invalid for deref variable"); -			return 0; -		} -		break; -	case OP_FAST: -		switch (ctx) { -		case Load: op = LOAD_FAST; break; -		case Store: op = STORE_FAST; break; -		case Del: op = DELETE_FAST; break; -		case AugLoad: -		case AugStore: -			break; -		case Param: -		default: -			PyErr_SetString(PyExc_SystemError, -					"param invalid for local variable"); -			return 0; -		} -		ADDOP_O(c, op, mangled, varnames); -		Py_DECREF(mangled); -		return 1; -	case OP_GLOBAL: -		switch (ctx) { -		case Load: op = LOAD_GLOBAL; break; -		case Store: op = STORE_GLOBAL; break; -		case Del: op = DELETE_GLOBAL; break; -		case AugLoad: -		case AugStore: -			break; -		case Param: -		default: -			PyErr_SetString(PyExc_SystemError, -					"param invalid for global variable"); -			return 0; -		} -		break; -	case OP_NAME: -		switch (ctx) { -		case Load: op = LOAD_NAME; break; -		case Store: op = STORE_NAME; break; -		case Del: op = DELETE_NAME; break; -		case AugLoad: -		case AugStore: -			break; -		case Param: -		default: -			PyErr_SetString(PyExc_SystemError, -					"param invalid for name variable"); -			return 0; -		} -		break; -	} - -	assert(op); -	arg = compiler_add_o(c, dict, mangled); -	Py_DECREF(mangled); -	if (arg < 0) -		return 0; -	return compiler_addop_i(c, op, arg); +    int op, scope, arg; +    enum { OP_FAST, OP_GLOBAL, OP_DEREF, OP_NAME } optype; + +    PyObject *dict = c->u->u_names; +    PyObject *mangled; +    /* XXX AugStore isn't used anywhere! */ + +    mangled = _Py_Mangle(c->u->u_private, name); +    if (!mangled) +        return 0; + +    op = 0; +    optype = OP_NAME; +    scope = PyST_GetScope(c->u->u_ste, mangled); +    switch (scope) { +    case FREE: +        dict = c->u->u_freevars; +        optype = OP_DEREF; +        break; +    case CELL: +        dict = c->u->u_cellvars; +        optype = OP_DEREF; +        break; +    case LOCAL: +        if (c->u->u_ste->ste_type == FunctionBlock) +            optype = OP_FAST; +        break; +    case GLOBAL_IMPLICIT: +        if (c->u->u_ste->ste_type == FunctionBlock && +            !c->u->u_ste->ste_unoptimized) +            optype = OP_GLOBAL; +        break; +    case GLOBAL_EXPLICIT: +        optype = OP_GLOBAL; +        break; +    default: +        /* scope can be 0 */ +        break; +    } + +    /* XXX Leave assert here, but handle __doc__ and the like better */ +    assert(scope || PyUnicode_AS_UNICODE(name)[0] == '_'); + +    switch (optype) { +    case OP_DEREF: +        switch (ctx) { +        case Load: op = LOAD_DEREF; break; +        case Store: op = STORE_DEREF; break; +        case AugLoad: +        case AugStore: +            break; +        case Del: +            PyErr_Format(PyExc_SyntaxError, +                         "can not delete variable '%S' referenced " +                         "in nested scope", +                         name); +            Py_DECREF(mangled); +            return 0; +        case Param: +        default: +            PyErr_SetString(PyExc_SystemError, +                            "param invalid for deref variable"); +            return 0; +        } +        break; +    case OP_FAST: +        switch (ctx) { +        case Load: op = LOAD_FAST; break; +        case Store: op = STORE_FAST; break; +        case Del: op = DELETE_FAST; break; +        case AugLoad: +        case AugStore: +            break; +        case Param: +        default: +            PyErr_SetString(PyExc_SystemError, +                            "param invalid for local variable"); +            return 0; +        } +        ADDOP_O(c, op, mangled, varnames); +        Py_DECREF(mangled); +        return 1; +    case OP_GLOBAL: +        switch (ctx) { +        case Load: op = LOAD_GLOBAL; break; +        case Store: op = STORE_GLOBAL; break; +        case Del: op = DELETE_GLOBAL; break; +        case AugLoad: +        case AugStore: +            break; +        case Param: +        default: +            PyErr_SetString(PyExc_SystemError, +                            "param invalid for global variable"); +            return 0; +        } +        break; +    case OP_NAME: +        switch (ctx) { +        case Load: op = LOAD_NAME; break; +        case Store: op = STORE_NAME; break; +        case Del: op = DELETE_NAME; break; +        case AugLoad: +        case AugStore: +            break; +        case Param: +        default: +            PyErr_SetString(PyExc_SystemError, +                            "param invalid for name variable"); +            return 0; +        } +        break; +    } + +    assert(op); +    arg = compiler_add_o(c, dict, mangled); +    Py_DECREF(mangled); +    if (arg < 0) +        return 0; +    return compiler_addop_i(c, op, arg);  }  static int  compiler_boolop(struct compiler *c, expr_ty e)  { -	basicblock *end; -	int jumpi, i, n; -	asdl_seq *s; - -	assert(e->kind == BoolOp_kind); -	if (e->v.BoolOp.op == And) -		jumpi = JUMP_IF_FALSE_OR_POP; -	else -		jumpi = JUMP_IF_TRUE_OR_POP; -	end = compiler_new_block(c); -	if (end == NULL) -		return 0; -	s = e->v.BoolOp.values; -	n = asdl_seq_LEN(s) - 1; -	assert(n >= 0); -	for (i = 0; i < n; ++i) { -		VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i)); -		ADDOP_JABS(c, jumpi, end); -	} -	VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n)); -	compiler_use_next_block(c, end); -	return 1; +    basicblock *end; +    int jumpi, i, n; +    asdl_seq *s; + +    assert(e->kind == BoolOp_kind); +    if (e->v.BoolOp.op == And) +        jumpi = JUMP_IF_FALSE_OR_POP; +    else +        jumpi = JUMP_IF_TRUE_OR_POP; +    end = compiler_new_block(c); +    if (end == NULL) +        return 0; +    s = e->v.BoolOp.values; +    n = asdl_seq_LEN(s) - 1; +    assert(n >= 0); +    for (i = 0; i < n; ++i) { +        VISIT(c, expr, (expr_ty)asdl_seq_GET(s, i)); +        ADDOP_JABS(c, jumpi, end); +    } +    VISIT(c, expr, (expr_ty)asdl_seq_GET(s, n)); +    compiler_use_next_block(c, end); +    return 1;  }  static int  compiler_list(struct compiler *c, expr_ty e)  { -	int n = asdl_seq_LEN(e->v.List.elts); -	if (e->v.List.ctx == Store) { -		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) { -				if ((i >= (1 << 8)) || -				    (n-i-1 >= (INT_MAX >> 8))) -					return compiler_error(c, -						"too many expressions in " -						"star-unpacking assignment"); -				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) { -		ADDOP_I(c, BUILD_LIST, n); -	} -	return 1; +    int n = asdl_seq_LEN(e->v.List.elts); +    if (e->v.List.ctx == Store) { +        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) { +                if ((i >= (1 << 8)) || +                    (n-i-1 >= (INT_MAX >> 8))) +                    return compiler_error(c, +                        "too many expressions in " +                        "star-unpacking assignment"); +                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) { +        ADDOP_I(c, BUILD_LIST, n); +    } +    return 1;  }  static int  compiler_tuple(struct compiler *c, expr_ty e)  { -	int n = asdl_seq_LEN(e->v.Tuple.elts); -	if (e->v.Tuple.ctx == Store) { -		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) { -				if ((i >= (1 << 8)) || -				    (n-i-1 >= (INT_MAX >> 8))) -					return compiler_error(c, -						"too many expressions in " -						"star-unpacking assignment"); -				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) { -		ADDOP_I(c, BUILD_TUPLE, n); -	} -	return 1; +    int n = asdl_seq_LEN(e->v.Tuple.elts); +    if (e->v.Tuple.ctx == Store) { +        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) { +                if ((i >= (1 << 8)) || +                    (n-i-1 >= (INT_MAX >> 8))) +                    return compiler_error(c, +                        "too many expressions in " +                        "star-unpacking assignment"); +                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) { +        ADDOP_I(c, BUILD_TUPLE, n); +    } +    return 1;  }  static int  compiler_compare(struct compiler *c, expr_ty e)  { -	int i, n; -	basicblock *cleanup = NULL; - -	/* XXX the logic can be cleaned up for 1 or multiple comparisons */ -	VISIT(c, expr, e->v.Compare.left); -	n = asdl_seq_LEN(e->v.Compare.ops); -	assert(n > 0); -	if (n > 1) { -		cleanup = compiler_new_block(c); -		if (cleanup == NULL) -		    return 0; -		VISIT(c, expr,  -			(expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); -	} -	for (i = 1; i < n; i++) { -		ADDOP(c, DUP_TOP); -		ADDOP(c, ROT_THREE); -		ADDOP_I(c, COMPARE_OP, -			cmpop((cmpop_ty)(asdl_seq_GET( -						  e->v.Compare.ops, i - 1)))); -		ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup); -		NEXT_BLOCK(c); -		if (i < (n - 1)) -		    VISIT(c, expr,  -			    (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); -	} -	VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1)); -	ADDOP_I(c, COMPARE_OP, -	       cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1)))); -	if (n > 1) { -		basicblock *end = compiler_new_block(c); -		if (end == NULL) -		    return 0; -		ADDOP_JREL(c, JUMP_FORWARD, end); -		compiler_use_next_block(c, cleanup); -		ADDOP(c, ROT_TWO); -		ADDOP(c, POP_TOP); -		compiler_use_next_block(c, end); -	} -	return 1; +    int i, n; +    basicblock *cleanup = NULL; + +    /* XXX the logic can be cleaned up for 1 or multiple comparisons */ +    VISIT(c, expr, e->v.Compare.left); +    n = asdl_seq_LEN(e->v.Compare.ops); +    assert(n > 0); +    if (n > 1) { +        cleanup = compiler_new_block(c); +        if (cleanup == NULL) +            return 0; +        VISIT(c, expr, +            (expr_ty)asdl_seq_GET(e->v.Compare.comparators, 0)); +    } +    for (i = 1; i < n; i++) { +        ADDOP(c, DUP_TOP); +        ADDOP(c, ROT_THREE); +        ADDOP_I(c, COMPARE_OP, +            cmpop((cmpop_ty)(asdl_seq_GET( +                                      e->v.Compare.ops, i - 1)))); +        ADDOP_JABS(c, JUMP_IF_FALSE_OR_POP, cleanup); +        NEXT_BLOCK(c); +        if (i < (n - 1)) +            VISIT(c, expr, +                (expr_ty)asdl_seq_GET(e->v.Compare.comparators, i)); +    } +    VISIT(c, expr, (expr_ty)asdl_seq_GET(e->v.Compare.comparators, n - 1)); +    ADDOP_I(c, COMPARE_OP, +           cmpop((cmpop_ty)(asdl_seq_GET(e->v.Compare.ops, n - 1)))); +    if (n > 1) { +        basicblock *end = compiler_new_block(c); +        if (end == NULL) +            return 0; +        ADDOP_JREL(c, JUMP_FORWARD, end); +        compiler_use_next_block(c, cleanup); +        ADDOP(c, ROT_TWO); +        ADDOP(c, POP_TOP); +        compiler_use_next_block(c, end); +    } +    return 1;  }  static int  compiler_call(struct compiler *c, expr_ty e)  { -	VISIT(c, expr, e->v.Call.func); -	return compiler_call_helper(c, 0, -				    e->v.Call.args, -				    e->v.Call.keywords, -				    e->v.Call.starargs, -				    e->v.Call.kwargs); +    VISIT(c, expr, e->v.Call.func); +    return compiler_call_helper(c, 0, +                                e->v.Call.args, +                                e->v.Call.keywords, +                                e->v.Call.starargs, +                                e->v.Call.kwargs);  }  /* shared code between compiler_call and compiler_class */  static int  compiler_call_helper(struct compiler *c, -		     int n, /* Args already pushed */ -		     asdl_seq *args, -		     asdl_seq *keywords, -		     expr_ty starargs, -		     expr_ty kwargs) -{ -	int code = 0; - -	n += asdl_seq_LEN(args); -	VISIT_SEQ(c, expr, args); -	if (keywords) { -		VISIT_SEQ(c, keyword, keywords); -		n |= asdl_seq_LEN(keywords) << 8; -	} -	if (starargs) { -		VISIT(c, expr, starargs); -		code |= 1; -	} -	if (kwargs) { -		VISIT(c, expr, kwargs); -		code |= 2; -	} -	switch (code) { -	case 0: -		ADDOP_I(c, CALL_FUNCTION, n); -		break; -	case 1: -		ADDOP_I(c, CALL_FUNCTION_VAR, n); -		break; -	case 2: -		ADDOP_I(c, CALL_FUNCTION_KW, n); -		break; -	case 3: -		ADDOP_I(c, CALL_FUNCTION_VAR_KW, n); -		break; -	} -	return 1; +                     int n, /* Args already pushed */ +             asdl_seq *args, +             asdl_seq *keywords, +             expr_ty starargs, +             expr_ty kwargs) +{ +    int code = 0; + +    n += asdl_seq_LEN(args); +    VISIT_SEQ(c, expr, args); +    if (keywords) { +        VISIT_SEQ(c, keyword, keywords); +        n |= asdl_seq_LEN(keywords) << 8; +    } +    if (starargs) { +        VISIT(c, expr, starargs); +        code |= 1; +    } +    if (kwargs) { +        VISIT(c, expr, kwargs); +        code |= 2; +    } +    switch (code) { +    case 0: +        ADDOP_I(c, CALL_FUNCTION, n); +        break; +    case 1: +        ADDOP_I(c, CALL_FUNCTION_VAR, n); +        break; +    case 2: +        ADDOP_I(c, CALL_FUNCTION_KW, n); +        break; +    case 3: +        ADDOP_I(c, CALL_FUNCTION_VAR_KW, n); +        break; +    } +    return 1;  } @@ -2787,228 +2787,228 @@ compiler_call_helper(struct compiler *c,  */  static int -compiler_comprehension_generator(struct compiler *c,  -				 asdl_seq *generators, int gen_index,  -				 expr_ty elt, expr_ty val, int type) -{ -	/* generate code for the iterator, then each of the ifs, -	   and then write to the element */ - -	comprehension_ty gen; -	basicblock *start, *anchor, *skip, *if_cleanup; -	int i, n; - -	start = compiler_new_block(c); -	skip = compiler_new_block(c); -	if_cleanup = compiler_new_block(c); -	anchor = compiler_new_block(c); - -	if (start == NULL || skip == NULL || if_cleanup == NULL || -	    anchor == NULL) -		return 0; - -	gen = (comprehension_ty)asdl_seq_GET(generators, gen_index); -	 -	if (gen_index == 0) { -		/* Receive outermost iter as an implicit argument */ -		c->u->u_argcount = 1; -		ADDOP_I(c, LOAD_FAST, 0); -	} -	else { -		/* Sub-iter - calculate on the fly */ -		VISIT(c, expr, gen->iter); -		ADDOP(c, GET_ITER); -	} -	compiler_use_next_block(c, start); -	ADDOP_JREL(c, FOR_ITER, anchor); -	NEXT_BLOCK(c); -	VISIT(c, expr, gen->target); - -	/* XXX this needs to be cleaned up...a lot! */ -	n = asdl_seq_LEN(gen->ifs); -	for (i = 0; i < n; i++) { -		expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i); -		VISIT(c, expr, e); -		ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup); -		NEXT_BLOCK(c); -	} - -	if (++gen_index < asdl_seq_LEN(generators)) -		if (!compiler_comprehension_generator(c,  -						      generators, gen_index, -						      elt, val, type)) -		return 0; - -	/* only append after the last for generator */ -	if (gen_index >= asdl_seq_LEN(generators)) { -		/* comprehension specific code */ -		switch (type) { -		case COMP_GENEXP: -			VISIT(c, expr, elt); -			ADDOP(c, YIELD_VALUE); -			ADDOP(c, POP_TOP); -			break; -		case COMP_LISTCOMP: -			VISIT(c, expr, elt); -			ADDOP_I(c, LIST_APPEND, gen_index + 1); -			break; -		case COMP_SETCOMP: -			VISIT(c, expr, elt); -			ADDOP_I(c, SET_ADD, gen_index + 1); -			break; -		case COMP_DICTCOMP: -			/* With 'd[k] = v', v is evaluated before k, so we do -			   the same. */ -			VISIT(c, expr, val); -			VISIT(c, expr, elt); -			ADDOP_I(c, MAP_ADD, gen_index + 1); -			break; -		default: -			return 0; -		} - -		compiler_use_next_block(c, skip); -	} -	compiler_use_next_block(c, if_cleanup); -	ADDOP_JABS(c, JUMP_ABSOLUTE, start); -	compiler_use_next_block(c, anchor); - -	return 1; +compiler_comprehension_generator(struct compiler *c, +                                 asdl_seq *generators, int gen_index, +                                 expr_ty elt, expr_ty val, int type) +{ +    /* generate code for the iterator, then each of the ifs, +       and then write to the element */ + +    comprehension_ty gen; +    basicblock *start, *anchor, *skip, *if_cleanup; +    int i, n; + +    start = compiler_new_block(c); +    skip = compiler_new_block(c); +    if_cleanup = compiler_new_block(c); +    anchor = compiler_new_block(c); + +    if (start == NULL || skip == NULL || if_cleanup == NULL || +        anchor == NULL) +        return 0; + +    gen = (comprehension_ty)asdl_seq_GET(generators, gen_index); + +    if (gen_index == 0) { +        /* Receive outermost iter as an implicit argument */ +        c->u->u_argcount = 1; +        ADDOP_I(c, LOAD_FAST, 0); +    } +    else { +        /* Sub-iter - calculate on the fly */ +        VISIT(c, expr, gen->iter); +        ADDOP(c, GET_ITER); +    } +    compiler_use_next_block(c, start); +    ADDOP_JREL(c, FOR_ITER, anchor); +    NEXT_BLOCK(c); +    VISIT(c, expr, gen->target); + +    /* XXX this needs to be cleaned up...a lot! */ +    n = asdl_seq_LEN(gen->ifs); +    for (i = 0; i < n; i++) { +        expr_ty e = (expr_ty)asdl_seq_GET(gen->ifs, i); +        VISIT(c, expr, e); +        ADDOP_JABS(c, POP_JUMP_IF_FALSE, if_cleanup); +        NEXT_BLOCK(c); +    } + +    if (++gen_index < asdl_seq_LEN(generators)) +        if (!compiler_comprehension_generator(c, +                                              generators, gen_index, +                                              elt, val, type)) +        return 0; + +    /* only append after the last for generator */ +    if (gen_index >= asdl_seq_LEN(generators)) { +        /* comprehension specific code */ +        switch (type) { +        case COMP_GENEXP: +            VISIT(c, expr, elt); +            ADDOP(c, YIELD_VALUE); +            ADDOP(c, POP_TOP); +            break; +        case COMP_LISTCOMP: +            VISIT(c, expr, elt); +            ADDOP_I(c, LIST_APPEND, gen_index + 1); +            break; +        case COMP_SETCOMP: +            VISIT(c, expr, elt); +            ADDOP_I(c, SET_ADD, gen_index + 1); +            break; +        case COMP_DICTCOMP: +            /* With 'd[k] = v', v is evaluated before k, so we do +               the same. */ +            VISIT(c, expr, val); +            VISIT(c, expr, elt); +            ADDOP_I(c, MAP_ADD, gen_index + 1); +            break; +        default: +            return 0; +        } + +        compiler_use_next_block(c, skip); +    } +    compiler_use_next_block(c, if_cleanup); +    ADDOP_JABS(c, JUMP_ABSOLUTE, start); +    compiler_use_next_block(c, anchor); + +    return 1;  }  static int  compiler_comprehension(struct compiler *c, expr_ty e, int type, identifier name, -		       asdl_seq *generators, expr_ty elt, expr_ty val) -{ -	PyCodeObject *co = NULL; -	expr_ty outermost_iter; - -	outermost_iter = ((comprehension_ty) -			  asdl_seq_GET(generators, 0))->iter; - -	if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) -		goto error; -	 -	if (type != COMP_GENEXP) { -		int op; -		switch (type) { -		case COMP_LISTCOMP: -			op = BUILD_LIST; -			break; -		case COMP_SETCOMP: -			op = BUILD_SET; -			break; -		case COMP_DICTCOMP: -			op = BUILD_MAP; -			break; -		default: -			PyErr_Format(PyExc_SystemError, -				     "unknown comprehension type %d", type); -			goto error_in_scope; -		} - -		ADDOP_I(c, op, 0); -	} -	 -	if (!compiler_comprehension_generator(c, generators, 0, elt, -					      val, type)) -		goto error_in_scope; -	 -	if (type != COMP_GENEXP) { -		ADDOP(c, RETURN_VALUE); -	} - -	co = assemble(c, 1); -	compiler_exit_scope(c); -	if (co == NULL) -		goto error; - -	if (!compiler_make_closure(c, co, 0)) -		goto error; -	Py_DECREF(co); - -	VISIT(c, expr, outermost_iter); -	ADDOP(c, GET_ITER); -	ADDOP_I(c, CALL_FUNCTION, 1); -	return 1; +                       asdl_seq *generators, expr_ty elt, expr_ty val) +{ +    PyCodeObject *co = NULL; +    expr_ty outermost_iter; + +    outermost_iter = ((comprehension_ty) +                      asdl_seq_GET(generators, 0))->iter; + +    if (!compiler_enter_scope(c, name, (void *)e, e->lineno)) +        goto error; + +    if (type != COMP_GENEXP) { +        int op; +        switch (type) { +        case COMP_LISTCOMP: +            op = BUILD_LIST; +            break; +        case COMP_SETCOMP: +            op = BUILD_SET; +            break; +        case COMP_DICTCOMP: +            op = BUILD_MAP; +            break; +        default: +            PyErr_Format(PyExc_SystemError, +                         "unknown comprehension type %d", type); +            goto error_in_scope; +        } + +        ADDOP_I(c, op, 0); +    } + +    if (!compiler_comprehension_generator(c, generators, 0, elt, +                                          val, type)) +        goto error_in_scope; + +    if (type != COMP_GENEXP) { +        ADDOP(c, RETURN_VALUE); +    } + +    co = assemble(c, 1); +    compiler_exit_scope(c); +    if (co == NULL) +        goto error; + +    if (!compiler_make_closure(c, co, 0)) +        goto error; +    Py_DECREF(co); + +    VISIT(c, expr, outermost_iter); +    ADDOP(c, GET_ITER); +    ADDOP_I(c, CALL_FUNCTION, 1); +    return 1;  error_in_scope: -	compiler_exit_scope(c); +    compiler_exit_scope(c);  error: -	Py_XDECREF(co); -	return 0; +    Py_XDECREF(co); +    return 0;  }  static int  compiler_genexp(struct compiler *c, expr_ty e)  { -	static identifier name; -	if (!name) { -		name = PyUnicode_FromString("<genexpr>"); -		if (!name) -			return 0; -	} -	assert(e->kind == GeneratorExp_kind); -	return compiler_comprehension(c, e, COMP_GENEXP, name, -				      e->v.GeneratorExp.generators, -				      e->v.GeneratorExp.elt, NULL); +    static identifier name; +    if (!name) { +        name = PyUnicode_FromString("<genexpr>"); +        if (!name) +            return 0; +    } +    assert(e->kind == GeneratorExp_kind); +    return compiler_comprehension(c, e, COMP_GENEXP, name, +                                  e->v.GeneratorExp.generators, +                                  e->v.GeneratorExp.elt, NULL);  }  static int  compiler_listcomp(struct compiler *c, expr_ty e)  { -	static identifier name; -	if (!name) { -		name = PyUnicode_FromString("<listcomp>"); -		if (!name) -			return 0; -	} -	assert(e->kind == ListComp_kind); -	return compiler_comprehension(c, e, COMP_LISTCOMP, name, -				      e->v.ListComp.generators, -				      e->v.ListComp.elt, NULL); +    static identifier name; +    if (!name) { +        name = PyUnicode_FromString("<listcomp>"); +        if (!name) +            return 0; +    } +    assert(e->kind == ListComp_kind); +    return compiler_comprehension(c, e, COMP_LISTCOMP, name, +                                  e->v.ListComp.generators, +                                  e->v.ListComp.elt, NULL);  }  static int  compiler_setcomp(struct compiler *c, expr_ty e)  { -	static identifier name; -	if (!name) { -		name = PyUnicode_FromString("<setcomp>"); -		if (!name) -			return 0; -	} -	assert(e->kind == SetComp_kind); -	return compiler_comprehension(c, e, COMP_SETCOMP, name, -				      e->v.SetComp.generators, -				      e->v.SetComp.elt, NULL); +    static identifier name; +    if (!name) { +        name = PyUnicode_FromString("<setcomp>"); +        if (!name) +            return 0; +    } +    assert(e->kind == SetComp_kind); +    return compiler_comprehension(c, e, COMP_SETCOMP, name, +                                  e->v.SetComp.generators, +                                  e->v.SetComp.elt, NULL);  }  static int  compiler_dictcomp(struct compiler *c, expr_ty e)  { -	static identifier name; -	if (!name) { -		name = PyUnicode_FromString("<dictcomp>"); -		if (!name) -			return 0; -	} -	assert(e->kind == DictComp_kind); -	return compiler_comprehension(c, e, COMP_DICTCOMP, name, -				      e->v.DictComp.generators, -				      e->v.DictComp.key, e->v.DictComp.value); +    static identifier name; +    if (!name) { +        name = PyUnicode_FromString("<dictcomp>"); +        if (!name) +            return 0; +    } +    assert(e->kind == DictComp_kind); +    return compiler_comprehension(c, e, COMP_DICTCOMP, name, +                                  e->v.DictComp.generators, +                                  e->v.DictComp.key, e->v.DictComp.value);  }  static int  compiler_visit_keyword(struct compiler *c, keyword_ty k)  { -	ADDOP_O(c, LOAD_CONST, k->arg, consts); -	VISIT(c, expr, k->value); -	return 1; +    ADDOP_O(c, LOAD_CONST, k->arg, consts); +    VISIT(c, expr, k->value); +    return 1;  } -/* Test whether expression is constant.	 For constants, report +/* Test whether expression is constant.  For constants, report     whether they are true or false.     Return values: 1 for true, 0 for false, -1 for non-constant. @@ -3017,39 +3017,39 @@ compiler_visit_keyword(struct compiler *c, keyword_ty k)  static int  expr_constant(expr_ty e)  { -	char *id; -	switch (e->kind) { -	case Ellipsis_kind: -		return 1; -	case Num_kind: -		return PyObject_IsTrue(e->v.Num.n); -	case Str_kind: -		return PyObject_IsTrue(e->v.Str.s); -	case Name_kind: -		/* optimize away names that can't be reassigned */ -		id = PyBytes_AS_STRING( -                    _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL)); -		if (strcmp(id, "True") == 0) return 1; -		if (strcmp(id, "False") == 0) return 0; -		if (strcmp(id, "None") == 0) return 0; -		if (strcmp(id, "__debug__") == 0) -			return ! Py_OptimizeFlag; -		/* fall through */ -	default: -		return -1; -	} +    char *id; +    switch (e->kind) { +    case Ellipsis_kind: +        return 1; +    case Num_kind: +        return PyObject_IsTrue(e->v.Num.n); +    case Str_kind: +        return PyObject_IsTrue(e->v.Str.s); +    case Name_kind: +        /* optimize away names that can't be reassigned */ +        id = PyBytes_AS_STRING( +            _PyUnicode_AsDefaultEncodedString(e->v.Name.id, NULL)); +        if (strcmp(id, "True") == 0) return 1; +        if (strcmp(id, "False") == 0) return 0; +        if (strcmp(id, "None") == 0) return 0; +        if (strcmp(id, "__debug__") == 0) +            return ! Py_OptimizeFlag; +        /* fall through */ +    default: +        return -1; +    }  }  /*     Implements the with statement from PEP 343. -   The semantics outlined in that PEP are as follows:   +   The semantics outlined in that PEP are as follows:     with EXPR as VAR:         BLOCK -   +     It is implemented roughly as: -   +     context = EXPR     exit = context.__exit__  # not calling it     value = context.__enter__() @@ -3058,9 +3058,9 @@ expr_constant(expr_ty e)         BLOCK     finally:         if an exception was raised: -	   exc = copy of (exception, instance, traceback) +       exc = copy of (exception, instance, traceback)         else: -	   exc = (None, None, None) +       exc = (None, None, None)         exit(*exc)   */  static int @@ -3073,7 +3073,7 @@ compiler_with(struct compiler *c, stmt_ty s)      block = compiler_new_block(c);      finally = compiler_new_block(c);      if (!block || !finally) -	return 0; +    return 0;      /* Evaluate EXPR */      VISIT(c, expr, s->v.With.context_expr); @@ -3082,15 +3082,15 @@ compiler_with(struct compiler *c, stmt_ty s)      /* SETUP_WITH pushes a finally block. */      compiler_use_next_block(c, block);      if (!compiler_push_fblock(c, FINALLY_TRY, block)) { -	return 0; +    return 0;      }      if (s->v.With.optional_vars) { -        VISIT(c, expr, s->v.With.optional_vars); +    VISIT(c, expr, s->v.With.optional_vars);      }      else { -        /* Discard result from context.__enter__() */ -        ADDOP(c, POP_TOP); +    /* Discard result from context.__enter__() */ +    ADDOP(c, POP_TOP);      }      /* BLOCK code */ @@ -3103,7 +3103,7 @@ compiler_with(struct compiler *c, stmt_ty s)      ADDOP_O(c, LOAD_CONST, Py_None, consts);      compiler_use_next_block(c, finally);      if (!compiler_push_fblock(c, FINALLY_END, finally)) -	return 0; +    return 0;      /* Finally block starts; context.__exit__ is on the stack under         the exception or return information. Just issue our magic @@ -3119,240 +3119,240 @@ compiler_with(struct compiler *c, stmt_ty s)  static int  compiler_visit_expr(struct compiler *c, expr_ty e)  { -	int i, n; - -	/* If expr e has a different line number than the last expr/stmt, -	   set a new line number for the next instruction. -	*/ -	if (e->lineno > c->u->u_lineno) { -		c->u->u_lineno = e->lineno; -		c->u->u_lineno_set = 0; -	} -	switch (e->kind) { -	case BoolOp_kind: -		return compiler_boolop(c, e); -	case BinOp_kind: -		VISIT(c, expr, e->v.BinOp.left); -		VISIT(c, expr, e->v.BinOp.right); -		ADDOP(c, binop(c, e->v.BinOp.op)); -		break; -	case UnaryOp_kind: -		VISIT(c, expr, e->v.UnaryOp.operand); -		ADDOP(c, unaryop(e->v.UnaryOp.op)); -		break; -	case Lambda_kind: -		return compiler_lambda(c, e); -	case IfExp_kind: -		return compiler_ifexp(c, e); -	case Dict_kind: -		n = asdl_seq_LEN(e->v.Dict.values); -		ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n)); -		for (i = 0; i < n; i++) { -			VISIT(c, expr,  -				(expr_ty)asdl_seq_GET(e->v.Dict.values, i)); -			VISIT(c, expr,  -				(expr_ty)asdl_seq_GET(e->v.Dict.keys, i)); -			ADDOP(c, STORE_MAP); -		} -		break; -	case Set_kind: -		n = asdl_seq_LEN(e->v.Set.elts); -		VISIT_SEQ(c, expr, e->v.Set.elts); -		ADDOP_I(c, BUILD_SET, n); -		break; -	case GeneratorExp_kind: -		return compiler_genexp(c, e); -	case ListComp_kind: -		return compiler_listcomp(c, e); -	case SetComp_kind: -		return compiler_setcomp(c, e); -	case DictComp_kind: -		return compiler_dictcomp(c, e); -	case Yield_kind: -		if (c->u->u_ste->ste_type != FunctionBlock) -			return compiler_error(c, "'yield' outside function"); -		if (e->v.Yield.value) { -			VISIT(c, expr, e->v.Yield.value); -		} -		else { -			ADDOP_O(c, LOAD_CONST, Py_None, consts); -		} -		ADDOP(c, YIELD_VALUE); -		break; -	case Compare_kind: -		return compiler_compare(c, e); -	case Call_kind: -		return compiler_call(c, e); -	case Num_kind: -		ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts); -		break; -	case Str_kind: -		ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts); -		break; -	case Bytes_kind: -		ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts); -		break; -	case Ellipsis_kind: -		ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); -		break; -	/* The following exprs can be assignment targets. */ -	case Attribute_kind: -		if (e->v.Attribute.ctx != AugStore) -			VISIT(c, expr, e->v.Attribute.value); -		switch (e->v.Attribute.ctx) { -		case AugLoad: -			ADDOP(c, DUP_TOP); -			/* Fall through to load */ -		case Load: -			ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); -			break; -		case AugStore: -			ADDOP(c, ROT_TWO); -			/* Fall through to save */ -		case Store: -			ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); -			break; -		case Del: -			ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names); -			break; -		case Param: -		default: -			PyErr_SetString(PyExc_SystemError, -					"param invalid in attribute expression"); -			return 0; -		} -		break; -	case Subscript_kind: -		switch (e->v.Subscript.ctx) { -		case AugLoad: -			VISIT(c, expr, e->v.Subscript.value); -			VISIT_SLICE(c, e->v.Subscript.slice, AugLoad); -			break; -		case Load: -			VISIT(c, expr, e->v.Subscript.value); -			VISIT_SLICE(c, e->v.Subscript.slice, Load); -			break; -		case AugStore: -			VISIT_SLICE(c, e->v.Subscript.slice, AugStore); -			break; -		case Store: -			VISIT(c, expr, e->v.Subscript.value); -			VISIT_SLICE(c, e->v.Subscript.slice, Store); -			break; -		case Del: -			VISIT(c, expr, e->v.Subscript.value); -			VISIT_SLICE(c, e->v.Subscript.slice, Del); -			break; -		case Param: -		default: -			PyErr_SetString(PyExc_SystemError, -				"param invalid in subscript expression"); -			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 */ -	case List_kind: -		return compiler_list(c, e); -	case Tuple_kind: -		return compiler_tuple(c, e); -	} -	return 1; +    int i, n; + +    /* If expr e has a different line number than the last expr/stmt, +       set a new line number for the next instruction. +    */ +    if (e->lineno > c->u->u_lineno) { +        c->u->u_lineno = e->lineno; +        c->u->u_lineno_set = 0; +    } +    switch (e->kind) { +    case BoolOp_kind: +        return compiler_boolop(c, e); +    case BinOp_kind: +        VISIT(c, expr, e->v.BinOp.left); +        VISIT(c, expr, e->v.BinOp.right); +        ADDOP(c, binop(c, e->v.BinOp.op)); +        break; +    case UnaryOp_kind: +        VISIT(c, expr, e->v.UnaryOp.operand); +        ADDOP(c, unaryop(e->v.UnaryOp.op)); +        break; +    case Lambda_kind: +        return compiler_lambda(c, e); +    case IfExp_kind: +        return compiler_ifexp(c, e); +    case Dict_kind: +        n = asdl_seq_LEN(e->v.Dict.values); +        ADDOP_I(c, BUILD_MAP, (n>0xFFFF ? 0xFFFF : n)); +        for (i = 0; i < n; i++) { +            VISIT(c, expr, +                (expr_ty)asdl_seq_GET(e->v.Dict.values, i)); +            VISIT(c, expr, +                (expr_ty)asdl_seq_GET(e->v.Dict.keys, i)); +            ADDOP(c, STORE_MAP); +        } +        break; +    case Set_kind: +        n = asdl_seq_LEN(e->v.Set.elts); +        VISIT_SEQ(c, expr, e->v.Set.elts); +        ADDOP_I(c, BUILD_SET, n); +        break; +    case GeneratorExp_kind: +        return compiler_genexp(c, e); +    case ListComp_kind: +        return compiler_listcomp(c, e); +    case SetComp_kind: +        return compiler_setcomp(c, e); +    case DictComp_kind: +        return compiler_dictcomp(c, e); +    case Yield_kind: +        if (c->u->u_ste->ste_type != FunctionBlock) +            return compiler_error(c, "'yield' outside function"); +        if (e->v.Yield.value) { +            VISIT(c, expr, e->v.Yield.value); +        } +        else { +            ADDOP_O(c, LOAD_CONST, Py_None, consts); +        } +        ADDOP(c, YIELD_VALUE); +        break; +    case Compare_kind: +        return compiler_compare(c, e); +    case Call_kind: +        return compiler_call(c, e); +    case Num_kind: +        ADDOP_O(c, LOAD_CONST, e->v.Num.n, consts); +        break; +    case Str_kind: +        ADDOP_O(c, LOAD_CONST, e->v.Str.s, consts); +        break; +    case Bytes_kind: +        ADDOP_O(c, LOAD_CONST, e->v.Bytes.s, consts); +        break; +    case Ellipsis_kind: +        ADDOP_O(c, LOAD_CONST, Py_Ellipsis, consts); +        break; +    /* The following exprs can be assignment targets. */ +    case Attribute_kind: +        if (e->v.Attribute.ctx != AugStore) +            VISIT(c, expr, e->v.Attribute.value); +        switch (e->v.Attribute.ctx) { +        case AugLoad: +            ADDOP(c, DUP_TOP); +            /* Fall through to load */ +        case Load: +            ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr, names); +            break; +        case AugStore: +            ADDOP(c, ROT_TWO); +            /* Fall through to save */ +        case Store: +            ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr, names); +            break; +        case Del: +            ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr, names); +            break; +        case Param: +        default: +            PyErr_SetString(PyExc_SystemError, +                            "param invalid in attribute expression"); +            return 0; +        } +        break; +    case Subscript_kind: +        switch (e->v.Subscript.ctx) { +        case AugLoad: +            VISIT(c, expr, e->v.Subscript.value); +            VISIT_SLICE(c, e->v.Subscript.slice, AugLoad); +            break; +        case Load: +            VISIT(c, expr, e->v.Subscript.value); +            VISIT_SLICE(c, e->v.Subscript.slice, Load); +            break; +        case AugStore: +            VISIT_SLICE(c, e->v.Subscript.slice, AugStore); +            break; +        case Store: +            VISIT(c, expr, e->v.Subscript.value); +            VISIT_SLICE(c, e->v.Subscript.slice, Store); +            break; +        case Del: +            VISIT(c, expr, e->v.Subscript.value); +            VISIT_SLICE(c, e->v.Subscript.slice, Del); +            break; +        case Param: +        default: +            PyErr_SetString(PyExc_SystemError, +                "param invalid in subscript expression"); +            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 */ +    case List_kind: +        return compiler_list(c, e); +    case Tuple_kind: +        return compiler_tuple(c, e); +    } +    return 1;  }  static int  compiler_augassign(struct compiler *c, stmt_ty s)  { -	expr_ty e = s->v.AugAssign.target; -	expr_ty auge; - -	assert(s->kind == AugAssign_kind); - -	switch (e->kind) { -	case Attribute_kind: -		auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, -				 AugLoad, e->lineno, e->col_offset, c->c_arena); -		if (auge == NULL) -		    return 0; -		VISIT(c, expr, auge); -		VISIT(c, expr, s->v.AugAssign.value); -		ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); -		auge->v.Attribute.ctx = AugStore; -		VISIT(c, expr, auge); -		break; -	case Subscript_kind: -		auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, -				 AugLoad, e->lineno, e->col_offset, c->c_arena); -		if (auge == NULL) -		    return 0; -		VISIT(c, expr, auge); -		VISIT(c, expr, s->v.AugAssign.value); -		ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); -		auge->v.Subscript.ctx = AugStore; -		VISIT(c, expr, auge); -		break; -	case Name_kind: -		if (!compiler_nameop(c, e->v.Name.id, Load)) -		    return 0; -		VISIT(c, expr, s->v.AugAssign.value); -		ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); -		return compiler_nameop(c, e->v.Name.id, Store); -	default: -		PyErr_Format(PyExc_SystemError,  -			"invalid node type (%d) for augmented assignment", -			e->kind); -		return 0; -	} -	return 1; +    expr_ty e = s->v.AugAssign.target; +    expr_ty auge; + +    assert(s->kind == AugAssign_kind); + +    switch (e->kind) { +    case Attribute_kind: +        auge = Attribute(e->v.Attribute.value, e->v.Attribute.attr, +                         AugLoad, e->lineno, e->col_offset, c->c_arena); +        if (auge == NULL) +            return 0; +        VISIT(c, expr, auge); +        VISIT(c, expr, s->v.AugAssign.value); +        ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); +        auge->v.Attribute.ctx = AugStore; +        VISIT(c, expr, auge); +        break; +    case Subscript_kind: +        auge = Subscript(e->v.Subscript.value, e->v.Subscript.slice, +                         AugLoad, e->lineno, e->col_offset, c->c_arena); +        if (auge == NULL) +            return 0; +        VISIT(c, expr, auge); +        VISIT(c, expr, s->v.AugAssign.value); +        ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); +        auge->v.Subscript.ctx = AugStore; +        VISIT(c, expr, auge); +        break; +    case Name_kind: +        if (!compiler_nameop(c, e->v.Name.id, Load)) +            return 0; +        VISIT(c, expr, s->v.AugAssign.value); +        ADDOP(c, inplace_binop(c, s->v.AugAssign.op)); +        return compiler_nameop(c, e->v.Name.id, Store); +    default: +        PyErr_Format(PyExc_SystemError, +            "invalid node type (%d) for augmented assignment", +            e->kind); +        return 0; +    } +    return 1;  }  static int  compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b)  { -	struct fblockinfo *f; -	if (c->u->u_nfblocks >= CO_MAXBLOCKS) { -		PyErr_SetString(PyExc_SystemError, -				"too many statically nested blocks"); -		return 0; -	} -	f = &c->u->u_fblock[c->u->u_nfblocks++]; -	f->fb_type = t; -	f->fb_block = b; -	return 1; +    struct fblockinfo *f; +    if (c->u->u_nfblocks >= CO_MAXBLOCKS) { +        PyErr_SetString(PyExc_SystemError, +                        "too many statically nested blocks"); +        return 0; +    } +    f = &c->u->u_fblock[c->u->u_nfblocks++]; +    f->fb_type = t; +    f->fb_block = b; +    return 1;  }  static void  compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b)  { -	struct compiler_unit *u = c->u; -	assert(u->u_nfblocks > 0); -	u->u_nfblocks--; -	assert(u->u_fblock[u->u_nfblocks].fb_type == t); -	assert(u->u_fblock[u->u_nfblocks].fb_block == b); +    struct compiler_unit *u = c->u; +    assert(u->u_nfblocks > 0); +    u->u_nfblocks--; +    assert(u->u_fblock[u->u_nfblocks].fb_type == t); +    assert(u->u_fblock[u->u_nfblocks].fb_block == b);  }  static int  compiler_in_loop(struct compiler *c) { -	int i; -	struct compiler_unit *u = c->u; -	for (i = 0; i < u->u_nfblocks; ++i) { -		if (u->u_fblock[i].fb_type == LOOP) -			return 1; -	} -	return 0; +    int i; +    struct compiler_unit *u = c->u; +    for (i = 0; i < u->u_nfblocks; ++i) { +        if (u->u_fblock[i].fb_type == LOOP) +            return 1; +    } +    return 0;  }  /* Raises a SyntaxError and returns 0.     If something goes wrong, a different exception may be raised. @@ -3361,143 +3361,143 @@ compiler_in_loop(struct compiler *c) {  static int  compiler_error(struct compiler *c, const char *errstr)  { -	PyObject *loc; -	PyObject *u = NULL, *v = NULL; - -	loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno); -	if (!loc) { -		Py_INCREF(Py_None); -		loc = Py_None; -	} -	u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno, -			  Py_None, loc); -	if (!u) -		goto exit; -	v = Py_BuildValue("(zO)", errstr, u); -	if (!v) -		goto exit; -	PyErr_SetObject(PyExc_SyntaxError, v); +    PyObject *loc; +    PyObject *u = NULL, *v = NULL; + +    loc = PyErr_ProgramText(c->c_filename, c->u->u_lineno); +    if (!loc) { +        Py_INCREF(Py_None); +        loc = Py_None; +    } +    u = Py_BuildValue("(ziOO)", c->c_filename, c->u->u_lineno, +                      Py_None, loc); +    if (!u) +        goto exit; +    v = Py_BuildValue("(zO)", errstr, u); +    if (!v) +        goto exit; +    PyErr_SetObject(PyExc_SyntaxError, v);   exit: -	Py_DECREF(loc); -	Py_XDECREF(u); -	Py_XDECREF(v); -	return 0; -} - -static int -compiler_handle_subscr(struct compiler *c, const char *kind,  -		       expr_context_ty ctx)  -{ -	int op = 0; - -	/* XXX this code is duplicated */ -	switch (ctx) { -		case AugLoad: /* fall through to Load */ -		case Load:    op = BINARY_SUBSCR; break; -		case AugStore:/* fall through to Store */ -		case Store:   op = STORE_SUBSCR; break; -		case Del:     op = DELETE_SUBSCR; break; -		case Param: -			PyErr_Format(PyExc_SystemError,  -				     "invalid %s kind %d in subscript\n",  -				     kind, ctx); -			return 0; -	} -	if (ctx == AugLoad) { -		ADDOP_I(c, DUP_TOPX, 2); -	} -	else if (ctx == AugStore) { -		ADDOP(c, ROT_THREE); -	} -	ADDOP(c, op); -	return 1; +    Py_DECREF(loc); +    Py_XDECREF(u); +    Py_XDECREF(v); +    return 0; +} + +static int +compiler_handle_subscr(struct compiler *c, const char *kind, +                       expr_context_ty ctx) +{ +    int op = 0; + +    /* XXX this code is duplicated */ +    switch (ctx) { +        case AugLoad: /* fall through to Load */ +        case Load:    op = BINARY_SUBSCR; break; +        case AugStore:/* fall through to Store */ +        case Store:   op = STORE_SUBSCR; break; +        case Del:     op = DELETE_SUBSCR; break; +        case Param: +            PyErr_Format(PyExc_SystemError, +                         "invalid %s kind %d in subscript\n", +                         kind, ctx); +            return 0; +    } +    if (ctx == AugLoad) { +        ADDOP_I(c, DUP_TOPX, 2); +    } +    else if (ctx == AugStore) { +        ADDOP(c, ROT_THREE); +    } +    ADDOP(c, op); +    return 1;  }  static int  compiler_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)  { -	int n = 2; -	assert(s->kind == Slice_kind); - -	/* only handles the cases where BUILD_SLICE is emitted */ -	if (s->v.Slice.lower) { -		VISIT(c, expr, s->v.Slice.lower); -	} -	else { -		ADDOP_O(c, LOAD_CONST, Py_None, consts); -	} -		 -	if (s->v.Slice.upper) { -		VISIT(c, expr, s->v.Slice.upper); -	} -	else { -		ADDOP_O(c, LOAD_CONST, Py_None, consts); -	} - -	if (s->v.Slice.step) { -		n++; -		VISIT(c, expr, s->v.Slice.step); -	} -	ADDOP_I(c, BUILD_SLICE, n); -	return 1; -} - -static int -compiler_visit_nested_slice(struct compiler *c, slice_ty s,  -			    expr_context_ty ctx) -{ -	switch (s->kind) { -	case Slice_kind: -		return compiler_slice(c, s, ctx); -	case Index_kind: -		VISIT(c, expr, s->v.Index.value); -		break; -	case ExtSlice_kind: -	default: -		PyErr_SetString(PyExc_SystemError, -				"extended slice invalid in nested slice"); -		return 0; -	} -	return 1; +    int n = 2; +    assert(s->kind == Slice_kind); + +    /* only handles the cases where BUILD_SLICE is emitted */ +    if (s->v.Slice.lower) { +        VISIT(c, expr, s->v.Slice.lower); +    } +    else { +        ADDOP_O(c, LOAD_CONST, Py_None, consts); +    } + +    if (s->v.Slice.upper) { +        VISIT(c, expr, s->v.Slice.upper); +    } +    else { +        ADDOP_O(c, LOAD_CONST, Py_None, consts); +    } + +    if (s->v.Slice.step) { +        n++; +        VISIT(c, expr, s->v.Slice.step); +    } +    ADDOP_I(c, BUILD_SLICE, n); +    return 1; +} + +static int +compiler_visit_nested_slice(struct compiler *c, slice_ty s, +                            expr_context_ty ctx) +{ +    switch (s->kind) { +    case Slice_kind: +        return compiler_slice(c, s, ctx); +    case Index_kind: +        VISIT(c, expr, s->v.Index.value); +        break; +    case ExtSlice_kind: +    default: +        PyErr_SetString(PyExc_SystemError, +                        "extended slice invalid in nested slice"); +        return 0; +    } +    return 1;  }  static int  compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)  { -	char * kindname = NULL; -	switch (s->kind) { -	case Index_kind: -		kindname = "index"; -		if (ctx != AugStore) { -			VISIT(c, expr, s->v.Index.value); -		} -		break; -	case Slice_kind: -		kindname = "slice"; -		if (ctx != AugStore) { -			if (!compiler_slice(c, s, ctx)) -				return 0; -		} -		break; -	case ExtSlice_kind: -		kindname = "extended slice"; -		if (ctx != AugStore) { -			int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); -			for (i = 0; i < n; i++) { -				slice_ty sub = (slice_ty)asdl_seq_GET( -					s->v.ExtSlice.dims, i); -				if (!compiler_visit_nested_slice(c, sub, ctx)) -					return 0; -			} -			ADDOP_I(c, BUILD_TUPLE, n); -		} -		break; -	default: -		PyErr_Format(PyExc_SystemError, -			     "invalid subscript kind %d", s->kind); -		return 0; -	} -	return compiler_handle_subscr(c, kindname, ctx); +    char * kindname = NULL; +    switch (s->kind) { +    case Index_kind: +        kindname = "index"; +        if (ctx != AugStore) { +            VISIT(c, expr, s->v.Index.value); +        } +        break; +    case Slice_kind: +        kindname = "slice"; +        if (ctx != AugStore) { +            if (!compiler_slice(c, s, ctx)) +                return 0; +        } +        break; +    case ExtSlice_kind: +        kindname = "extended slice"; +        if (ctx != AugStore) { +            int i, n = asdl_seq_LEN(s->v.ExtSlice.dims); +            for (i = 0; i < n; i++) { +                slice_ty sub = (slice_ty)asdl_seq_GET( +                    s->v.ExtSlice.dims, i); +                if (!compiler_visit_nested_slice(c, sub, ctx)) +                    return 0; +            } +            ADDOP_I(c, BUILD_TUPLE, n); +        } +        break; +    default: +        PyErr_Format(PyExc_SystemError, +                     "invalid subscript kind %d", s->kind); +        return 0; +    } +    return compiler_handle_subscr(c, kindname, ctx);  }  /* End of the compiler section, beginning of the assembler section */ @@ -3509,73 +3509,73 @@ compiler_visit_slice(struct compiler *c, slice_ty s, expr_context_ty ctx)  */  struct assembler { -	PyObject *a_bytecode;  /* string containing bytecode */ -	int a_offset;	       /* offset into bytecode */ -	int a_nblocks;	       /* number of reachable blocks */ -	basicblock **a_postorder; /* list of blocks in dfs postorder */ -	PyObject *a_lnotab;    /* string containing lnotab */ -	int a_lnotab_off;      /* offset into lnotab */ -	int a_lineno;	       /* last lineno of emitted instruction */ -	int a_lineno_off;      /* bytecode offset of last lineno */ +    PyObject *a_bytecode;  /* string containing bytecode */ +    int a_offset;              /* offset into bytecode */ +    int a_nblocks;             /* number of reachable blocks */ +    basicblock **a_postorder; /* list of blocks in dfs postorder */ +    PyObject *a_lnotab;    /* string containing lnotab */ +    int a_lnotab_off;      /* offset into lnotab */ +    int a_lineno;              /* last lineno of emitted instruction */ +    int a_lineno_off;      /* bytecode offset of last lineno */  };  static void  dfs(struct compiler *c, basicblock *b, struct assembler *a)  { -	int i; -	struct instr *instr = NULL; - -	if (b->b_seen) -		return; -	b->b_seen = 1; -	if (b->b_next != NULL) -		dfs(c, b->b_next, a); -	for (i = 0; i < b->b_iused; i++) { -		instr = &b->b_instr[i]; -		if (instr->i_jrel || instr->i_jabs) -			dfs(c, instr->i_target, a); -	} -	a->a_postorder[a->a_nblocks++] = b; +    int i; +    struct instr *instr = NULL; + +    if (b->b_seen) +        return; +    b->b_seen = 1; +    if (b->b_next != NULL) +        dfs(c, b->b_next, a); +    for (i = 0; i < b->b_iused; i++) { +        instr = &b->b_instr[i]; +        if (instr->i_jrel || instr->i_jabs) +            dfs(c, instr->i_target, a); +    } +    a->a_postorder[a->a_nblocks++] = b;  }  static int  stackdepth_walk(struct compiler *c, basicblock *b, int depth, int maxdepth)  { -	int i, target_depth; -	struct instr *instr; -	if (b->b_seen || b->b_startdepth >= depth) -		return maxdepth; -	b->b_seen = 1; -	b->b_startdepth = depth; -	for (i = 0; i < b->b_iused; i++) { -		instr = &b->b_instr[i]; -		depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg); -		if (depth > maxdepth) -			maxdepth = depth; -		assert(depth >= 0); /* invalid code or bug in stackdepth() */ -		if (instr->i_jrel || instr->i_jabs) { -			target_depth = depth; -			if (instr->i_opcode == FOR_ITER) { -				target_depth = depth-2; -			} else if (instr->i_opcode == SETUP_FINALLY || -				   instr->i_opcode == SETUP_EXCEPT) { -				target_depth = depth+3; -				if (target_depth > maxdepth) -					maxdepth = target_depth; -			} -			maxdepth = stackdepth_walk(c, instr->i_target, -						   target_depth, maxdepth); -			if (instr->i_opcode == JUMP_ABSOLUTE || -			    instr->i_opcode == JUMP_FORWARD) { -				goto out; /* remaining code is dead */ -			} -		} -	} -	if (b->b_next) -		maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth); +    int i, target_depth; +    struct instr *instr; +    if (b->b_seen || b->b_startdepth >= depth) +        return maxdepth; +    b->b_seen = 1; +    b->b_startdepth = depth; +    for (i = 0; i < b->b_iused; i++) { +        instr = &b->b_instr[i]; +        depth += opcode_stack_effect(instr->i_opcode, instr->i_oparg); +        if (depth > maxdepth) +            maxdepth = depth; +        assert(depth >= 0); /* invalid code or bug in stackdepth() */ +        if (instr->i_jrel || instr->i_jabs) { +            target_depth = depth; +            if (instr->i_opcode == FOR_ITER) { +                target_depth = depth-2; +            } else if (instr->i_opcode == SETUP_FINALLY || +                       instr->i_opcode == SETUP_EXCEPT) { +                target_depth = depth+3; +                if (target_depth > maxdepth) +                    maxdepth = target_depth; +            } +            maxdepth = stackdepth_walk(c, instr->i_target, +                                       target_depth, maxdepth); +            if (instr->i_opcode == JUMP_ABSOLUTE || +                instr->i_opcode == JUMP_FORWARD) { +                goto out; /* remaining code is dead */ +            } +        } +    } +    if (b->b_next) +        maxdepth = stackdepth_walk(c, b->b_next, depth, maxdepth);  out: -	b->b_seen = 0; -	return maxdepth; +    b->b_seen = 0; +    return maxdepth;  }  /* Find the flow path that needs the largest stack.  We assume that @@ -3584,49 +3584,49 @@ out:  static int  stackdepth(struct compiler *c)  { -	basicblock *b, *entryblock; -	entryblock = NULL; -	for (b = c->u->u_blocks; b != NULL; b = b->b_list) { -		b->b_seen = 0; -		b->b_startdepth = INT_MIN; -		entryblock = b; -	} -	if (!entryblock) -		return 0; -	return stackdepth_walk(c, entryblock, 0, 0); +    basicblock *b, *entryblock; +    entryblock = NULL; +    for (b = c->u->u_blocks; b != NULL; b = b->b_list) { +        b->b_seen = 0; +        b->b_startdepth = INT_MIN; +        entryblock = b; +    } +    if (!entryblock) +        return 0; +    return stackdepth_walk(c, entryblock, 0, 0);  }  static int  assemble_init(struct assembler *a, int nblocks, int firstlineno)  { -	memset(a, 0, sizeof(struct assembler)); -	a->a_lineno = firstlineno; -	a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); -	if (!a->a_bytecode) -		return 0; -	a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); -	if (!a->a_lnotab) -		return 0; -	if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) { -		PyErr_NoMemory(); -		return 0; -	} -	a->a_postorder = (basicblock **)PyObject_Malloc( -					    sizeof(basicblock *) * nblocks); -	if (!a->a_postorder) { -		PyErr_NoMemory(); -		return 0; -	} -	return 1; +    memset(a, 0, sizeof(struct assembler)); +    a->a_lineno = firstlineno; +    a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE); +    if (!a->a_bytecode) +        return 0; +    a->a_lnotab = PyBytes_FromStringAndSize(NULL, DEFAULT_LNOTAB_SIZE); +    if (!a->a_lnotab) +        return 0; +    if (nblocks > PY_SIZE_MAX / sizeof(basicblock *)) { +        PyErr_NoMemory(); +        return 0; +    } +    a->a_postorder = (basicblock **)PyObject_Malloc( +                                        sizeof(basicblock *) * nblocks); +    if (!a->a_postorder) { +        PyErr_NoMemory(); +        return 0; +    } +    return 1;  }  static void  assemble_free(struct assembler *a)  { -	Py_XDECREF(a->a_bytecode); -	Py_XDECREF(a->a_lnotab); -	if (a->a_postorder) -		PyObject_Free(a->a_postorder); +    Py_XDECREF(a->a_bytecode); +    Py_XDECREF(a->a_lnotab); +    if (a->a_postorder) +        PyObject_Free(a->a_postorder);  }  /* Return the size of a basic block in bytes. */ @@ -3634,22 +3634,22 @@ assemble_free(struct assembler *a)  static int  instrsize(struct instr *instr)  { -	if (!instr->i_hasarg) -		return 1;	/* 1 byte for the opcode*/ -	if (instr->i_oparg > 0xffff) -		return 6;	/* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */ -	return 3; 		/* 1 (opcode) + 2 (oparg) */ +    if (!instr->i_hasarg) +        return 1;               /* 1 byte for the opcode*/ +    if (instr->i_oparg > 0xffff) +        return 6;               /* 1 (opcode) + 1 (EXTENDED_ARG opcode) + 2 (oparg) + 2(oparg extended) */ +    return 3;                   /* 1 (opcode) + 2 (oparg) */  }  static int  blocksize(basicblock *b)  { -	int i; -	int size = 0; +    int i; +    int size = 0; -	for (i = 0; i < b->b_iused; i++) -		size += instrsize(&b->b_instr[i]); -	return size; +    for (i = 0; i < b->b_iused; i++) +        size += instrsize(&b->b_instr[i]); +    return size;  }  /* Appends a pair to the end of the line number table, a_lnotab, representing @@ -3659,94 +3659,94 @@ blocksize(basicblock *b)  static int  assemble_lnotab(struct assembler *a, struct instr *i)  { -	int d_bytecode, d_lineno; -	int len; -	unsigned char *lnotab; - -	d_bytecode = a->a_offset - a->a_lineno_off; -	d_lineno = i->i_lineno - a->a_lineno; - -	assert(d_bytecode >= 0); -	assert(d_lineno >= 0); - -	if(d_bytecode == 0 && d_lineno == 0) -		return 1; - -	if (d_bytecode > 255) { -		int j, nbytes, ncodes = d_bytecode / 255; -		nbytes = a->a_lnotab_off + 2 * ncodes; -		len = PyBytes_GET_SIZE(a->a_lnotab); -		if (nbytes >= len) { -			if ((len <= INT_MAX / 2) && (len * 2 < nbytes)) -				len = nbytes; -			else if (len <= INT_MAX / 2) -				len *= 2; -			else { -				PyErr_NoMemory(); -				return 0; -			} -			if (_PyBytes_Resize(&a->a_lnotab, len) < 0) -				return 0; -		} -		lnotab = (unsigned char *) -			   PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; -		for (j = 0; j < ncodes; j++) { -			*lnotab++ = 255; -			*lnotab++ = 0; -		} -		d_bytecode -= ncodes * 255; -		a->a_lnotab_off += ncodes * 2; -	} -	assert(d_bytecode <= 255); -	if (d_lineno > 255) { -		int j, nbytes, ncodes = d_lineno / 255; -		nbytes = a->a_lnotab_off + 2 * ncodes; -		len = PyBytes_GET_SIZE(a->a_lnotab); -		if (nbytes >= len) { -			if ((len <= INT_MAX / 2) && len * 2 < nbytes) -				len = nbytes; -			else if (len <= INT_MAX / 2) -				len *= 2; -			else { -				PyErr_NoMemory(); -				return 0; -			} -			if (_PyBytes_Resize(&a->a_lnotab, len) < 0) -				return 0; -		} -		lnotab = (unsigned char *) -			   PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; -		*lnotab++ = d_bytecode; -		*lnotab++ = 255; -		d_bytecode = 0; -		for (j = 1; j < ncodes; j++) { -			*lnotab++ = 0; -			*lnotab++ = 255; -		} -		d_lineno -= ncodes * 255; -		a->a_lnotab_off += ncodes * 2; -	} - -	len = PyBytes_GET_SIZE(a->a_lnotab); -	if (a->a_lnotab_off + 2 >= len) { -		if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0) -			return 0; -	} -	lnotab = (unsigned char *) -			PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; - -	a->a_lnotab_off += 2; -	if (d_bytecode) { -		*lnotab++ = d_bytecode; -		*lnotab++ = d_lineno; -	} -	else {	/* First line of a block; def stmt, etc. */ -		*lnotab++ = 0; -		*lnotab++ = d_lineno; -	} -	a->a_lineno = i->i_lineno; -	a->a_lineno_off = a->a_offset; -	return 1; +    int d_bytecode, d_lineno; +    int len; +    unsigned char *lnotab; + +    d_bytecode = a->a_offset - a->a_lineno_off; +    d_lineno = i->i_lineno - a->a_lineno; + +    assert(d_bytecode >= 0); +    assert(d_lineno >= 0); + +    if(d_bytecode == 0 && d_lineno == 0) +        return 1; + +    if (d_bytecode > 255) { +        int j, nbytes, ncodes = d_bytecode / 255; +        nbytes = a->a_lnotab_off + 2 * ncodes; +        len = PyBytes_GET_SIZE(a->a_lnotab); +        if (nbytes >= len) { +            if ((len <= INT_MAX / 2) && (len * 2 < nbytes)) +                len = nbytes; +            else if (len <= INT_MAX / 2) +                len *= 2; +            else { +                PyErr_NoMemory(); +                return 0; +            } +            if (_PyBytes_Resize(&a->a_lnotab, len) < 0) +                return 0; +        } +        lnotab = (unsigned char *) +                   PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; +        for (j = 0; j < ncodes; j++) { +            *lnotab++ = 255; +            *lnotab++ = 0; +        } +        d_bytecode -= ncodes * 255; +        a->a_lnotab_off += ncodes * 2; +    } +    assert(d_bytecode <= 255); +    if (d_lineno > 255) { +        int j, nbytes, ncodes = d_lineno / 255; +        nbytes = a->a_lnotab_off + 2 * ncodes; +        len = PyBytes_GET_SIZE(a->a_lnotab); +        if (nbytes >= len) { +            if ((len <= INT_MAX / 2) && len * 2 < nbytes) +                len = nbytes; +            else if (len <= INT_MAX / 2) +                len *= 2; +            else { +                PyErr_NoMemory(); +                return 0; +            } +            if (_PyBytes_Resize(&a->a_lnotab, len) < 0) +                return 0; +        } +        lnotab = (unsigned char *) +                   PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; +        *lnotab++ = d_bytecode; +        *lnotab++ = 255; +        d_bytecode = 0; +        for (j = 1; j < ncodes; j++) { +            *lnotab++ = 0; +            *lnotab++ = 255; +        } +        d_lineno -= ncodes * 255; +        a->a_lnotab_off += ncodes * 2; +    } + +    len = PyBytes_GET_SIZE(a->a_lnotab); +    if (a->a_lnotab_off + 2 >= len) { +        if (_PyBytes_Resize(&a->a_lnotab, len * 2) < 0) +            return 0; +    } +    lnotab = (unsigned char *) +                    PyBytes_AS_STRING(a->a_lnotab) + a->a_lnotab_off; + +    a->a_lnotab_off += 2; +    if (d_bytecode) { +        *lnotab++ = d_bytecode; +        *lnotab++ = d_lineno; +    } +    else {      /* First line of a block; def stmt, etc. */ +        *lnotab++ = 0; +        *lnotab++ = d_lineno; +    } +    a->a_lineno = i->i_lineno; +    a->a_lineno_off = a->a_offset; +    return 1;  }  /* assemble_emit() @@ -3757,227 +3757,227 @@ assemble_lnotab(struct assembler *a, struct instr *i)  static int  assemble_emit(struct assembler *a, struct instr *i)  { -	int size, arg = 0, ext = 0; -	Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode); -	char *code; - -	size = instrsize(i); -	if (i->i_hasarg) { -		arg = i->i_oparg; -		ext = arg >> 16; -	} -	if (i->i_lineno && !assemble_lnotab(a, i)) -		return 0; -	if (a->a_offset + size >= len) { -		if (len > PY_SSIZE_T_MAX / 2) -			return 0; -		if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0) -		    return 0; -	} -	code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset; -	a->a_offset += size; -	if (size == 6) { -		assert(i->i_hasarg); -		*code++ = (char)EXTENDED_ARG; -		*code++ = ext & 0xff; -		*code++ = ext >> 8; -		arg &= 0xffff; -	} -	*code++ = i->i_opcode; -	if (i->i_hasarg) { -		assert(size == 3 || size == 6); -		*code++ = arg & 0xff; -		*code++ = arg >> 8; -	} -	return 1; +    int size, arg = 0, ext = 0; +    Py_ssize_t len = PyBytes_GET_SIZE(a->a_bytecode); +    char *code; + +    size = instrsize(i); +    if (i->i_hasarg) { +        arg = i->i_oparg; +        ext = arg >> 16; +    } +    if (i->i_lineno && !assemble_lnotab(a, i)) +        return 0; +    if (a->a_offset + size >= len) { +        if (len > PY_SSIZE_T_MAX / 2) +            return 0; +        if (_PyBytes_Resize(&a->a_bytecode, len * 2) < 0) +            return 0; +    } +    code = PyBytes_AS_STRING(a->a_bytecode) + a->a_offset; +    a->a_offset += size; +    if (size == 6) { +        assert(i->i_hasarg); +        *code++ = (char)EXTENDED_ARG; +        *code++ = ext & 0xff; +        *code++ = ext >> 8; +        arg &= 0xffff; +    } +    *code++ = i->i_opcode; +    if (i->i_hasarg) { +        assert(size == 3 || size == 6); +        *code++ = arg & 0xff; +        *code++ = arg >> 8; +    } +    return 1;  }  static void  assemble_jump_offsets(struct assembler *a, struct compiler *c)  { -	basicblock *b; -	int bsize, totsize, extended_arg_count = 0, last_extended_arg_count; -	int i; - -	/* Compute the size of each block and fixup jump args. -	   Replace block pointer with position in bytecode. */ -	do { -		totsize = 0; -		for (i = a->a_nblocks - 1; i >= 0; i--) { -			b = a->a_postorder[i]; -			bsize = blocksize(b); -			b->b_offset = totsize; -			totsize += bsize; -		} -		last_extended_arg_count = extended_arg_count; -		extended_arg_count = 0; -		for (b = c->u->u_blocks; b != NULL; b = b->b_list) { -			bsize = b->b_offset; -			for (i = 0; i < b->b_iused; i++) { -				struct instr *instr = &b->b_instr[i]; -				/* Relative jumps are computed relative to -				   the instruction pointer after fetching -				   the jump instruction. -				*/ -				bsize += instrsize(instr); -				if (instr->i_jabs) -					instr->i_oparg = instr->i_target->b_offset; -				else if (instr->i_jrel) { -					int delta = instr->i_target->b_offset - bsize; -					instr->i_oparg = delta; -				} -				else -					continue; -				if (instr->i_oparg > 0xffff) -					extended_arg_count++; -			} -		} - -	/* XXX: This is an awful hack that could hurt performance, but -		on the bright side it should work until we come up -		with a better solution. - -		The issue is that in the first loop blocksize() is called -		which calls instrsize() which requires i_oparg be set -		appropriately.	There is a bootstrap problem because -		i_oparg is calculated in the second loop above. - -		So we loop until we stop seeing new EXTENDED_ARGs. -		The only EXTENDED_ARGs that could be popping up are -		ones in jump instructions.  So this should converge -		fairly quickly. -	*/ -	} while (last_extended_arg_count != extended_arg_count); +    basicblock *b; +    int bsize, totsize, extended_arg_count = 0, last_extended_arg_count; +    int i; + +    /* Compute the size of each block and fixup jump args. +       Replace block pointer with position in bytecode. */ +    do { +        totsize = 0; +        for (i = a->a_nblocks - 1; i >= 0; i--) { +            b = a->a_postorder[i]; +            bsize = blocksize(b); +            b->b_offset = totsize; +            totsize += bsize; +        } +        last_extended_arg_count = extended_arg_count; +        extended_arg_count = 0; +        for (b = c->u->u_blocks; b != NULL; b = b->b_list) { +            bsize = b->b_offset; +            for (i = 0; i < b->b_iused; i++) { +                struct instr *instr = &b->b_instr[i]; +                /* Relative jumps are computed relative to +                   the instruction pointer after fetching +                   the jump instruction. +                */ +                bsize += instrsize(instr); +                if (instr->i_jabs) +                    instr->i_oparg = instr->i_target->b_offset; +                else if (instr->i_jrel) { +                    int delta = instr->i_target->b_offset - bsize; +                    instr->i_oparg = delta; +                } +                else +                    continue; +                if (instr->i_oparg > 0xffff) +                    extended_arg_count++; +            } +        } + +    /* XXX: This is an awful hack that could hurt performance, but +        on the bright side it should work until we come up +        with a better solution. + +        The issue is that in the first loop blocksize() is called +        which calls instrsize() which requires i_oparg be set +        appropriately.          There is a bootstrap problem because +        i_oparg is calculated in the second loop above. + +        So we loop until we stop seeing new EXTENDED_ARGs. +        The only EXTENDED_ARGs that could be popping up are +        ones in jump instructions.  So this should converge +        fairly quickly. +    */ +    } while (last_extended_arg_count != extended_arg_count);  }  static PyObject *  dict_keys_inorder(PyObject *dict, int offset)  { -	PyObject *tuple, *k, *v; -	Py_ssize_t i, pos = 0, size = PyDict_Size(dict); - -	tuple = PyTuple_New(size); -	if (tuple == NULL) -		return NULL; -	while (PyDict_Next(dict, &pos, &k, &v)) { -		i = PyLong_AS_LONG(v); -		/* The keys of the dictionary are tuples. (see compiler_add_o) -		   The object we want is always first, though. */ -		k = PyTuple_GET_ITEM(k, 0); -		Py_INCREF(k); -		assert((i - offset) < size); -		assert((i - offset) >= 0); -		PyTuple_SET_ITEM(tuple, i - offset, k); -	} -	return tuple; +    PyObject *tuple, *k, *v; +    Py_ssize_t i, pos = 0, size = PyDict_Size(dict); + +    tuple = PyTuple_New(size); +    if (tuple == NULL) +        return NULL; +    while (PyDict_Next(dict, &pos, &k, &v)) { +        i = PyLong_AS_LONG(v); +        /* The keys of the dictionary are tuples. (see compiler_add_o) +           The object we want is always first, though. */ +        k = PyTuple_GET_ITEM(k, 0); +        Py_INCREF(k); +        assert((i - offset) < size); +        assert((i - offset) >= 0); +        PyTuple_SET_ITEM(tuple, i - offset, k); +    } +    return tuple;  }  static int  compute_code_flags(struct compiler *c)  { -	PySTEntryObject *ste = c->u->u_ste; -	int flags = 0, n; -	if (ste->ste_type != ModuleBlock) -		flags |= CO_NEWLOCALS; -	if (ste->ste_type == FunctionBlock) { -		if (!ste->ste_unoptimized) -			flags |= CO_OPTIMIZED; -		if (ste->ste_nested) -			flags |= CO_NESTED; -		if (ste->ste_generator) -			flags |= CO_GENERATOR; -		if (ste->ste_varargs) -			flags |= CO_VARARGS; -		if (ste->ste_varkeywords) -			flags |= CO_VARKEYWORDS; -	} - -	/* (Only) inherit compilerflags in PyCF_MASK */ -	flags |= (c->c_flags->cf_flags & PyCF_MASK); - -	n = PyDict_Size(c->u->u_freevars); -	if (n < 0) -	    return -1; -	if (n == 0) { -	    n = PyDict_Size(c->u->u_cellvars); -	    if (n < 0) -		return -1; -	    if (n == 0) { -		flags |= CO_NOFREE; -	    } -	} - -	return flags; +    PySTEntryObject *ste = c->u->u_ste; +    int flags = 0, n; +    if (ste->ste_type != ModuleBlock) +        flags |= CO_NEWLOCALS; +    if (ste->ste_type == FunctionBlock) { +        if (!ste->ste_unoptimized) +            flags |= CO_OPTIMIZED; +        if (ste->ste_nested) +            flags |= CO_NESTED; +        if (ste->ste_generator) +            flags |= CO_GENERATOR; +        if (ste->ste_varargs) +            flags |= CO_VARARGS; +        if (ste->ste_varkeywords) +            flags |= CO_VARKEYWORDS; +    } + +    /* (Only) inherit compilerflags in PyCF_MASK */ +    flags |= (c->c_flags->cf_flags & PyCF_MASK); + +    n = PyDict_Size(c->u->u_freevars); +    if (n < 0) +        return -1; +    if (n == 0) { +        n = PyDict_Size(c->u->u_cellvars); +        if (n < 0) +        return -1; +        if (n == 0) { +        flags |= CO_NOFREE; +        } +    } + +    return flags;  }  static PyCodeObject *  makecode(struct compiler *c, struct assembler *a)  { -	PyObject *tmp; -	PyCodeObject *co = NULL; -	PyObject *consts = NULL; -	PyObject *names = NULL; -	PyObject *varnames = NULL; -	PyObject *filename = NULL; -	PyObject *name = NULL; -	PyObject *freevars = NULL; -	PyObject *cellvars = NULL; -	PyObject *bytecode = NULL; -	int nlocals, flags; - -	tmp = dict_keys_inorder(c->u->u_consts, 0); -	if (!tmp) -		goto error; -	consts = PySequence_List(tmp); /* optimize_code requires a list */ -	Py_DECREF(tmp); - -	names = dict_keys_inorder(c->u->u_names, 0); -	varnames = dict_keys_inorder(c->u->u_varnames, 0); -	if (!consts || !names || !varnames) -		goto error; -       -	cellvars = dict_keys_inorder(c->u->u_cellvars, 0); -	if (!cellvars) -	    goto error; -	freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); -	if (!freevars) -	    goto error; -	filename = PyUnicode_DecodeFSDefault(c->c_filename); -	if (!filename) -		goto error; - -	nlocals = PyDict_Size(c->u->u_varnames); -	flags = compute_code_flags(c); -	if (flags < 0) -		goto error; - -	bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab); -	if (!bytecode) -		goto error; - -	tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */ -	if (!tmp) -		goto error; -	Py_DECREF(consts); -	consts = tmp; - -	co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount, -			nlocals, stackdepth(c), flags, -			bytecode, consts, names, varnames, -			freevars, cellvars, -			filename, c->u->u_name, -			c->u->u_firstlineno, -			a->a_lnotab); +    PyObject *tmp; +    PyCodeObject *co = NULL; +    PyObject *consts = NULL; +    PyObject *names = NULL; +    PyObject *varnames = NULL; +    PyObject *filename = NULL; +    PyObject *name = NULL; +    PyObject *freevars = NULL; +    PyObject *cellvars = NULL; +    PyObject *bytecode = NULL; +    int nlocals, flags; + +    tmp = dict_keys_inorder(c->u->u_consts, 0); +    if (!tmp) +        goto error; +    consts = PySequence_List(tmp); /* optimize_code requires a list */ +    Py_DECREF(tmp); + +    names = dict_keys_inorder(c->u->u_names, 0); +    varnames = dict_keys_inorder(c->u->u_varnames, 0); +    if (!consts || !names || !varnames) +        goto error; + +    cellvars = dict_keys_inorder(c->u->u_cellvars, 0); +    if (!cellvars) +        goto error; +    freevars = dict_keys_inorder(c->u->u_freevars, PyTuple_Size(cellvars)); +    if (!freevars) +        goto error; +    filename = PyUnicode_DecodeFSDefault(c->c_filename); +    if (!filename) +        goto error; + +    nlocals = PyDict_Size(c->u->u_varnames); +    flags = compute_code_flags(c); +    if (flags < 0) +        goto error; + +    bytecode = PyCode_Optimize(a->a_bytecode, consts, names, a->a_lnotab); +    if (!bytecode) +        goto error; + +    tmp = PyList_AsTuple(consts); /* PyCode_New requires a tuple */ +    if (!tmp) +        goto error; +    Py_DECREF(consts); +    consts = tmp; + +    co = PyCode_New(c->u->u_argcount, c->u->u_kwonlyargcount, +                    nlocals, stackdepth(c), flags, +                    bytecode, consts, names, varnames, +                    freevars, cellvars, +                    filename, c->u->u_name, +                    c->u->u_firstlineno, +                    a->a_lnotab);   error: -	Py_XDECREF(consts); -	Py_XDECREF(names); -	Py_XDECREF(varnames); -	Py_XDECREF(filename); -	Py_XDECREF(name); -	Py_XDECREF(freevars); -	Py_XDECREF(cellvars); -	Py_XDECREF(bytecode); -	return co; +    Py_XDECREF(consts); +    Py_XDECREF(names); +    Py_XDECREF(varnames); +    Py_XDECREF(filename); +    Py_XDECREF(name); +    Py_XDECREF(freevars); +    Py_XDECREF(cellvars); +    Py_XDECREF(bytecode); +    return co;  } @@ -3986,90 +3986,90 @@ makecode(struct compiler *c, struct assembler *a)  static void  dump_instr(const struct instr *i)  { -	const char *jrel = i->i_jrel ? "jrel " : ""; -	const char *jabs = i->i_jabs ? "jabs " : ""; -	char arg[128]; +    const char *jrel = i->i_jrel ? "jrel " : ""; +    const char *jabs = i->i_jabs ? "jabs " : ""; +    char arg[128]; -	*arg = '\0'; -	if (i->i_hasarg) -		sprintf(arg, "arg: %d ", i->i_oparg); +    *arg = '\0'; +    if (i->i_hasarg) +        sprintf(arg, "arg: %d ", i->i_oparg); -	fprintf(stderr, "line: %d, opcode: %d %s%s%s\n",  -			i->i_lineno, i->i_opcode, arg, jabs, jrel); +    fprintf(stderr, "line: %d, opcode: %d %s%s%s\n", +                    i->i_lineno, i->i_opcode, arg, jabs, jrel);  }  static void  dump_basicblock(const basicblock *b)  { -	const char *seen = b->b_seen ? "seen " : ""; -	const char *b_return = b->b_return ? "return " : ""; -	fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n", -		b->b_iused, b->b_startdepth, b->b_offset, seen, b_return); -	if (b->b_instr) { -		int i; -		for (i = 0; i < b->b_iused; i++) { -			fprintf(stderr, "  [%02d] ", i); -			dump_instr(b->b_instr + i); -		} -	} +    const char *seen = b->b_seen ? "seen " : ""; +    const char *b_return = b->b_return ? "return " : ""; +    fprintf(stderr, "used: %d, depth: %d, offset: %d %s%s\n", +        b->b_iused, b->b_startdepth, b->b_offset, seen, b_return); +    if (b->b_instr) { +        int i; +        for (i = 0; i < b->b_iused; i++) { +            fprintf(stderr, "  [%02d] ", i); +            dump_instr(b->b_instr + i); +        } +    }  }  #endif  static PyCodeObject *  assemble(struct compiler *c, int addNone)  { -	basicblock *b, *entryblock; -	struct assembler a; -	int i, j, nblocks; -	PyCodeObject *co = NULL; - -	/* Make sure every block that falls off the end returns None. -	   XXX NEXT_BLOCK() isn't quite right, because if the last -	   block ends with a jump or return b_next shouldn't set. -	 */ -	if (!c->u->u_curblock->b_return) { -		NEXT_BLOCK(c); -		if (addNone) -			ADDOP_O(c, LOAD_CONST, Py_None, consts); -		ADDOP(c, RETURN_VALUE); -	} - -	nblocks = 0; -	entryblock = NULL; -	for (b = c->u->u_blocks; b != NULL; b = b->b_list) { -		nblocks++; -		entryblock = b;  -	} - -	/* Set firstlineno if it wasn't explicitly set. */ -	if (!c->u->u_firstlineno) { -		if (entryblock && entryblock->b_instr) -			c->u->u_firstlineno = entryblock->b_instr->i_lineno; -		else -			c->u->u_firstlineno = 1; -	} -	if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) -		goto error; -	dfs(c, entryblock, &a); - -	/* Can't modify the bytecode after computing jump offsets. */ -	assemble_jump_offsets(&a, c); - -	/* Emit code in reverse postorder from dfs. */ -	for (i = a.a_nblocks - 1; i >= 0; i--) { -		b = a.a_postorder[i]; -		for (j = 0; j < b->b_iused; j++) -			if (!assemble_emit(&a, &b->b_instr[j])) -				goto error; -	} - -	if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) -		goto error; -	if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0) -		goto error; - -	co = makecode(c, &a); +    basicblock *b, *entryblock; +    struct assembler a; +    int i, j, nblocks; +    PyCodeObject *co = NULL; + +    /* Make sure every block that falls off the end returns None. +       XXX NEXT_BLOCK() isn't quite right, because if the last +       block ends with a jump or return b_next shouldn't set. +     */ +    if (!c->u->u_curblock->b_return) { +        NEXT_BLOCK(c); +        if (addNone) +            ADDOP_O(c, LOAD_CONST, Py_None, consts); +        ADDOP(c, RETURN_VALUE); +    } + +    nblocks = 0; +    entryblock = NULL; +    for (b = c->u->u_blocks; b != NULL; b = b->b_list) { +        nblocks++; +        entryblock = b; +    } + +    /* Set firstlineno if it wasn't explicitly set. */ +    if (!c->u->u_firstlineno) { +        if (entryblock && entryblock->b_instr) +            c->u->u_firstlineno = entryblock->b_instr->i_lineno; +        else +            c->u->u_firstlineno = 1; +    } +    if (!assemble_init(&a, nblocks, c->u->u_firstlineno)) +        goto error; +    dfs(c, entryblock, &a); + +    /* Can't modify the bytecode after computing jump offsets. */ +    assemble_jump_offsets(&a, c); + +    /* Emit code in reverse postorder from dfs. */ +    for (i = a.a_nblocks - 1; i >= 0; i--) { +        b = a.a_postorder[i]; +        for (j = 0; j < b->b_iused; j++) +            if (!assemble_emit(&a, &b->b_instr[j])) +                goto error; +    } + +    if (_PyBytes_Resize(&a.a_lnotab, a.a_lnotab_off) < 0) +        goto error; +    if (_PyBytes_Resize(&a.a_bytecode, a.a_offset) < 0) +        goto error; + +    co = makecode(c, &a);   error: -	assemble_free(&a); -	return co; +    assemble_free(&a); +    return co;  }  | 
