U aðf;ã@s0ddlmZdd„Zdd„Zdd„Zdd „Zd S) é)Úc_astcCsªt|tjƒst‚t|jtjƒs"|St g|jj¡}d}|jjp@gD]\}t|tjtj fƒr||j  |¡t ||jƒ|jd}qB|dkr’|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éÿÿÿÿ) Ú isinstancerZSwitchÚAssertionErrorÚstmtZCompoundZcoordZ block_itemsÚCaseÚDefaultÚappendÚ_extract_nested_caseÚstmts)Z switch_nodeZ new_compoundZ last_caseÚchild©r úI/opt/nydus/tmp/pip-target-53d1vnqk/lib/python/pycparser/ast_transforms.pyÚfix_switch_cases s3   rcCs:t|jdtjtjfƒ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. érN)rr rrrr Úpopr )Z case_nodeZ stmts_listr r rr csr cCs€t|ƒ\}}|sqq|}t|tjƒsJz |j}Wqtk rF|YSXqd|jkrjd|jkrj|j d¡|jdkr||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_oncerrÚTypeDeclÚtypeÚAttributeErrorÚqualsr ZdeclnameÚname)ÚdeclÚfoundÚtypr r rÚfix_atomic_specifiersls      rcCsš|}d}|j}|dk r`t|tjƒr.d|jkr.q`z|}|}|j}Wqtk r\|dfYSXqt|tjƒspt‚|j|_d|jjkr’|jj d¡|dfS)zƒ Performs one 'fix' round of atomic specifiers. Returns (modified_decl, found) where found is True iff a fix was made. NrFT) rrrZTypenamerrrrr )rÚparentZ grandparentÚnoder r rrŒs"  rN)Úrrr rrr r r rÚ s V