ϪfUdZddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z m Z eja GddZiZe eefed <d Zd ZGd d eZdZdZddZy)z& *Real* reloading support for Python. N)reload) ModuleType)Dict)logreflectc&eZdZdZeZdZdZdZy) Sensitivez A utility mixin that's sensitive to rebuilds. This is a mixin for classes (usually those which represent collections of callbacks) to make sure that their code is up-to-date before running. c,|jtk}|SN) lastRebuild)selfyns 8/usr/lib/python3/dist-packages/twisted/python/rebuild.pyneedRebuildUpdatezSensitive.needRebuildUpdate$s    + c6tj|_yr )timer r s rrebuildUpToDatezSensitive.rebuildUpToDate(s99;rc@t|}|tjk(r t|S|tjk(rL|j t |j|jSt |j |jStjd|S)z Get the latest version of an object. This can handle just about anything callable; instances, functions, methods, and classes. zwarning returning anObject!) typetypes FunctionTypelatestFunction MethodType__self__getattrim_class__name__rmsg)r anObjectts rlatestVersionOfzSensitive.latestVersionOf+s N "" "!(+ + %"" "  (x00(2C2CDDx00(2C2CDD GG1 2OrN)r __module__ __qualname____doc__r rrr#rrr r sK'rr _modDictIDMapct|j}tj|}||St ||j S)z/ Get the latest version of a function. )id __globals__r(getrr)oldFuncdictIDmodules rrrBsA ## $F   v &F ~ 67++ ,,rctj|j}t||j}|j Dcgc] }t |}}|jdk(r|S t||_|Scc}w#t$r>t|}||jt|t|jcYSwxYw)z, Get the latest version of a class. builtins) r namedModuler$rr __bases__ latestClasstuple TypeErrorrdict__dict__)oldClassr/newClassbasenewBasesctors rr4r4Os !4!4 5Fvx001H.6.@.@Ad D!AHAj(Q"8_B QH~H%%uXX=N=N8OPPQsA<*BACCceZdZdZy) RebuildErrorzT Exception raised when trying to rebuild a class whereas it's not possible. N)rr$r%r&r'rrr?r?dsrr?c8t|j|_y)z, Updates an instance to be current. N)r4 __class__rs rupdateInstancerBjs!0DNrc|dk(r tdt|tjdt j |j d|dt||}|S)z< A getattr method to cause a class to be refreshed. __del__zWithout this, Python segfaults.z(rebuilding stale z instance (z)))AttributeErrorrBrr rqualrAr)r nameresults r__injectedgetattr__rIqs[ y>??4GG dnn!= >k$r RS T4 F Mrc tjat|dr|js t d|r,t j dt|jdddl m }d|_ |j}|tt|<i}i}i}i}|r,t j dt|jd |jD]\}} t!t#| t$j&r_| j(|jusBd || <|sJt j*j-d t j*j/t1| t"s| j2|jk(sd || <|st j*j-d t j*j/|j5||j5||j6} |j9}|j9}|j9}|rAt j d t j dt|jdt;|t=j>|r,t j dt|jd |D]} tA|| j| ur-t j dtCjD| dH|r=t j*j-dt j*j/d| _#| jjItJ| _&|j| _|rddl'} |D]} tA|| j}|| ur8t j djQtCjD| U jS| D]}tA|dd| us||_*|rAt j d t j dt|jd d}tVjXjD] \}}|d z}||k(s|t|ds!t|dr.d}|jjD]s\}} t[| | | s|r=t j*j-d t j*j/t_| }d }ta|||u|s|r|dzdk(st j*j-dt j*j/d|_ |rAt j d t j dt|jd|S#t\$rYwxYw)zO Reload a module and do as much as possible to replace its references. ALLOW_TWISTED_REBUILDzI am not allowed to be rebuilt.z Rebuilding z...r) componentsTz (scanning z): foz (reload )z (cleaning zWARNING: class z not replaced by reload!xr'Nz-WARNING: new-class {} not replaced by reload!rAz (fixing __file__ __bundle__ .Fz Rebuilt )1rr hasattrrK RuntimeErrorrr strrtwisted.pythonrLALLOW_DUPLICATESr8r(r*items issubclassrrrr+logfilewriteflush isinstancer$update __contains__keysr linecache clearcacherrrFr3clearrI __getattr__gcformat get_referrersrAsysmoduleshash Exceptionrsetattr)r/doLogrLd newclassesclasses functionsvalueskv fromOldModuleclazzrinclassgarmodcountmkmodchangednvs rrebuildr}s ))+Kv./++@A A  +c&//23378*"&JA!M"Q%JGI F  ,s6??34C89 (1 d1gu11 2}}/ ! KK%%c*KK%%' 4 ||v. ! 1 KK%%c*KK%%' ( MM' MM)''M"JllnG I    ,s6??34A67 6N   ,s6??34C89 / 65>> *e 3 GGogll5&9%::RS T !!#& !!# EO NN " 3E %E  / % VV__ - < GG?FFLL(  %%f- %1k40F:"$AK % %    ,s6??34C89H;;$$& Ca< &=CK sJ'  3 % LL&&( $DAq QQKK%%c*KK%%'#A&Q# $ x"}&: KK  c " KK   ? B#(J    +c&//23156 M#  s W WW)rM)r&rerlrr importlibrrtypingrrZrrr r r(int__annotations__rr4ror?rBrIrr'rrrs|  (diik ""J(* tCO$) -Q*9 1 }r