o
    hëhj4v  ã                
   @  s°  U d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) dZ*dZ+d	Z,d
Z-dZ.d\Z/Z0Z1Z2Z3dZ4dZ5d\Z6Z7Z8Z9d\Z:Z;d\Z<Z=d\Z>Z?Z@ZAZBZCdZDdZEdZFdZGdZHdZIdZJdZKdZLdZMdZNdZOdZPd ZQd!ZRd"ZSd#ZTd$ZUd%\ZVZWZXZYi d&e/“d'e0“d(e1“d)e2“d*e3“d+e6“d,e7“d-e8“d.e<“d/e=“d0e>“d1e?“d2e@“d3eA“d4eB“d5eC“ZZe5e9d6œZ[ePd7dfeOd8dfeNd7dfeMd8dfeQddfeRd7dfeSd7dfeTddfd9œZ\d:e]d;< d<d=„ e\ ^¡ D ƒZ_e4eYeXeWeVeUd>œZ`G d?d@„ d@eaƒZbeG dAdB„ dBƒƒZcG dCdD„ dDƒZddSdGdH„ZeeG dIdJ„ dJƒƒZfG dKdL„ dLƒZgdTdQdR„ZhdS )Uaï  Bytecode code generator.

Emits the Roboteq MicroBasic bytecode reverse-engineered in
docs/reverse_engineering.md. Every opcode used here is backed by evidence
in that document (5 batches of real RoborunPlus-compiled output, decoded
byte-for-byte with zero leftovers across ~90 test programs plus a 70-byte
composite script). Where this module makes an assumption beyond what was
directly confirmed, it's called out in a comment -- search this file for
"ASSUMPTION" to find every one of them.

Two-pass design:
  1. `collect_declarations` walks the whole AST for `Dim` statements (in
     source order, including inside nested blocks) and allocates variable
     slots. Integer and Boolean variables have separate slot-numbering
     spaces, confirmed in batch 4.
  2. `emit_block` walks the AST again and emits bytecode. Forward
     references (a `GoTo`/`GoSub` to a label that appears later in the
     source) are handled with a simple patch list, resolved once the whole
     program has been emitted.
é    )ÚannotationsN)Ú	dataclassÚfieldé   ) Ú
AssignStmtÚBinaryOpÚBoolLiteralÚCallÚContinueStmtÚDimStmtÚDoLoopUntilStmtÚDoLoopWhileStmtÚDoUntilStmtÚExitStmtÚExprÚExprStmtÚForCStyleStmtÚForTraditionalStmtÚ	GosubStmtÚGotoStmtÚIfStmtÚ
IncDecExprÚ
IncDecStmtÚ
IntLiteralÚLabelÚOptionExplicitStmtÚ	PrintStmtÚProgramÚ
ReturnStmtÚStmtÚStringLiteralÚTerminateStmtÚUnaryOpÚVarRefÚWaitStmtÚ	WhileStmt)Úresolve_command_codeé   é   é   é   )é	   é
   é   é   é   é   é   )é   é   é   é   )é   é   )é   é   )é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   )é<   é=   é>   é?   ú+ú-Ú*ú/ÚmodÚandÚorÚxorz<<z>>ú=z<>ú>z>=ú<z<=)rW   Únoté   é   )ÚgetvalueÚ
setcommandÚ	getconfigÚ	setconfigÚgettimercountÚsettimercountÚsettimerstateÚgettimerstatez&dict[str, tuple[int, int, int | None]]ÚDEVICE_IO_SPECSc                 C  s   i | ]	\}}||d  “qS )r   © )Ú.0ÚnameÚspecrm   rm   úN/sessions/nice-awesome-ritchie/mnt/compiler/src/microbasic_compiler/codegen.pyÚ
<dictcomp>   s    rr   )ÚabsÚatanÚcosÚsinÚsqrtÚtoboolc                   @  s   e Zd ZdS )ÚCodegenErrorN)Ú__name__Ú
__module__Ú__qualname__rm   rm   rm   rq   ry   –   s    ry   c                   @  s&   e Zd ZU ded< ded< ded< dS )Ú	ArrayInfoÚintÚ	base_slotÚlengthÚboolÚis_boolN)rz   r{   r|   Ú__annotations__rm   rm   rm   rq   r}   œ   s   
 r}   c                   @  s>   e Zd Zddd„Zdd
