Yf:[@sdZddlZddlZddlZddlmZdddgZGdddeZGdddZ d d Z Gd ddZ d d Z ddZ Gddde ZddZddZddZdS)zDebugger basicsN) CO_GENERATORBdbQuitBdb Breakpointc@seZdZdZdS)rz Exception to give up completely.N)__name__ __module__ __qualname____doc__r r (/opt/alt/python35/lib64/python3.5/bdb.pyr s c@s2eZdZdZdddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&d'Zdd(d)Zd*d+Zd,d-Zd.d/Zdd0d1Zd2d3Zd4d5Zd6ddd7d8Zd9d:Zd;d<Zd=d>Z d?d@Z!dAdBZ"dCdDZ#dEdFZ$dGdHZ%dIdJZ&dKdLZ'dMdNZ(dOdPdQZ)dddRdSZ*dddTdUZ+dVdWZ,dXdYZ-dS)ZrzGeneric Python debugger base class. This class takes care of details of the trace facility; a derived class should implement user interaction. The standard debugger class (pdb.Pdb) is an example. NcCs:|rt|nd|_i|_i|_d|_dS)N)setskipbreaksfncacheframe_returning)selfr r r r __init__s  z Bdb.__init__cCso|d|dddkr"|S|jj|}|sktjj|}tjj|}||j|<|S)N<>)rgetospathabspathnormcase)rfilenamecanonicr r r rs z Bdb.canoniccCs3ddl}|jd|_|jdddS)Nr) linecache checkcachebotframe _set_stopinfo)rrr r r reset&s   z Bdb.resetcCs|jr dS|dkr&|j|S|dkrB|j||S|dkr^|j||S|dkrz|j||S|dkr|jS|dkr|jS|dkr|jStdt||jS) NlineZcallreturnZ exceptionZc_callZ c_exceptionZc_returnz*bdb.Bdb.dispatch: unknown debugging event:)quitting dispatch_line dispatch_calldispatch_returndispatch_exceptiontrace_dispatchprintrepr)rframeZeventargr r r r*,s$         zBdb.trace_dispatchcCsA|j|s|j|r:|j||jr:t|jS)N) stop_here break_here user_liner%rr*)rr-r r r r&@s   zBdb.dispatch_linecCs|jdkr"|j|_|jS|j|p=|j|sDdS|jrd|jjt@rd|jS|j |||j rt |jS)N) r f_backr*r/break_anywhere stopframef_codeco_flagsr user_callr%r)rr-r.r r r r'Fs  zBdb.dispatch_callc Cs|j|s||jkr|jr>|jjt@r>|jSz||_|j||Wdd|_X|j rwt |j|kr|j dkr|j dd|jS)Nrr) r/ returnframer4r5r6rr*r user_returnr%r stoplinenor!)rr-r.r r r r(Vs   zBdb.dispatch_returncCs|j|ra|jjt@o<|dtko<|ddks|j|||jrtn`|jr||jk r|jjjt@r|dtt fkr|j|||jrt|j S)Nr) r/r5r6r StopIterationuser_exceptionr%rr4 GeneratorExitr*)rr-r.r r r r)fs   zBdb.dispatch_exceptioncCs.x'|jD]}tj||r dSq WdS)NTF)r fnmatch)rZ module_namepatternr r r is_skipped_moduleszBdb.is_skipped_modulecCsk|jr(|j|jjdr(dS||jkrZ|jdkrJdS|j|jkS|jsgdSdS)NrFrTr)r rA f_globalsrr4r:f_lineno)rr-r r r r/s  z Bdb.stop_herecCs|j|jj}||jkr(dS|j}||j|krg|jj}||j|krgdSt|||\}}|r|j|_|r|j r|j t |jdSdSdS)NFT) rr5 co_filenamerrCco_firstlineno effectivenumberZ currentbp temporarydo_clearstr)rr-rlinenobpZflagr r r r0s   zBdb.break_herecCstddS)Nz)subclass of bdb must implement do_clear())NotImplementedError)rr.r r r rIsz Bdb.do_clearcCs|j|jj|jkS)N)rr5rDr)rr-r r r r3szBdb.break_anywherecCsdS)znThis method is called when there is the remote possibility that we ever need to stop in this function.Nr )rr-Z argument_listr r r r7sz Bdb.user_callcCsdS)z9This method is called when we stop or break at this line.Nr )rr-r r r r1sz Bdb.user_linecCsdS)z5This method is called when a return trap is set here.Nr )rr-Z return_valuer r r r9szBdb.user_returncCsdS)zmThis method is called if an exception occurs, but only if we are to stop at or just below this level.Nr )rr-exc_infor r r r=szBdb.user_exceptionrcCs(||_||_d|_||_dS)NF)r4r8r%r:)rr4r8r:r r r r!s   zBdb._set_stopinfocCs0|dkr|jd}|j|||dS)zxStop when the line with the line no greater than the current one is reached or when returning from current frameNr)rCr!)rr-rKr r r set_untils  z Bdb.set_untilcCsE|jr1|jj}|r1|j r1|j|_|jdddS)zStop after one line of code.N)rr2f_tracer*r!)rZ caller_framer r r set_steps    z Bdb.set_stepcCs|j|ddS)z2Stop on the next line in or below the given frame.N)r!)rr-r r r set_nextsz Bdb.set_nextcCs=|jjt@r&|j|ddn|j|j|dS)z)Stop when returning from the given frame.Nrr)r5r6rr!r2)rr-r r r set_returnszBdb.set_returncCsn|dkrtjj}|jx(|rO|j|_||_|j}q(W|jtj|jdS)zpStart debugging from `frame`. If frame is not specified, debugging starts from caller's frame. N) sys _getframer2r"r*rPr rQsettrace)rr-r r r set_traces       z Bdb.set_tracecCsj|j|jdd|jsftjdtjj}x(|re||jk re|`|j}q>WdS)Nrr)r!r rrTrVrUr2rP)rr-r r r set_continues  zBdb.set_continuecCs/|j|_d|_d|_tjddS)NT)r r4r8r%rTrV)rr r r set_quits   z Bdb.set_quitFc Cs|j|}ddl}|j||}|sAd||fS|jj|g}||kro|j|t|||||} dS)NrzLine %s:%d does not exist)rrgetliner setdefaultappendr) rrrKrHcondfuncnamerr#listrLr r r set_breaks   z Bdb.set_breakcCsD||ftjkr)|j|j||j|s@|j|=dS)N)rbplistrremove)rrrKr r r _prune_breaks!s zBdb._prune_breakscCs|j|}||jkr&d|S||j|krGd||fSx/tj||fddD]}|jqeW|j||dS)NzThere are no breakpoints in %szThere is no breakpoint at %s:%d)rrrradeleteMerc)rrrKrLr r r clear_break's$zBdb.clear_breakcCsiy|j|}Wn/tk rD}zt|SWYdd}~XnX|j|j|j|jdS)N)get_bpbynumber ValueErrorrJrdrcfiler#)rr.rLerrr r r clear_bpbynumber3s  zBdb.clear_bpbynumbercCsz|j|}||jkr&d|SxC|j|D]4}tj||f}x|D]}|jqTWq4W|j|=dS)NzThere are no breakpoints in %s)rrrrard)rrr#ZblistrLr r r clear_all_file_breaks;s zBdb.clear_all_file_breakscCs>|js dSx!tjD]}|r|jqWi|_dS)NzThere are no breakpoints)rr bpbynumberrd)rrLr r r clear_all_breaksEs  zBdb.clear_all_breakscCs|stdyt|}Wn"tk rFtd|YnXytj|}Wn"tk r|td|YnX|dkrtd||S)NzBreakpoint number expectedz Non-numeric breakpoint number %sz!Breakpoint number %d out of rangezBreakpoint %d already deleted)rgintrrl IndexError)rr.rGrLr r r rfMs    zBdb.get_bpbynumbercCs/|j|}||jko.||j|kS)N)rr)rrrKr r r get_break\sz Bdb.get_breakcCsH|j|}||jkrD||j|krDtj||fpGgS)N)rrrra)rrrKr r r get_breaksaszBdb.get_breakscCs1|j|}||jkr)|j|SgSdS)N)rr)rrr r r get_file_breaksgs zBdb.get_file_breakscCs|jS)N)r)rr r r get_all_breaksnszBdb.get_all_breakscCsg}|r$|j|kr$|j}x?|dk re|j||jf||jkrYP|j}q'W|jtdt|d}x2|dk r|j|j|j f|j}qW|dkrtdt|d}||fS)Nrr) tb_frametb_nextr\rCr r2reversemaxlen tb_lineno)rftstackir r r get_stackts      z Bdb.get_stackz: c Cs,ddl}ddl}|\}}|j|jj}d||f}|jjrh||jj7}n |d7}d|jkr|jd} nd} | r||j| 7}n |d7}d|jkr|jd} |d7}||j| 7}|j|||j } | r(||| j 7}|S)Nrz%s(%r)zZ__args__z()Z __return__z->) rreprlibrr5rDco_namef_localsr,rZrBstrip) rZ frame_linenoZlprefixrrr-rKrsargsrvr#r r r format_stack_entrys*      zBdb.format_stack_entrycCs|dkr!ddl}|j}|dkr3|}|jt|tr^t|dd}tj|jz-yt |||Wnt k rYnXWdd|_ tjdXdS)NrzexecT) __main____dict__r" isinstancerJcompilerTrVr*rrr%)rcmdglobalslocalsrr r r runs        zBdb.runcCs|dkr!ddl}|j}|dkr3|}|jtj|jz-yt|||SWntk rxYnXWdd|_tjdXdS)NrT) rrr"rTrVr*evalrr%)rexprrrrr r r runevals        z Bdb.runevalcCs|j|||dS)N)r)rrrrr r r runctxsz Bdb.runctxcOsj|jtj|jd}z,y|||}Wntk rJYnXWdd|_tjdX|S)NT)r"rTrVr*rr%)rfuncrkwdsresr r r runcalls    z Bdb.runcall).rrrr rrr"r*r&r'r(r)rAr/r0rIr3r7r1r9r=r!rOrQrRrSrWrXrYr`rcrerjrkrmrfrprqrrrsr~rrrrrr r r r rsX                              cCstjdS)N)rrWr r r r rWsrWc@seZdZdZdZiZdgZdddddZddZd d Z d d Z dd dZ ddZ ddZ dS)raBreakpoint class. Implements temporary breakpoints, ignore counts, disabling and (re)-enabling, and conditionals. Breakpoints are indexed by number through bpbynumber and by the file,line tuple using bplist. The former points to a single instance of class Breakpoint. The latter points to a list of such instances since there may be more than one breakpoint per line. rNFcCs||_d|_||_||_||_||_d|_d|_d|_t j |_ t j d7_ |j j |||f|jkr|j||fj |n|g|j||fq|jd7_|js|jdkrz|jd8_qq|dfSqyPt|j|j|j }|r|jdkr|jd8_n |dfSWq|dfSYqXqWdS)zDetermine which breakpoint for this file:line is to be acted upon. Called only if we know there is a bpt at this location. Returns breakpoint that was triggered and a flag that indicates if it is ok to delete a temporary bp. rrTFN)NN) rrarrrr]rrrBr)rhr#r-Z possiblesrvalr r r rFTs*    rFc@s@eZdZddZddZddZddZd S) TdbcCs,|jj}|sd}td||dS)Nz???z+++ call)r5rr+)rr-rnamer r r r7s z Tdb.user_callcCszddl}|jj}|s$d}|j|jj}|j||j|j}td||j|d|j dS)Nrz???z+++:) rr5rrrDrZrCrBr+r)rr-rrfnr#r r r r1s  z Tdb.user_linecCstd|dS)Nz +++ return)r+)rr-Zretvalr r r r9szTdb.user_returncCstd||jdS)Nz +++ exception)r+rX)rr-Z exc_stuffr r r r=s zTdb.user_exceptionN)rrrr7r1r9r=r r r r rs    rcCs1td|dt|d}td|dS)Nzfoo() z bar returned)r+bar)nxr r r foosrcCstd|d|dS)Nzbar(rr;)r+)ar r r rsrcCst}|jddS)Nzimport bdb; bdb.foo(10))rr)r{r r r tests r)r r?rTrinspectr__all__ ExceptionrrrWrrrFrrrrr r r r s     Z  0