File: //lib/python3.6/site-packages/pycparser/__pycache__/ast_transforms.cpython-36.pyc
3
gwU
@ s d dl mZ dd Zdd ZdS ) )c_astc C s t | tjstt | jtjs"| S tjg | jj}d}xh| jjD ]\}t |tjtj frz|jj
| t||j |jd }q@|dkr|jj
| q@|jj
| q@W || _| S )a The 'case' statements in a 'switch' come out of parsing with one
child node, so subsequent statements are just tucked to the parent
Compound. Additionally, consecutive (fall-through) case statements
come out messy. This is a peculiarity of the C grammar. The following:
switch (myvar) {
case 10:
k = 10;
p = k + 1;
return 10;
case 20:
case 30:
return 20;
default:
break;
}
Creates this tree (pseudo-dump):
Switch
ID: myvar
Compound:
Case 10:
k = 10
p = k + 1
return 10
Case 20:
Case 30:
return 20
Default:
break
The goal of this transform it to fix this mess, turning it into the
following:
Switch
ID: myvar
Compound:
Case 10:
k = 10
p = k + 1
return 10
Case 20:
Case 30:
return 20
Default:
break
A fixed AST node is returned. The argument may be modified.
Nr )
isinstancer ZSwitchAssertionErrorZstmtZCompoundZcoordZblock_itemsCaseDefaultappend_extract_nested_casestmts)Zswitch_nodeZnew_compoundZ last_caseZchild r $/usr/lib/python3.6/ast_transforms.pyfix_switch_cases
s 3r
c C s: t | jd tjtjfr6|j| jj t|d | dS )z Recursively extract consecutive Case statements that are made nested
by the parser and add them to the stmts_list.
r Nr )r r
r r r r popr )Z case_nodeZ
stmts_listr r r r b s r N) r r
r r r r r <module>
s U