d„Zddd„Zddd„Zddd„ZdS )ÚSymbolTableÚreturnÚNonec                 C  s"   i | _ i | _i | _d| _d| _d S ©Nr   )Úint_scalarsÚbool_scalarsÚarraysÚnext_intÚ	next_bool©Úselfrm   rm   rq   Ú__init__¤   s
   
zSymbolTable.__init__ro   ÚstrÚvar_typeÚ	array_lenú
int | Nonec                 C  sÌ   |  ¡ }|| jv s|| jv s|| jv rtd|› dƒ‚|dk}|d urF|r0| j}|  j|7  _n
| j}|  j|7  _t|||d| j|< d S |rW| j| j|< |  jd7  _d S | j| j|< |  jd7  _d S )Nz
variable 'z' declared more than onceÚBoolean)r   r€   r‚   r   )Úlowerrˆ   r‰   rŠ   ry   rŒ   r‹   r}   )rŽ   ro   r‘   r’   Úkeyr‚   Úbaserm   rm   rq   Údeclare«   s    zSymbolTable.declareútuple[int, bool]c                 C  s€   |  ¡ }|| jv r| j| dfS || jv r| j| dfS || jv r,td|› d|› dƒ‚| j| j|< |  jd7  _| j| dfS )NFTú'z$' is an array -- use an index, e.g. z[0]r   )r•   rˆ   r‰   rŠ   ry   r‹   )rŽ   ro   r–   rm   rm   rq   Úresolve_scalarÅ   s   


zSymbolTable.resolve_scalarútuple[int, bool, int]c                 C  s<   |  ¡ }|| jvrtd|› dƒ‚| j| }|j|j|jfS )Nzarray 'z' was not declared with Dim)r•   rŠ   ry   r   r‚   r€   )rŽ   ro   r–   Úinform   rm   rq   Úresolve_arrayÔ   s
   

zSymbolTable.resolve_arrayr~   c                 C  s   | j }|  j d7  _ |S )z€For the traditional For loop's compiler-synthesized limit/step
        variables (confirmed in reverse_engineering.md, batch 3).r   )r‹   )rŽ   Úslotrm   rm   rq   Úalloc_hidden_int_slotÛ   s   z!SymbolTable.alloc_hidden_int_slotN©r…   r†   )ro   r   r‘   r   r’   r“   r…   r†   )ro   r   r…   r™   )ro   r   r…   rœ   )r…   r~   )rz   r{   r|   r   r˜   r›   rž   r    rm   rm   rm   rq   r„   £   s    



r„   Ústmtsú
list[Stmt]c              	   c  sŒ    | D ]@}|V  t |tƒr0t|jƒE d H  |jD ]\}}t|ƒE d H  q|jr/t|jƒE d H  qt |tttt	t
tfƒrCt|jƒE d H  qd S ©N)Ú
isinstancer   Ú_iter_all_statementsÚ
then_blockÚelseif_clausesÚ
else_blockr%   r   r   r   r   r   Úbody)r¢   ÚsÚ_rª   rm   rm   rq   r¦   ã   s    €
€ÿ€ör¦   c                   @  s:   e Zd ZU ded< eedZded< eedZded< dS )ÚLoopContextr   Úkind)Údefault_factoryz	list[int]Úcontinue_patchesÚexit_patchesN)rz   r{   r|   rƒ   r   Úlistr°   r±   rm   rm   rm   rq   r­   ñ   s   
 r­   c                   @  s  e Zd Zd`dd„Zdadd	„Zdbd
d„Zd`dd„Zdcdd„Zdddd„Zdedd„Z	dfdd„Z
dgdd„Zdhdid#d$„Zdjd%d&„Zdkd)d*„Zdld-d.„Zdmd4d5„Zdnd8d9„Zdod<d=„Zdpd?d@„ZdqdBdC„ZdrdEdF„ZdsdIdJ„ZdtdLdM„ZdudOdP„ZdvdRdS„ZdwdUdV„ZdxdXdY„Zdyd[d\„Zdzd^d_„ZdS ){ÚCodeGeneratorr…   r†   c                 C  s&   t ƒ | _tƒ | _i | _g | _g | _d S r¤   )Ú	bytearrayÚcoder„   ÚsymtabÚlabel_addrsÚlabel_patchesÚ
loop_stackr   rm   rm   rq   r   ù   s
   
zCodeGenerator.__init__Úprogramr   Úbytesc                 C  s4   |   |¡ |  |j¡ | j d¡ |  ¡  t| jƒS r‡   )Úcollect_declarationsÚ
emit_blockÚ
statementsrµ   ÚappendÚ_resolve_label_patchesr»   )rŽ   rº   rm   rm   rq   Úgenerate  s
   

zCodeGenerator.generatec                 C  s4   t |jƒD ]}t|tƒr| j |j|j|j¡ qd S r¤   )	r¦   r¾   r¥   r   r¶   r˜   ro   r‘   r’   )rŽ   rº   r«   rm   rm   rq   r¼   	  s
   
€þz"CodeGenerator.collect_declarationsc                 C  sH   | j D ]\}}| ¡ }|| jvrtd|› dƒ‚|  || j| ¡ qd S )Nzundefined label 'rš   )r¸   r•   r·   ry   Úpatch_branch)rŽ   Úpatch_atÚlabelr–   rm   rm   rq   rÀ     s   
üz$CodeGenerator._resolve_label_patchesÚvaluer~   c                 C  s°   |dk s|dkrt d|› dƒ‚|dkr| j d¡ dS |dkr.| j d¡ | j |¡ dS |dkrE| j d	¡ |  jt d
|¡7  _dS | j d¡ |  jt d|¡7  _dS )zzVariable-length operand encoding, confirmed in batch 4: used for
        both literal values and variable-slot references.r   ì   ÿÿ zoperand value z out of representable ranger   éÿ   rb   éÿÿ  rc   ú<Hé   z<IN)ry   rµ   r¿   ÚstructÚpack)rŽ   rÅ   rm   rm   rq   Úemit_operand  s   zCodeGenerator.emit_operandÚverbc                 C  s4   | j  d¡ t| j ƒ}|  j d7  _ | j  |¡ |S )z¡Emit [0x03][2-byte placeholder address][verb]; return the offset
        of the 2-byte field so the caller can patch it once the target
        address is known.rc   s     )rµ   r¿   Úlen)rŽ   rÎ   rÃ   rm   rm   rq   Úemit_branch(  s
   
zCodeGenerator.emit_branchrÃ   Útargetc                 C  s6   |dk s|dkrt dƒ‚t d|¡| j||d …< d S )Nr   rÈ   zÁbranch target exceeds the 2-byte address field -- program too large (this limit was never actually confirmed against real hardware/RoborunPlus, only assumed from every test program being small)rÉ   rb   )ry   rË   rÌ   rµ   )rŽ   rÃ   rÑ   rm   rm   rq   rÂ   2  s
   ÿzCodeGenerator.patch_branchc                 C  s   |   |  |¡|¡ d S r¤   )rÂ   rÐ   )rŽ   rÎ   rÑ   rm   rm   rq   Úemit_goto_addr<  s   zCodeGenerator.emit_goto_addrÚexprr   c                 C  s  t |tƒr|  |j¡ d S t |tƒr!|  |jrd¡ d S d¡ d S t |tƒr-|  |¡ d S t |tƒrC|  |j	¡ | j
 t|j ¡ d S t |tƒr_|  |j¡ |  |j¡ | j
 t|j ¡ d S t |tƒrk|  |¡ d S t |tƒr||  |j|j|j¡ d S t |tƒr…tdƒ‚td|›ƒ‚)NrÆ   r   z3string literals can only be used as Print argumentszunsupported expression node: )r¥   r   rÍ   rÅ   r   r#   Ú_emit_load_refr"   Ú	emit_exprÚoperandrµ   r¿   ÚUNARY_OPCODESÚopr   ÚleftÚrightÚBINOP_OPCODESr	   Ú	emit_callr   Ú_emit_incdecÚvarÚprefixr    ry   )rŽ   rÓ   rm   rm   rq   rÕ   A  s(   







zCodeGenerator.emit_exprNÚrefr#   ú
str | Nonec                 C  sÄ   |j  d¡r |jd urtd|j › dƒ‚|  t|j |d¡ d S |jd urE| j |j ¡\}}}|  ||j¡ | j	 
|r@t¡ d S t¡ d S | j |j ¡\}}|  |¡ | j	 
|r]t¡ d S t¡ d S )Nr¬   rš   z%' is a command constant, not an array©rÎ   )ro   Ú
startswithÚindexry   rÍ   r&   r¶   rž   Ú_emit_array_addressrµ   r¿   ÚOP_LOAD_BOOLÚOP_LOAD_INTr›   )rŽ   rà   rÎ   r—   r‚   Ú_lengthrŸ   rm   rm   rq   rÔ   Y  s   

ÿ
zCodeGenerator._emit_load_refc                 C  s„   |j d ur%| j |j¡\}}}|  ||j ¡ | j |r t¡ d S t¡ d S | j 	|j¡\}}|  
|¡ | j |r=t¡ d S t¡ d S r¤   )rä   r¶   rž   ro   rå   rµ   r¿   ÚOP_STORE_BOOLÚOP_STORE_INTr›   rÍ   )rŽ   rà   r—   r‚   rè   rŸ   rm   rm   rq   Ú_emit_store_refh  s   
ÿ
zCodeGenerator._emit_store_refr   Ú
index_exprc                 C  s$   |   |¡ |  |¡ | j t¡ d S r¤   )rÍ   rÕ   rµ   r¿   ÚOP_ADD)rŽ   r   rì   rm   rm   rq   rå   r  s   

z!CodeGenerator._emit_array_addressÚcallr	   c           
      C  sx  |j  ¡ }|tv rŽt| \}}}t|jƒ}t|ƒ|krn@|d ur:t|ƒ|d kr:|d |… tdƒg ||d …  }n"|› d}|d urM|d|d › d7 }t|j › d|› dt|ƒ› ƒ‚|d }t|t	ƒrs|j  
d¡rs| j||d	 n|  |¡ |dd … D ]}	|  |	¡ q~| j |¡ d S |tv r³t|jƒdkr¡t|j › d
ƒ‚|  |jd ¡ | j t| ¡ d S td|j › dƒ‚)Nr   r   z
 argumentsz (or z, omitting the optional Index)z	 expects z, got r¬   râ   z expects exactly 1 argumentzunknown function 'rš   )ro   r•   rl   r²   ÚargsrÏ   r   ry   r¥   r#   rã   rÔ   rÕ   rµ   r¿   ÚBUILTIN_UNARY_VERBS)
rŽ   rî   ro   rÎ   Ú
full_arityÚoptional_posrï   ÚexpectedÚitem_argÚargrm   rm   rq   rÜ   w  s6   

$

zCodeGenerator.emit_callrÞ   r   rØ   rß   r   c                 C  sÔ   | j  |¡\}}|rtdƒ‚|dkrtnt}|rA|  |¡ | j t¡ | j |¡ |  |¡ | j t	¡ |  |¡ | j t¡ d S |  |¡ | j t¡ |  |¡ | j t¡ | j |¡ |  |¡ | j t	¡ d S ©Nz0'++'/'--' are not supported on Boolean variablesz++)
r¶   r›   ry   ÚOP_INCÚOP_DECrÍ   rµ   r¿   rç   rê   )rŽ   rÞ   rØ   rß   rŸ   r‚   rÎ   rm   rm   rq   rÝ   Ÿ  s   zCodeGenerator._emit_incdecr¢   r£   c                 C  s   |D ]}|   |¡ qd S r¤   )Ú	emit_stmt)rŽ   r¢   r«   rm   rm   rq   r½   ´  s   ÿzCodeGenerator.emit_blockÚstmtr   c                 C  sf  t |tƒrd S t |tƒrd S t |tƒr|  |¡ d S t |tƒr-|  |j¡ |  |j	¡ d S t |t
ƒr9|  |¡ d S t |tƒrE|  |¡ d S t |tƒrQ|  |¡ d S t |tƒr]|  |¡ d S t |tƒri|  |¡ d S t |tƒru|  |¡ d S t |tƒr|  |¡ d S t |tƒr–|  t¡}| j ||jf¡ d S t |tƒr«|  t¡}| j ||jf¡ d S t |t ƒr¸| j! t"¡ d S t |t#ƒrÅ| j! t$¡ d S t |t%ƒrØ|  |j&¡ | j! t'¡ d S t |t(ƒrä|  )|¡ d S t |t*ƒrú|  +|j,¡}|j- |  t¡¡ d S t |t.ƒr|  +|j,¡}|j/ |  t¡¡ d S t |t0ƒr|  1|¡ d S t |t2ƒr,|  3|j4¡ d S t5d|›ƒ‚)Nzunsupported statement node: )6r¥   r   r   r   Ú_emit_labelr   rÕ   rÅ   rë   rÑ   r   Ú_emit_ifr%   Ú_emit_whiler   Ú_emit_do_untilr   Ú_emit_do_loop_whiler   Ú_emit_do_loop_untilr   Ú_emit_for_traditionalr   Ú_emit_for_cstyler   rÐ   ÚV_GOTOr¸   r¿   rÄ   r   ÚV_GOSUBr   rµ   Ú	OP_RETURNr!   ÚOP_TERMINATEr$   ÚmillisecondsÚOP_WAITr   Ú_emit_printr   Ú_find_loop_ctxr®   r±   r
   r°   r   Ú_emit_incdec_stmtr   rÜ   rî   ry   )rŽ   rú   ÚpÚctxrm   rm   rq   rù   ¸  sn   



















zCodeGenerator.emit_stmtr   c                 C  s:   |j  ¡ }|| jv rtd|j › dƒ‚t| jƒ| j|< d S )Nzlabel 'z' defined more than once)ro   r•   r·   ry   rÏ   rµ   )rŽ   rú   r–   rm   rm   rq   rû   ñ  s   

zCodeGenerator._emit_labelr   c                 C  sl   | j  |j¡\}}|rtdƒ‚|jdkrtnt}|  |¡ | j 	t
¡ | j 	|¡ |  |¡ | j 	t¡ d S rö   )r¶   r›   rÞ   ry   rØ   r÷   rø   rÍ   rµ   r¿   rç   rê   )rŽ   rú   rŸ   r‚   rÎ   rm   rm   rq   r  ÷  s   zCodeGenerator._emit_incdec_stmtr   c                   s
  |j D ]}t|tƒrQ|jjddd‰ ‡ fdd„tdtˆ ƒdƒD ƒ}t|ƒD ]*\}}|dkr:|  t	dƒ¡ | j
 t¡ | j
 t¡ | j
 t|ƒ¡ |  j
|7  _
q%qt|tƒrw|j ¡ d	krwt|j ƒdkrhtd
ƒ‚|  |j d ¡ | j
 t¡ q|  |¡ | j
 t¡ qd S )Nzlatin-1Úreplace)Úerrorsc                   s   g | ]
}ˆ ||d  … ‘qS )rB   rm   )rn   Úi©Údatarm   rq   Ú
<listcomp>  s    z-CodeGenerator._emit_print.<locals>.<listcomp>r   rB   r   rx   z!ToBool expects exactly 1 argument)rï   r¥   r    rÅ   ÚencodeÚrangerÏ   Ú	enumeraterÕ   r   rµ   r¿   r  Ú	OP_STRINGr	   ro   r•   ry   ÚOP_PRINT_BOOLÚOP_PRINT_INT)rŽ   rú   rõ   ÚchunksÚidxÚchunkrm   r  rq   r	     s(   

ú
ázCodeGenerator._emit_printr®   r­   c                 C  s2   t | jƒD ]}|j|kr|  S qtd|› dƒ‚)Nrš   z/' Exit/Continue used outside of a matching loop)Úreversedr¹   r®   ry   )rŽ   r®   r  rm   rm   rq   r
  "  s
   
ÿzCodeGenerator._find_loop_ctxr   c                 C  sÊ   |j |jfg|j }|jd u}t|ƒ}g }t|ƒD ]1\}\}}|  |¡ |  t¡}	|  	|¡ ||d ko6| }
|
sA| 
|  t¡¡ |  |	t| jƒ¡ q|rS|  	|j¡ t| jƒ}|D ]}|  ||¡ qZd S )Nr   )Ú	conditionr§   r¨   r©   rÏ   r  rÕ   rÐ   ÚV_BRANCH_IF_FALSEr½   r¿   r  rÂ   rµ   )rŽ   rú   ÚclausesÚhas_elseÚnÚend_patchesr  Úcondrª   Úfalse_patchÚis_last_clauseÚend_addrr  rm   rm   rq   rü   *  s$   




ÿzCodeGenerator._emit_ifr%   c                 C  ó¢   t | jƒ}|  |j¡ |  t¡}tdd}| j |¡ |  	|j
¡ | j ¡  |jD ]}|  ||¡ q)|  t|¡ t | jƒ}|  ||¡ |jD ]}|  ||¡ qFd S )NÚWhile©r®   )rÏ   rµ   rÕ   r  rÐ   r  r­   r¹   r¿   r½   rª   Úpopr°   rÂ   rÒ   r  r±   ©rŽ   rú   ÚtopÚ
exit_patchr  r  r'  rm   rm   rq   rý   =  ó   






ÿzCodeGenerator._emit_whiler   c                 C  r(  ©NÚDor*  )rÏ   rµ   rÕ   r  rÐ   ÚV_BRANCH_IF_TRUEr­   r¹   r¿   r½   rª   r+  r°   rÂ   rÒ   r  r±   r,  rm   rm   rq   rþ   M  r/  zCodeGenerator._emit_do_untilr   c                 C  ó–   t | jƒ}tdd}| j |¡ |  |j¡ | j ¡  t | jƒ}|jD ]}|  	||¡ q#|  
|j¡ |  t|¡ t | jƒ}|jD ]}|  	||¡ q@d S r0  )rÏ   rµ   r­   r¹   r¿   r½   rª   r+  r°   rÂ   rÕ   r  rÒ   r2  r±   ©rŽ   rú   r-  r  Ú	cond_addrr  r'  rm   rm   rq   rÿ   ]  ó   






ÿz!CodeGenerator._emit_do_loop_whiler   c                 C  r3  r0  )rÏ   rµ   r­   r¹   r¿   r½   rª   r+  r°   rÂ   rÕ   r  rÒ   r  r±   r4  rm   rm   rq   r   l  r6  z!CodeGenerator._emit_do_loop_untilr   c                 C  sˆ  | j  |j¡\}}|rtdƒ‚| j  ¡ }| j  ¡ }|  |j¡ |  |¡ | j 	t
¡ |  |j¡ |  |¡ | j 	t
¡ |jd urF|  |j¡n|  d¡ |  |¡ | j 	t
¡ t| jƒ}|  |¡ | j 	t¡ |  d¡ | j 	t¡ |  |¡ | j 	t¡ |  |¡ | j 	t¡ | j 	t¡ | j 	t¡ |  |¡ | j 	t¡ |  d¡ | j 	t¡ |  |¡ | j 	t¡ |  |¡ | j 	t¡ | j 	t¡ | j 	t¡ | j 	t¡ |  t¡}tdd}| j 	|¡ |  |j¡ | j ¡  t| jƒ}	|jD ]}
|  |
|	¡ qô|  |¡ | j 	t¡ |  |¡ | j 	t¡ | j 	t¡ |  |¡ | j 	t
¡ |  t|¡ t| jƒ}|  ||¡ |j D ]	}
|  |
|¡ q8d S )Nú!For loop variable must be Integerr   r   ÚForr*  )!r¶   r›   rÞ   ry   r    rÕ   ÚinitrÍ   rµ   r¿   rê   ÚlimitÚsteprÏ   rç   ÚOP_GEÚOP_GTÚOP_ANDÚOP_LTÚOP_ORrÐ   r2  r­   r¹   r½   rª   r+  r°   rÂ   rí   rÒ   r  r±   )rŽ   rú   Úvar_slotr‚   Ú
limit_slotÚ	step_slotr5  r.  r  Ú	incr_addrr  r'  rm   rm   rq   r  {  s\   

