File: //var/opt/nydus/ops/pycparser/__pycache__/ast_transforms.cpython-39.pyc
a
�,�h; � @ s0 d dl mZ dd� Zdd� Zdd� Zdd � Zd
S )� )�c_astc C s� t | tj�sJ �t | jtj�s"| S t�g | jj�}d}| jjp@g D ]\}t |tjtjf�r||j� |� t
||j� |jd }qB|du r�|j� |� qB|j� |� qB|| _| 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 is 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.
N���)�
isinstancer ZSwitch�stmtZCompoundZcoordZblock_items�Case�Default�append�_extract_nested_case�stmts)Zswitch_nodeZnew_compoundZ last_case�child� r �I/opt/nydus/tmp/pip-target-wkfpz8uv/lib/python/pycparser/ast_transforms.py�fix_switch_cases
s 3r c C s: t | jd tjtjf�r6|�| j�� � t|d |� dS )z� Recursively extract consecutive Case statements that are made nested
by the parser and add them to the stmts_list.
� r N)r r
r r r r �popr )Z case_nodeZ
stmts_listr r r
r c s r c C s~ t | �\} }|s qq | }t|tj�sHz
|j}W q tyD | Y S 0 qd|jv rhd| jvrh| j�d� |jdu rz| j |_| S )aK Atomic specifiers like _Atomic(type) are unusually structured,
conferring a qualifier upon the contained type.
This function fixes a decl with atomic specifiers to have a sane AST
structure, by removing spurious Typename->TypeDecl pairs and attaching
the _Atomic qualifier in the right place.
�_AtomicN)
�_fix_atomic_specifiers_oncer r �TypeDecl�type�AttributeError�qualsr Zdeclname�name)�decl�found�typr r r
�fix_atomic_specifiersl s
r c C s� | }d}| j }|dur^t|tj�r.d|jv r.q^z|}|}|j }W q tyZ | df Y S 0 qt|tj�snJ �|j |_ d|j jvr�|j j�d� | dfS )z� Performs one 'fix' round of atomic specifiers.
Returns (modified_decl, found) where found is True iff a fix was made.
Nr FT)r r r ZTypenamer r r r )r �parentZgrandparent�noder r r
r � s"