diff options
Diffstat (limited to 'Python/ast.c')
| -rw-r--r-- | Python/ast.c | 66 | 
1 files changed, 20 insertions, 46 deletions
| diff --git a/Python/ast.c b/Python/ast.c index 2ee2186..485b7d6 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -2893,7 +2893,7 @@ ast_for_try_stmt(struct compiling *c, const node *n)  {      const int nch = NCH(n);      int n_except = (nch - 3)/3; -    asdl_seq *body, *orelse = NULL, *finally = NULL; +    asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;      REQ(n, try_stmt); @@ -2934,9 +2934,8 @@ ast_for_try_stmt(struct compiling *c, const node *n)      if (n_except > 0) {          int i; -        stmt_ty except_st;          /* process except statements to create a try ... except */ -        asdl_seq *handlers = asdl_seq_new(n_except, c->c_arena); +        handlers = asdl_seq_new(n_except, c->c_arena);          if (handlers == NULL)              return NULL; @@ -2947,28 +2946,15 @@ ast_for_try_stmt(struct compiling *c, const node *n)                  return NULL;              asdl_seq_SET(handlers, i, e);          } - -        except_st = TryExcept(body, handlers, orelse, LINENO(n), -                              n->n_col_offset, c->c_arena); -        if (!finally) -            return except_st; - -        /* if a 'finally' is present too, we nest the TryExcept within a -           TryFinally to emulate try ... except ... finally */ -        body = asdl_seq_new(1, c->c_arena); -        if (body == NULL) -            return NULL; -        asdl_seq_SET(body, 0, except_st);      } -    /* must be a try ... finally (except clauses are in body, if any exist) */ -    assert(finally != NULL); -    return TryFinally(body, finally, LINENO(n), n->n_col_offset, c->c_arena); +    assert(finally != NULL || asdl_seq_LEN(handlers)); +    return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);  }  /* with_item: test ['as' expr] */ -static stmt_ty -ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content) +static withitem_ty +ast_for_with_item(struct compiling *c, const node *n)  {      expr_ty context_expr, optional_vars = NULL; @@ -2987,43 +2973,32 @@ ast_for_with_item(struct compiling *c, const node *n, asdl_seq *content)          }      } -    return With(context_expr, optional_vars, content, LINENO(n), -                n->n_col_offset, c->c_arena); +    return withitem(context_expr, optional_vars, c->c_arena);  }  /* with_stmt: 'with' with_item (',' with_item)* ':' suite */  static stmt_ty  ast_for_with_stmt(struct compiling *c, const node *n)  { -    int i; -    stmt_ty ret; -    asdl_seq *inner; +    int i, n_items; +    asdl_seq *items, *body;      REQ(n, with_stmt); -    /* process the with items inside-out */ -    i = NCH(n) - 1; -    /* the suite of the innermost with item is the suite of the with stmt */ -    inner = ast_for_suite(c, CHILD(n, i)); -    if (!inner) -        return NULL; - -    for (;;) { -        i -= 2; -        ret = ast_for_with_item(c, CHILD(n, i), inner); -        if (!ret) -            return NULL; -        /* was this the last item? */ -        if (i == 1) -            break; -        /* if not, wrap the result so far in a new sequence */ -        inner = asdl_seq_new(1, c->c_arena); -        if (!inner) +    n_items = (NCH(n) - 2) / 2; +    items = asdl_seq_new(n_items, c->c_arena); +    for (i = 1; i < NCH(n) - 2; i += 2) { +        withitem_ty item = ast_for_with_item(c, CHILD(n, i)); +        if (!item)              return NULL; -        asdl_seq_SET(inner, 0, ret); +        asdl_seq_SET(items, (i - 1) / 2, item);      } -    return ret; +    body = ast_for_suite(c, CHILD(n, NCH(n) - 1)); +    if (!body) +        return NULL; + +    return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);  }  static stmt_ty @@ -3232,7 +3207,6 @@ decode_unicode(struct compiling *c, const char *s, size_t len, int rawmode, cons      const char *end;      if (encoding == NULL) { -        buf = (char *)s;          u = NULL;      } else {          /* check for integer overflow */ | 
