o
    ?e                     @   s   d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 G d	d
 d
eZdaG dd deZG dd dejZdd ZdS )zHandles function calls, by generating compiled function names and calls.

Note: this transformer does not rename the top level object being converted;
that is the caller's responsibility.

Requires function_scopes.
    N)	converter)anno)parser)
qual_names)	templates)
ag_loggingc                   @   s   e Zd ZdZdd ZdS )	_FunctionTc                 C   s
   d | _ d S N)context_nameself r   r/home/www/facesmatcher.com/pyenv/lib/python3.10/site-packages/tensorflow/python/autograph/converters/call_trees.py__init__(   s   
z_Function.__init__N)__name__
__module____qualname__Zno_rootr   r   r   r   r   r   $   s    r   Fc                   @   @   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )_ArgTemplateBuilderzConstructs a tuple representing the positional arguments in a call.

  Example (yes, it's legal Python 3):

      f(*args1, b, *args2, c, d)  ->  args1 + (b,) + args2 + (c, d)
  c                 C   s   g | _ g | _d| _d S )NF)_arg_accumulator_argspec
_finalizedr   r   r   r   r   7   s   
z_ArgTemplateBuilder.__init__c                 C   s0   | j r| jtj| j t d g | _ d S d S )N)eltsctx)r   r   appendgastTupleLoadr   r   r   r   _consume_args<   s   
z!_ArgTemplateBuilder._consume_argsc                 C   s   | j | d S r	   )r   r   r   ar   r   r   add_argB   s   z_ArgTemplateBuilder.add_argc              	   C   s8   |    | jtjtjdt d d d|gdd d S )Ntupler   
annotationtype_commentr   argskeywords)r   r   r   r   CallNamer   r   r   r   r   add_starargE   s   z_ArgTemplateBuilder.add_starargc                 C   s   |    d| _d S )NT)r   r   r   r   r   r   finalizeN   s   
z_ArgTemplateBuilder.finalizec                 C   s\   | j sJ | jr&| jd }tdt| jD ]}t|t | j| }q|S tg t S )Nr      )	r   r   rangelenr   BinOpAddr   r   )r   resultir   r   r   to_astR   s   

z_ArgTemplateBuilder.to_astN)
r   r   r   __doc__r   r   r!   r+   r,   r4   r   r   r   r   r   /   s    	r   c                   @   r   )CallTreeTransformerz9Transforms the call tree by renaming transformed symbols.c                 C   s\   t |ds| |S | jt }t |d|_| |W  d    S 1 s'w   Y  d S )Nfunction_context_name)r   hasannogeneric_visitstater   getannor
   )r   nodefn_scoper   r   r   visit_Lambda_   s   
$z CallTreeTransformer.visit_Lambdac                 C   s   |  |j|_|  |jj|j_t|jjD ]\}}|d ur'| ||jj|< q| jt ,}t	
|ds8J dt	|d|_|  |j|_|jrP| |j|_|W  d    S 1 s\w   Y  d S )Nr7   zCThe function_scopes converter always creates a scope for functions.)visit_blockdecorator_listr'   defaults	enumeratekw_defaultsvisitr:   r   r   r8   r;   r
   bodyreturns)r   r<   r3   dr=   r   r   r   visit_FunctionDefh   s    $z%CallTreeTransformer.visit_FunctionDefc                 C   s   |  |j|_|S r	   )r?   rE   r   r<   r   r   r   
visit_Withz   s   zCallTreeTransformer.visit_Withc                 C   sF   t  }|jD ]}t|tjr||j q|| q|  |	 S )zBTies together all positional and *arg arguments in a single tuple.)
r   r'   
isinstancer   Starredr+   valuer!   r,   r4   )r   r<   Zbuilderr    r   r   r   _args_to_tuple   s   	
z"CallTreeTransformer._args_to_tuplec                 C   s4   |j rtjtjdt dddd|j dS tdS )zATies together all keyword and **kwarg arguments in a single dict.dictNr#   r   r&   None)r(   r   r)   r*   r   r   Zparse_expressionrI   r   r   r   _kwargs_to_dict   s   
z#CallTreeTransformer._kwargs_to_dictc                 C   s   t tj|jtjjdd}| jt j}| 	|}|
dr|S |
|d r(|S |dv r7ts5td da|S |dkrG| jjjtjjsG|S d	}tj||j| || ||d
}|S )N )defaultzag__..)zpdb.set_tracezipdb.set_trace
breakpointzDetected `pdb.set_trace()` in user code. The code generated by AutoGraph is not optimized for step-by-step debugging. See https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/autograph/g3doc/reference/debugging.md.TprintzA
      ag__.converted_call(func, args, kwargs, function_ctx)
    )funcr'   kwargsZfunction_ctx)strr   r;   rW   ZBasicZQNr:   r   r
   r9   
startswithset_trace_warnedr   warningr   useroptionsZusesr   ZFeatureZBUILTIN_FUNCTIONSr   Zreplace_as_expressionrN   rQ   )r   r<   Z	full_namer7   templateZnew_callr   r   r   
visit_Call   s6   

zCallTreeTransformer.visit_CallN)
r   r   r   r5   r>   rH   rJ   rN   rQ   r`   r   r   r   r   r6   \   s    	r6   c                 C   s   t | } t|| } | S )zTransform function call to the compiled counterparts.

  Args:
    node: AST
    ctx: EntityContext
  Returns:
    A tuple (node, new_names):
        node: The transformed AST
        new_names: set(string), containing any newly-generated names
  )r   resolver6   rD   )r<   r   r   r   r   	transform   s   
rb   )r5   r   Z tensorflow.python.autograph.corer   Z tensorflow.python.autograph.pyctr   r   r   r   Z!tensorflow.python.autograph.utilsr   objectr   r[   r   ZBaser6   rb   r   r   r   r   <module>   s   -s