€









ÿz#CodeGenerator._emit_for_traditionalr   c           
      C  s<  | j  |j¡\}}|rtdƒ‚|  |j¡ |  |¡ | j t	¡ t
| jƒ}|  |j¡ |  t¡}tdd}| j |¡ |  |j¡ | j ¡  t
| jƒ}|jD ]}|  ||¡ qN|jd urc|  |j¡ n|  |¡ | j t¡ | j t¡ |  |¡ | j t	¡ |  t|¡ t
| jƒ}	|  ||	¡ |jD ]}|  ||	¡ q“d S )Nr7  r8  r*  )r¶   r›   rÞ   ry   rÕ   r9  rÍ   rµ   r¿   rê   rÏ   r  rÐ   r  r­   r¹   r½   rª   r+  r°   rÂ   Úevaluaterù   rç   r÷   rÒ   r  r±   )
rŽ   rú   rA  r‚   r-  r.  r  Úevaluate_addrr  r'  rm   rm   rq   r  µ  s4   








ÿzCodeGenerator._emit_for_cstyler¡   ©rº   r   r…   r»   )rº   r   r…   r†   )rÅ   r~   r…   r†   )rÎ   r~   r…   r~   )rÃ   r~   rÑ   r~   r…   r†   )rÎ   r~   rÑ   r~   r…   r†   )rÓ   r   r…   r†   r¤   )rà   r#   rÎ   rá   r…   r†   )rà   r#   r…   r†   )r   r~   rì   r   r…   r†   )rî   r	   r…   r†   )rÞ   r   rØ   r   rß   r   r…   r†   )r¢   r£   r…   r†   )rú   r   r…   r†   )rú   r   r…   r†   )rú   r   r…   r†   )rú   r   r…   r†   )r®   r   r…   r­   )rú   r   r…   r†   )rú   r%   r…   r†   )rú   r   r…   r†   )rú   r   r…   r†   )rú   r   r…   r†   )rú   r   r…   r†   )rú   r   r…   r†   )rz   r{   r|   r   rÁ   r¼   rÀ   rÍ   rÐ   rÂ   rÒ   rÕ   rÔ   rë   rå   rÜ   rÝ   r½   rù   rû   r  r	  r
  rü   rý   rþ   rÿ   r   r  r  rm   rm   rm   rq   r³   ø   s8    

	


	










(


9

	
"





:r³   rº   r   r…   r»   c                 C  s   t ƒ  | ¡S r¤   )r³   rÁ   )rº   rm   rm   rq   Úgenerate_bytecodeÚ  s   rH  )r¢   r£   rG  )iÚ__doc__Ú
__future__r   rË   Údataclassesr   r   Ú	ast_nodesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   Úcommandsr&   r  rç   rê   ræ   ré   rí   ÚOP_SUBÚOP_MULÚOP_DIVÚOP_MODÚOP_ABSÚOP_NEGr>  r@  ÚOP_XORÚOP_NOTr÷   rø   ÚOP_SHLÚOP_SHRÚOP_EQÚOP_NEr=  r<  r?  ÚOP_LEr2  r  r  r  r  r  r  r  r  ÚOP_SETCONFIGÚOP_GETCONFIGÚOP_SETCOMMANDÚOP_GETVALUEÚOP_GETTIMERCOUNTÚOP_SETTIMERCOUNTÚOP_SETTIMERSTATEÚOP_GETTIMERSTATEÚ	OP_TOBOOLÚOP_SQRTÚOP_SINÚOP_COSÚOP_ATANrÛ   r×   rl   rƒ   ÚitemsÚDEVICE_IO_VERBSrð   Ú	Exceptionry   r}   r„   r¦   r­   r³   rH  rm   rm   rm   rq   Ú<module>   sÀ    ˆ"ÿÿÿÿÿþþþýýüüüüüü
÷þ
@   e