Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
e76adcd7
Commit
e76adcd7
authored
Nov 15, 2005
by
Neal Norwitz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix a whole bunch of potential memory leaks (and some real ones too)
in error conditions.
parent
56c6561d
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
206 additions
and
81 deletions
+206
-81
Python/ast.c
Python/ast.c
+206
-81
No files found.
Python/ast.c
View file @
e76adcd7
...
...
@@ -60,7 +60,7 @@ asdl_stmt_seq_free(asdl_seq* seq)
n
=
asdl_seq_LEN
(
seq
);
for
(
i
=
0
;
i
<
n
;
i
++
)
free_stmt
(
asdl_seq_GET
(
seq
,
i
));
asdl_seq_free
(
seq
);
asdl_seq_free
(
seq
);
/* ok */
}
static
void
...
...
@@ -74,7 +74,35 @@ asdl_expr_seq_free(asdl_seq* seq)
n
=
asdl_seq_LEN
(
seq
);
for
(
i
=
0
;
i
<
n
;
i
++
)
free_expr
(
asdl_seq_GET
(
seq
,
i
));
asdl_seq_free
(
seq
);
asdl_seq_free
(
seq
);
/* ok */
}
static
void
asdl_alias_seq_free
(
asdl_seq
*
seq
)
{
int
n
,
i
;
if
(
!
seq
)
return
;
n
=
asdl_seq_LEN
(
seq
);
for
(
i
=
0
;
i
<
n
;
i
++
)
free_alias
(
asdl_seq_GET
(
seq
,
i
));
asdl_seq_free
(
seq
);
/* ok */
}
static
void
asdl_comprehension_seq_free
(
asdl_seq
*
seq
)
{
int
n
,
i
;
if
(
!
seq
)
return
;
n
=
asdl_seq_LEN
(
seq
);
for
(
i
=
0
;
i
<
n
;
i
++
)
free_comprehension
(
asdl_seq_GET
(
seq
,
i
));
asdl_seq_free
(
seq
);
/* ok */
}
/* This routine provides an invalid object for the syntax error.
...
...
@@ -527,7 +555,7 @@ seq_for_testlist(struct compiling *c, const node *n)
expression
=
ast_for_expr
(
c
,
CHILD
(
n
,
i
));
if
(
!
expression
)
{
asdl_seq_free
(
seq
);
asdl_
expr_
seq_free
(
seq
);
return
NULL
;
}
...
...
@@ -679,10 +707,12 @@ ast_for_arguments(struct compiling *c, const node *n)
return
arguments
(
args
,
vararg
,
kwarg
,
defaults
);
error:
Py_XDECREF
(
vararg
);
Py_XDECREF
(
kwarg
);
if
(
args
)
asdl_seq_free
(
args
);
asdl_
expr_
seq_free
(
args
);
if
(
defaults
)
asdl_seq_free
(
defaults
);
asdl_
expr_
seq_free
(
defaults
);
return
NULL
;
}
...
...
@@ -771,7 +801,7 @@ static asdl_seq*
ast_for_decorators
(
struct
compiling
*
c
,
const
node
*
n
)
{
asdl_seq
*
decorator_seq
=
NULL
;
expr_ty
d
=
NULL
;
expr_ty
d
;
int
i
;
REQ
(
n
,
decorators
);
...
...
@@ -785,12 +815,10 @@ ast_for_decorators(struct compiling *c, const node *n)
if
(
!
d
)
goto
error
;
asdl_seq_APPEND
(
decorator_seq
,
d
);
d
=
NULL
;
}
return
decorator_seq
;
error:
asdl_expr_seq_free
(
decorator_seq
);
free_expr
(
d
);
return
NULL
;
}
...
...
@@ -973,14 +1001,14 @@ ast_for_listcomp(struct compiling *c, const node *n)
t
=
ast_for_exprlist
(
c
,
CHILD
(
ch
,
1
),
Store
);
if
(
!
t
)
{
asdl_seq_free
(
listcomps
);
asdl_
comprehension_
seq_free
(
listcomps
);
free_expr
(
elt
);
return
NULL
;
}
expression
=
ast_for_testlist
(
c
,
CHILD
(
ch
,
3
));
if
(
!
expression
)
{
asdl_seq_free
(
t
);
asdl_seq_free
(
listcomps
);
asdl_
expr_
seq_free
(
t
);
asdl_
comprehension_
seq_free
(
listcomps
);
free_expr
(
elt
);
return
NULL
;
}
...
...
@@ -991,8 +1019,8 @@ ast_for_listcomp(struct compiling *c, const node *n)
lc
=
comprehension
(
Tuple
(
t
,
Store
,
LINENO
(
ch
)),
expression
,
NULL
);
if
(
!
lc
)
{
asdl_seq_free
(
t
);
asdl_seq_free
(
listcomps
);
asdl_
expr_
seq_free
(
t
);
asdl_
comprehension_
seq_free
(
listcomps
);
free_expr
(
expression
);
free_expr
(
elt
);
return
NULL
;
...
...
@@ -1005,14 +1033,16 @@ ast_for_listcomp(struct compiling *c, const node *n)
ch
=
CHILD
(
ch
,
4
);
n_ifs
=
count_list_ifs
(
ch
);
if
(
n_ifs
==
-
1
)
{
asdl_seq_free
(
listcomps
);
free_comprehension
(
lc
);
asdl_comprehension_seq_free
(
listcomps
);
free_expr
(
elt
);
return
NULL
;
}
ifs
=
asdl_seq_new
(
n_ifs
);
if
(
!
ifs
)
{
asdl_seq_free
(
listcomps
);
free_comprehension
(
lc
);
asdl_comprehension_seq_free
(
listcomps
);
free_expr
(
elt
);
return
NULL
;
}
...
...
@@ -1138,13 +1168,15 @@ ast_for_genexp(struct compiling *c, const node *n)
t
=
ast_for_exprlist
(
c
,
CHILD
(
ch
,
1
),
Store
);
if
(
!
t
)
{
asdl_seq_free
(
genexps
);
asdl_comprehension_seq_free
(
genexps
);
asdl_expr_seq_free
(
t
);
free_expr
(
elt
);
return
NULL
;
}
expression
=
ast_for_expr
(
c
,
CHILD
(
ch
,
3
));
if
(
!
expression
)
{
asdl_seq_free
(
genexps
);
asdl_comprehension_seq_free
(
genexps
);
asdl_expr_seq_free
(
t
);
free_expr
(
elt
);
return
NULL
;
}
...
...
@@ -1157,7 +1189,8 @@ ast_for_genexp(struct compiling *c, const node *n)
expression
,
NULL
);
if
(
!
ge
)
{
asdl_seq_free
(
genexps
);
asdl_comprehension_seq_free
(
genexps
);
asdl_expr_seq_free
(
t
);
free_expr
(
elt
);
return
NULL
;
}
...
...
@@ -1169,14 +1202,16 @@ ast_for_genexp(struct compiling *c, const node *n)
ch
=
CHILD
(
ch
,
4
);
n_ifs
=
count_gen_ifs
(
ch
);
if
(
n_ifs
==
-
1
)
{
asdl_seq_free
(
genexps
);
asdl_comprehension_seq_free
(
genexps
);
free_comprehension
(
ge
);
free_expr
(
elt
);
return
NULL
;
}
ifs
=
asdl_seq_new
(
n_ifs
);
if
(
!
ifs
)
{
asdl_seq_free
(
genexps
);
asdl_comprehension_seq_free
(
genexps
);
free_comprehension
(
ge
);
free_expr
(
elt
);
return
NULL
;
}
...
...
@@ -1189,7 +1224,10 @@ ast_for_genexp(struct compiling *c, const node *n)
expression
=
ast_for_expr
(
c
,
CHILD
(
ch
,
1
));
if
(
!
expression
)
{
asdl_seq_free
(
genexps
);
asdl_expr_seq_free
(
ifs
);
asdl_comprehension_seq_free
(
genexps
);
free_comprehension
(
ge
);
free_expr
(
elt
);
return
NULL
;
}
asdl_seq_APPEND
(
ifs
,
expression
);
...
...
@@ -1279,7 +1317,7 @@ ast_for_atom(struct compiling *c, const node *n)
values
=
asdl_seq_new
(
size
);
if
(
!
values
)
{
asdl_seq_free
(
keys
);
asdl_seq_free
(
keys
);
/* ok */
return
NULL
;
}
...
...
@@ -1287,14 +1325,20 @@ ast_for_atom(struct compiling *c, const node *n)
expr_ty
expression
;
expression
=
ast_for_expr
(
c
,
CHILD
(
ch
,
i
));
if
(
!
expression
)
if
(
!
expression
)
{
asdl_expr_seq_free
(
keys
);
asdl_expr_seq_free
(
values
);
return
NULL
;
}
asdl_seq_SET
(
keys
,
i
/
4
,
expression
);
expression
=
ast_for_expr
(
c
,
CHILD
(
ch
,
i
+
2
));
if
(
!
expression
)
if
(
!
expression
)
{
asdl_expr_seq_free
(
keys
);
asdl_expr_seq_free
(
values
);
return
NULL
;
}
asdl_seq_SET
(
values
,
i
/
4
,
expression
);
}
...
...
@@ -1469,14 +1513,18 @@ ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
for
(
j
=
0
;
j
<
NCH
(
n
);
j
+=
2
)
{
slc
=
ast_for_slice
(
c
,
CHILD
(
n
,
j
));
if
(
!
slc
)
{
asdl_seq_free
(
slices
);
for
(
j
=
j
/
2
;
j
>=
0
;
j
--
)
free_slice
(
asdl_seq_GET
(
slices
,
j
));
asdl_seq_free
(
slices
);
/* ok */
return
NULL
;
}
asdl_seq_SET
(
slices
,
j
/
2
,
slc
);
}
e
=
Subscript
(
left_expr
,
ExtSlice
(
slices
),
Load
,
LINENO
(
n
));
if
(
!
e
)
{
asdl_seq_free
(
slices
);
for
(
j
=
0
;
j
<
asdl_seq_LEN
(
slices
);
j
++
)
free_slice
(
asdl_seq_GET
(
slices
,
j
));
asdl_seq_free
(
slices
);
/* ok */
return
NULL
;
}
}
...
...
@@ -1604,7 +1652,7 @@ ast_for_expr(struct compiling *c, const node *n)
return
NULL
;
cmps
=
asdl_seq_new
(
NCH
(
n
)
/
2
);
if
(
!
cmps
)
{
asdl_seq_free
(
ops
);
asdl_seq_free
(
ops
);
/* ok */
return
NULL
;
}
for
(
i
=
1
;
i
<
NCH
(
n
);
i
+=
2
)
{
...
...
@@ -1612,19 +1660,28 @@ ast_for_expr(struct compiling *c, const node *n)
cmpop_ty
operator
;
operator
=
ast_for_comp_op
(
CHILD
(
n
,
i
));
if
(
!
operator
)
if
(
!
operator
)
{
asdl_expr_seq_free
(
ops
);
asdl_expr_seq_free
(
cmps
);
return
NULL
;
}
expression
=
ast_for_expr
(
c
,
CHILD
(
n
,
i
+
1
));
if
(
!
expression
)
if
(
!
expression
)
{
asdl_expr_seq_free
(
ops
);
asdl_expr_seq_free
(
cmps
);
return
NULL
;
}
asdl_seq_SET
(
ops
,
i
/
2
,
(
void
*
)
operator
);
asdl_seq_SET
(
cmps
,
i
/
2
,
expression
);
}
expression
=
ast_for_expr
(
c
,
CHILD
(
n
,
0
));
if
(
!
expression
)
if
(
!
expression
)
{
asdl_expr_seq_free
(
ops
);
asdl_expr_seq_free
(
cmps
);
return
NULL
;
}
return
Compare
(
expression
,
ops
,
cmps
,
LINENO
(
n
));
}
...
...
@@ -1674,6 +1731,8 @@ ast_for_expr(struct compiling *c, const node *n)
case
TILDE
:
return
UnaryOp
(
Invert
,
expression
,
LINENO
(
n
));
}
PyErr_Format
(
PyExc_SystemError
,
"unhandled factor: %d"
,
TYPE
(
CHILD
(
n
,
0
)));
break
;
}
case
power
:
...
...
@@ -1772,7 +1831,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
goto
error
;
}
key
=
e
->
v
.
Name
.
id
;
free
(
e
);
free
(
e
);
/* XXX: is free correct here? */
e
=
ast_for_expr
(
c
,
CHILD
(
ch
,
2
));
if
(
!
e
)
goto
error
;
...
...
@@ -1795,10 +1854,15 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func)
return
Call
(
func
,
args
,
keywords
,
vararg
,
kwarg
,
LINENO
(
n
));
error:
free_expr
(
vararg
);
free_expr
(
kwarg
);
if
(
args
)
asdl_seq_free
(
args
);
if
(
keywords
)
asdl_seq_free
(
keywords
);
asdl_expr_seq_free
(
args
);
if
(
keywords
)
{
for
(
i
=
0
;
i
<
asdl_seq_LEN
(
keywords
);
i
++
)
free_keyword
(
asdl_seq_GET
(
keywords
,
i
));
asdl_seq_free
(
keywords
);
/* ok */
}
return
NULL
;
}
...
...
@@ -1856,7 +1920,7 @@ ast_for_class_bases(struct compiling *c, const node* n)
return
NULL
;
base
=
ast_for_expr
(
c
,
CHILD
(
n
,
0
));
if
(
!
base
)
{
asdl_seq_free
(
bases
);
asdl_seq_free
(
bases
);
/* ok */
return
NULL
;
}
asdl_seq_SET
(
bases
,
0
,
base
);
...
...
@@ -1972,10 +2036,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n)
goto
error
;
return
Assign
(
targets
,
expression
,
LINENO
(
n
));
error:
for
(
i
=
i
/
2
;
i
>=
0
;
i
--
)
free_expr
((
expr_ty
)
asdl_seq_GET
(
targets
,
i
));
asdl_seq_free
(
targets
);
return
NULL
;
asdl_expr_seq_free
(
targets
);
}
return
NULL
;
}
...
...
@@ -2004,7 +2065,8 @@ ast_for_print_stmt(struct compiling *c, const node *n)
for
(
i
=
start
;
i
<
NCH
(
n
);
i
+=
2
)
{
expression
=
ast_for_expr
(
c
,
CHILD
(
n
,
i
));
if
(
!
expression
)
{
asdl_seq_free
(
seq
);
free_expr
(
dest
);
asdl_expr_seq_free
(
seq
);
return
NULL
;
}
...
...
@@ -2028,17 +2090,19 @@ ast_for_exprlist(struct compiling *c, const node *n, int context)
return
NULL
;
for
(
i
=
0
;
i
<
NCH
(
n
);
i
+=
2
)
{
e
=
ast_for_expr
(
c
,
CHILD
(
n
,
i
));
if
(
!
e
)
{
asdl_seq_free
(
seq
);
return
NULL
;
}
if
(
!
e
)
goto
error
;
if
(
context
)
{
if
(
!
set_context
(
e
,
context
,
CHILD
(
n
,
i
)))
return
NULL
;
goto
error
;
}
asdl_seq_SET
(
seq
,
i
/
2
,
e
);
}
return
seq
;
error:
asdl_expr_seq_free
(
seq
);
return
NULL
;
}
static
stmt_ty
...
...
@@ -2231,7 +2295,7 @@ ast_for_import_stmt(struct compiling *c, const node *n)
for
(
i
=
0
;
i
<
NCH
(
n
);
i
+=
2
)
{
alias_ty
import_alias
=
alias_for_import_name
(
CHILD
(
n
,
i
));
if
(
!
import_alias
)
{
asdl_seq_free
(
aliases
);
asdl_
alias_
seq_free
(
aliases
);
return
NULL
;
}
asdl_seq_SET
(
aliases
,
i
/
2
,
import_alias
);
...
...
@@ -2254,6 +2318,7 @@ ast_for_import_stmt(struct compiling *c, const node *n)
n
=
CHILD
(
n
,
3
);
/* from ... import x, y, z */
if
(
NCH
(
n
)
%
2
==
0
)
{
/* it ends with a comma, not valid but the parser allows it */
free_alias
(
mod
);
ast_error
(
n
,
"trailing comma not allowed without"
" surrounding parentheses"
);
return
NULL
;
...
...
@@ -2264,8 +2329,11 @@ ast_for_import_stmt(struct compiling *c, const node *n)
}
else
if
(
from_modules
[
0
]
==
'('
)
n
=
CHILD
(
n
,
4
);
/* from ... import (x, y, z) */
else
else
{
/* XXX: don't we need to call ast_error(n, "..."); */
free_alias
(
mod
);
return
NULL
;
}
n_children
=
NCH
(
n
);
if
(
from_modules
&&
from_modules
[
0
]
==
'*'
)
...
...
@@ -2281,7 +2349,7 @@ ast_for_import_stmt(struct compiling *c, const node *n)
if
(
from_modules
&&
from_modules
[
0
]
==
'*'
)
{
alias_ty
import_alias
=
alias_for_import_name
(
n
);
if
(
!
import_alias
)
{
asdl_seq_free
(
aliases
);
asdl_
alias_
seq_free
(
aliases
);
free_alias
(
mod
);
return
NULL
;
}
...
...
@@ -2291,7 +2359,7 @@ ast_for_import_stmt(struct compiling *c, const node *n)
for
(
i
=
0
;
i
<
NCH
(
n
);
i
+=
2
)
{
alias_ty
import_alias
=
alias_for_import_name
(
CHILD
(
n
,
i
));
if
(
!
import_alias
)
{
asdl_seq_free
(
aliases
);
asdl_
alias_
seq_free
(
aliases
);
free_alias
(
mod
);
return
NULL
;
}
...
...
@@ -2323,7 +2391,9 @@ ast_for_global_stmt(struct compiling *c, const node *n)
for
(
i
=
1
;
i
<
NCH
(
n
);
i
+=
2
)
{
name
=
NEW_IDENTIFIER
(
CHILD
(
n
,
i
));
if
(
!
name
)
{
asdl_seq_free
(
s
);
for
(
i
=
i
/
2
;
i
>
0
;
i
--
)
Py_XDECREF
((
identifier
)
asdl_seq_GET
(
s
,
i
));
asdl_seq_free
(
s
);
/* ok */
return
NULL
;
}
asdl_seq_SET
(
s
,
i
/
2
,
name
);
...
...
@@ -2452,7 +2522,7 @@ ast_for_suite(struct compiling *c, const node *n)
return
seq
;
error:
if
(
seq
)
asdl_seq_free
(
seq
);
asdl_s
tmt_s
eq_free
(
seq
);
return
NULL
;
}
...
...
@@ -2474,8 +2544,10 @@ ast_for_if_stmt(struct compiling *c, const node *n)
if
(
!
expression
)
return
NULL
;
suite_seq
=
ast_for_suite
(
c
,
CHILD
(
n
,
3
));
if
(
!
suite_seq
)
if
(
!
suite_seq
)
{
free_expr
(
expression
);
return
NULL
;
}
return
If
(
expression
,
suite_seq
,
NULL
,
LINENO
(
n
));
}
...
...
@@ -2492,11 +2564,16 @@ ast_for_if_stmt(struct compiling *c, const node *n)
if
(
!
expression
)
return
NULL
;
seq1
=
ast_for_suite
(
c
,
CHILD
(
n
,
3
));
if
(
!
seq1
)
if
(
!
seq1
)
{
free_expr
(
expression
);
return
NULL
;
}
seq2
=
ast_for_suite
(
c
,
CHILD
(
n
,
6
));
if
(
!
seq2
)
if
(
!
seq2
)
{
asdl_stmt_seq_free
(
seq1
);
free_expr
(
expression
);
return
NULL
;
}
return
If
(
expression
,
seq1
,
seq2
,
LINENO
(
n
));
}
...
...
@@ -2522,17 +2599,20 @@ ast_for_if_stmt(struct compiling *c, const node *n)
return
NULL
;
expression
=
ast_for_expr
(
c
,
CHILD
(
n
,
NCH
(
n
)
-
6
));
if
(
!
expression
)
{
asdl_seq_free
(
orelse
);
asdl_seq_free
(
orelse
);
/* ok */
return
NULL
;
}
seq1
=
ast_for_suite
(
c
,
CHILD
(
n
,
NCH
(
n
)
-
4
));
if
(
!
seq1
)
{
asdl_seq_free
(
orelse
);
free_expr
(
expression
);
asdl_seq_free
(
orelse
);
/* ok */
return
NULL
;
}
seq2
=
ast_for_suite
(
c
,
CHILD
(
n
,
NCH
(
n
)
-
1
));
if
(
!
seq2
)
{
asdl_seq_free
(
orelse
);
free_expr
(
expression
);
asdl_stmt_seq_free
(
seq1
);
asdl_seq_free
(
orelse
);
/* ok */
return
NULL
;
}
...
...
@@ -2549,16 +2629,21 @@ ast_for_if_stmt(struct compiling *c, const node *n)
expr_ty
expression
;
asdl_seq
*
suite_seq
;
asdl_seq
*
new
=
asdl_seq_new
(
1
);
if
(
!
new
)
if
(
!
new
)
{
asdl_stmt_seq_free
(
orelse
);
return
NULL
;
}
expression
=
ast_for_expr
(
c
,
CHILD
(
n
,
off
));
if
(
!
expression
)
{
asdl_seq_free
(
new
);
asdl_stmt_seq_free
(
orelse
);
asdl_seq_free
(
new
);
/* ok */
return
NULL
;
}
suite_seq
=
ast_for_suite
(
c
,
CHILD
(
n
,
off
+
2
));
if
(
!
suite_seq
)
{
asdl_seq_free
(
new
);
asdl_stmt_seq_free
(
orelse
);
free_expr
(
expression
);
asdl_seq_free
(
new
);
/* ok */
return
NULL
;
}
...
...
@@ -2592,8 +2677,10 @@ ast_for_while_stmt(struct compiling *c, const node *n)
if
(
!
expression
)
return
NULL
;
suite_seq
=
ast_for_suite
(
c
,
CHILD
(
n
,
3
));
if
(
!
suite_seq
)
if
(
!
suite_seq
)
{
free_expr
(
expression
);
return
NULL
;
}
return
While
(
expression
,
suite_seq
,
NULL
,
LINENO
(
n
));
}
else
if
(
NCH
(
n
)
==
7
)
{
...
...
@@ -2604,11 +2691,16 @@ ast_for_while_stmt(struct compiling *c, const node *n)
if
(
!
expression
)
return
NULL
;
seq1
=
ast_for_suite
(
c
,
CHILD
(
n
,
3
));
if
(
!
seq1
)
if
(
!
seq1
)
{
free_expr
(
expression
);
return
NULL
;
}
seq2
=
ast_for_suite
(
c
,
CHILD
(
n
,
6
));
if
(
!
seq2
)
if
(
!
seq2
)
{
asdl_stmt_seq_free
(
seq1
);
free_expr
(
expression
);
return
NULL
;
}
return
While
(
expression
,
seq1
,
seq2
,
LINENO
(
n
));
}
...
...
@@ -2636,21 +2728,30 @@ ast_for_for_stmt(struct compiling *c, const node *n)
}
_target
=
ast_for_exprlist
(
c
,
CHILD
(
n
,
1
),
Store
);
if
(
!
_target
)
if
(
!
_target
)
{
asdl_stmt_seq_free
(
seq
);
return
NULL
;
}
if
(
asdl_seq_LEN
(
_target
)
==
1
)
{
target
=
asdl_seq_GET
(
_target
,
0
);
asdl_seq_free
(
_target
);
asdl_seq_free
(
_target
);
/* ok */
}
else
target
=
Tuple
(
_target
,
Store
,
LINENO
(
n
));
expression
=
ast_for_testlist
(
c
,
CHILD
(
n
,
3
));
if
(
!
expression
)
if
(
!
expression
)
{
free_expr
(
target
);
asdl_stmt_seq_free
(
seq
);
return
NULL
;
}
suite_seq
=
ast_for_suite
(
c
,
CHILD
(
n
,
5
));
if
(
!
suite_seq
)
if
(
!
suite_seq
)
{
free_expr
(
target
);
free_expr
(
expression
);
asdl_stmt_seq_free
(
seq
);
return
NULL
;
}
return
For
(
target
,
expression
,
suite_seq
,
seq
,
LINENO
(
n
));
}
...
...
@@ -2677,8 +2778,10 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)
if
(
!
expression
)
return
NULL
;
suite_seq
=
ast_for_suite
(
c
,
body
);
if
(
!
suite_seq
)
if
(
!
suite_seq
)
{
free_expr
(
expression
);
return
NULL
;
}
return
excepthandler
(
expression
,
NULL
,
suite_seq
);
}
...
...
@@ -2688,14 +2791,21 @@ ast_for_except_clause(struct compiling *c, const node *exc, node *body)
expr_ty
e
=
ast_for_expr
(
c
,
CHILD
(
exc
,
3
));
if
(
!
e
)
return
NULL
;
if
(
!
set_context
(
e
,
Store
,
CHILD
(
exc
,
3
)))
if
(
!
set_context
(
e
,
Store
,
CHILD
(
exc
,
3
)))
{
free_expr
(
e
);
return
NULL
;
}
expression
=
ast_for_expr
(
c
,
CHILD
(
exc
,
1
));
if
(
!
expression
)
if
(
!
expression
)
{
free_expr
(
e
);
return
NULL
;
}
suite_seq
=
ast_for_suite
(
c
,
body
);
if
(
!
suite_seq
)
if
(
!
suite_seq
)
{
free_expr
(
expression
);
free_expr
(
e
);
return
NULL
;
}
return
excepthandler
(
expression
,
e
,
suite_seq
);
}
...
...
@@ -2719,8 +2829,10 @@ ast_for_try_stmt(struct compiling *c, const node *n)
if
(
!
s1
)
return
NULL
;
s2
=
ast_for_suite
(
c
,
CHILD
(
n
,
5
));
if
(
!
s2
)
if
(
!
s2
)
{
asdl_stmt_seq_free
(
s1
);
return
NULL
;
}
return
TryFinally
(
s1
,
s2
,
LINENO
(
n
));
}
...
...
@@ -2743,19 +2855,32 @@ ast_for_try_stmt(struct compiling *c, const node *n)
excepthandler_ty
e
=
ast_for_except_clause
(
c
,
CHILD
(
n
,
3
+
i
*
3
),
CHILD
(
n
,
5
+
i
*
3
));
if
(
!
e
)
if
(
!
e
)
{
for
(
;
i
>=
0
;
i
--
)
free_excepthandler
(
asdl_seq_GET
(
handlers
,
i
));
asdl_seq_free
(
handlers
);
/* ok */
return
NULL
;
}
asdl_seq_SET
(
handlers
,
i
,
e
);
}
suite_seq1
=
ast_for_suite
(
c
,
CHILD
(
n
,
2
));
if
(
!
suite_seq1
)
if
(
!
suite_seq1
)
{
for
(
i
=
0
;
i
<
asdl_seq_LEN
(
handlers
);
i
++
)
free_excepthandler
(
asdl_seq_GET
(
handlers
,
i
));
asdl_seq_free
(
handlers
);
/* ok */
return
NULL
;
}
if
(
has_else
)
{
suite_seq2
=
ast_for_suite
(
c
,
CHILD
(
n
,
NCH
(
n
)
-
1
));
if
(
!
suite_seq2
)
if
(
!
suite_seq2
)
{
for
(
i
=
0
;
i
<
asdl_seq_LEN
(
handlers
);
i
++
)
free_excepthandler
(
asdl_seq_GET
(
handlers
,
i
));
asdl_seq_free
(
handlers
);
/* ok */
asdl_stmt_seq_free
(
suite_seq1
);
return
NULL
;
}
}
else
suite_seq2
=
NULL
;
...
...
@@ -2801,7 +2926,7 @@ ast_for_classdef(struct compiling *c, const node *n)
s
=
ast_for_suite
(
c
,
CHILD
(
n
,
6
));
if
(
!
s
)
{
asdl_seq_free
(
bases
);
asdl_
expr_
seq_free
(
bases
);
return
NULL
;
}
return
ClassDef
(
NEW_IDENTIFIER
(
CHILD
(
n
,
1
)),
bases
,
s
,
LINENO
(
n
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment