亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? xref.pm

?? ARM上的如果你對底層感興趣
?? PM
字號:
package B::Xref;

=head1 NAME

B::Xref - Generates cross reference reports for Perl programs

=head1 SYNOPSIS

perl -MO=Xref[,OPTIONS] foo.pl

=head1 DESCRIPTION

The B::Xref module is used to generate a cross reference listing of all
definitions and uses of variables, subroutines and formats in a Perl program.
It is implemented as a backend for the Perl compiler.

The report generated is in the following format:

    File filename1
      Subroutine subname1
	Package package1
	  object1        C<line numbers>
	  object2        C<line numbers>
	  ...
	Package package2
	...

Each B<File> section reports on a single file. Each B<Subroutine> section
reports on a single subroutine apart from the special cases
"(definitions)" and "(main)". These report, respectively, on subroutine
definitions found by the initial symbol table walk and on the main part of
the program or module external to all subroutines.

The report is then grouped by the B<Package> of each variable,
subroutine or format with the special case "(lexicals)" meaning
lexical variables. Each B<object> name (implicitly qualified by its
containing B<Package>) includes its type character(s) at the beginning
where possible. Lexical variables are easier to track and even
included dereferencing information where possible.

The C<line numbers> are a comma separated list of line numbers (some
preceded by code letters) where that object is used in some way.
Simple uses aren't preceded by a code letter. Introductions (such as
where a lexical is first defined with C<my>) are indicated with the
letter "i". Subroutine and method calls are indicated by the character
"&".  Subroutine definitions are indicated by "s" and format
definitions by "f".

=head1 OPTIONS

Option words are separated by commas (not whitespace) and follow the
usual conventions of compiler backend options.

=over 8

=item C<-oFILENAME>

Directs output to C<FILENAME> instead of standard output.

=item C<-r>

Raw output. Instead of producing a human-readable report, outputs a line
in machine-readable form for each definition/use of a variable/sub/format.

=item C<-D[tO]>

(Internal) debug options, probably only useful if C<-r> included.
The C<t> option prints the object on the top of the stack as it's
being tracked. The C<O> option prints each operator as it's being
processed in the execution order of the program.

=back

=head1 BUGS

Non-lexical variables are quite difficult to track through a program.
Sometimes the type of a non-lexical variable's use is impossible to
determine. Introductions of non-lexical non-scalars don't seem to be
reported properly.

=head1 AUTHOR

Malcolm Beattie, mbeattie@sable.ox.ac.uk.

=cut

use strict;
use B qw(peekop class comppadlist main_start svref_2object walksymtable);

# Constants (should probably be elsewhere)
sub OPpLVAL_INTRO () { 128 }
sub SVf_POK () { 0x40000 }

sub UNKNOWN { ["?", "?", "?"] }

my @pad;			# lexicals in current pad
				# as ["(lexical)", type, name]
my %done;			# keyed by $$op: set when each $op is done
my $top = UNKNOWN;		# shadows top element of stack as
				# [pack, type, name] (pack can be "(lexical)")
my $file;			# shadows current filename
my $line;			# shadows current line number
my $subname;			# shadows current sub name
my %table;			# Multi-level hash to record all uses etc.
my @todo = ();			# List of CVs that need processing

my %code = (intro => "i", used => "",
	    subdef => "s", subused => "&",
	    formdef => "f", meth => "->");


# Options
my ($debug_op, $debug_top, $nodefs, $raw);

sub process {
    my ($var, $event) = @_;
    my ($pack, $type, $name) = @$var;
    if ($type eq "*") {
	if ($event eq "used") {
	    return;
	} elsif ($event eq "subused") {
	    $type = "&";
	}
    }
    $type =~ s/(.)\*$/$1/g;
    if ($raw) {
	printf "%-16s %-12s %5d %-12s %4s %-16s %s\n",
	    $file, $subname, $line, $pack, $type, $name, $event;
    } else {
	# Wheee
	push(@{$table{$file}->{$subname}->{$pack}->{$type.$name}->{$event}},
	    $line);
    }
}

sub load_pad {
    my $padlist = shift;
    my ($namelistav, @namelist, $ix);
    @pad = ();
    return if class($padlist) eq "SPECIAL";
    ($namelistav) = $padlist->ARRAY;
    @namelist = $namelistav->ARRAY;
    for ($ix = 1; $ix < @namelist; $ix++) {
	my $namesv = $namelist[$ix];
	next if class($namesv) eq "SPECIAL";
	my ($type, $name) = $namesv->PV =~ /^(.)(.*)$/;
	$pad[$ix] = ["(lexical)", $type, $name];
    }
}

sub xref {
    my $start = shift;
    my $op;
    for ($op = $start; $$op; $op = $op->next) {
	last if $done{$$op}++;
	warn sprintf("top = [%s, %s, %s]\n", @$top) if $debug_top;
	warn peekop($op), "\n" if $debug_op;
	my $ppname = $op->ppaddr;
	if ($ppname =~ /^pp_(or|and|mapwhile|grepwhile)$/) {
	    xref($op->other);
	} elsif ($ppname eq "pp_match" || $ppname eq "pp_subst") {
	    xref($op->pmreplstart);
	} elsif ($ppname eq "pp_substcont") {
	    xref($op->other->pmreplstart);
	    $op = $op->other;
	    redo;
	} elsif ($ppname eq "pp_cond_expr") {
	    # pp_cond_expr never returns op_next
	    xref($op->true);
	    $op = $op->false;
	    redo;
	} elsif ($ppname eq "pp_enterloop") {
	    xref($op->redoop);
	    xref($op->nextop);
	    xref($op->lastop);
	} elsif ($ppname eq "pp_subst") {
	    xref($op->pmreplstart);
	} else {
	    no strict 'refs';
	    &$ppname($op) if defined(&$ppname);
	}
    }
}

sub xref_cv {
    my $cv = shift;
    my $pack = $cv->GV->STASH->NAME;
    $subname = ($pack eq "main" ? "" : "$pack\::") . $cv->GV->NAME;
    load_pad($cv->PADLIST);
    xref($cv->START);
    $subname = "(main)";
}

sub xref_object {
    my $cvref = shift;
    xref_cv(svref_2object($cvref));
}

sub xref_main {
    $subname = "(main)";
    load_pad(comppadlist);
    xref(main_start);
    while (@todo) {
	xref_cv(shift @todo);
    }
}

sub pp_nextstate {
    my $op = shift;
    $file = $op->filegv->SV->PV;
    $line = $op->line;
    $top = UNKNOWN;
}

sub pp_padsv {
    my $op = shift;
    $top = $pad[$op->targ];
    process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
}

sub pp_padav { pp_padsv(@_) }
sub pp_padhv { pp_padsv(@_) }

sub deref {
    my ($var, $as) = @_;
    $var->[1] = $as . $var->[1];
    process($var, "used");
}

sub pp_rv2cv { deref($top, "&"); }
sub pp_rv2hv { deref($top, "%"); }
sub pp_rv2sv { deref($top, "\$"); }
sub pp_rv2av { deref($top, "\@"); }
sub pp_rv2gv { deref($top, "*"); }

sub pp_gvsv {
    my $op = shift;
    my $gv = $op->gv;
    $top = [$gv->STASH->NAME, '$', $gv->NAME];
    process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
}

sub pp_gv {
    my $op = shift;
    my $gv = $op->gv;
    $top = [$gv->STASH->NAME, "*", $gv->NAME];
    process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used");
}

sub pp_const {
    my $op = shift;
    my $sv = $op->sv;
    $top = ["?", "",
	    (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK) ? $sv->PV : "?"];
}

sub pp_method {
    my $op = shift;
    $top = ["(method)", "->".$top->[1], $top->[2]];
}

sub pp_entersub {
    my $op = shift;
    if ($top->[1] eq "m") {
	process($top, "meth");
    } else {
	process($top, "subused");
    }
    $top = UNKNOWN;
}

#
# Stuff for cross referencing definitions of variables and subs
#

sub B::GV::xref {
    my $gv = shift;
    my $cv = $gv->CV;
    if ($$cv) {
	#return if $done{$$cv}++;
	$file = $gv->FILEGV->SV->PV;
	$line = $gv->LINE;
	process([$gv->STASH->NAME, "&", $gv->NAME], "subdef");
	push(@todo, $cv);
    }
    my $form = $gv->FORM;
    if ($$form) {
	return if $done{$$form}++;
	$file = $gv->FILEGV->SV->PV;
	$line = $gv->LINE;
	process([$gv->STASH->NAME, "", $gv->NAME], "formdef");
    }
}

sub xref_definitions {
    my ($pack, %exclude);
    return if $nodefs;
    $subname = "(definitions)";
    foreach $pack (qw(B O AutoLoader DynaLoader Config DB VMS
		      strict vars FileHandle Exporter Carp)) {
        $exclude{$pack."::"} = 1;
    }
    no strict qw(vars refs);
    walksymtable(\%{"main::"}, "xref", sub { !defined($exclude{$_[0]}) });
}

sub output {
    return if $raw;
    my ($file, $subname, $pack, $name, $ev, $perfile, $persubname,
	$perpack, $pername, $perev);
    foreach $file (sort(keys(%table))) {
	$perfile = $table{$file};
	print "File $file\n";
	foreach $subname (sort(keys(%$perfile))) {
	    $persubname = $perfile->{$subname};
	    print "  Subroutine $subname\n";
	    foreach $pack (sort(keys(%$persubname))) {
		$perpack = $persubname->{$pack};
		print "    Package $pack\n";
		foreach $name (sort(keys(%$perpack))) {
		    $pername = $perpack->{$name};
		    my @lines;
		    foreach $ev (qw(intro formdef subdef meth subused used)) {
			$perev = $pername->{$ev};
			if (defined($perev) && @$perev) {
			    my $code = $code{$ev};
			    push(@lines, map("$code$_", @$perev));
			}
		    }
		    printf "      %-16s  %s\n", $name, join(", ", @lines);
		}
	    }
	}
    }
}

sub compile {
    my @options = @_;
    my ($option, $opt, $arg);
  OPTION:
    while ($option = shift @options) {
	if ($option =~ /^-(.)(.*)/) {
	    $opt = $1;
	    $arg = $2;
	} else {
	    unshift @options, $option;
	    last OPTION;
	}
	if ($opt eq "-" && $arg eq "-") {
	    shift @options;
	    last OPTION;
	} elsif ($opt eq "o") {
	    $arg ||= shift @options;
	    open(STDOUT, ">$arg") or return "$arg: $!\n";
	} elsif ($opt eq "d") {
	    $nodefs = 1;
	} elsif ($opt eq "r") {
	    $raw = 1;
	} elsif ($opt eq "D") {
            $arg ||= shift @options;
	    foreach $arg (split(//, $arg)) {
		if ($arg eq "o") {
		    B->debug(1);
		} elsif ($arg eq "O") {
		    $debug_op = 1;
		} elsif ($arg eq "t") {
		    $debug_top = 1;
		}
	    }
	}
    }
    if (@options) {
	return sub {
	    my $objname;
	    xref_definitions();
	    foreach $objname (@options) {
		$objname = "main::$objname" unless $objname =~ /::/;
		eval "xref_object(\\&$objname)";
		die "xref_object(\\&$objname) failed: $@" if $@;
	    }
	    output();
	}
    } else {
	return sub {
	    xref_definitions();
	    xref_main();
	    output();
	}
    }
}

1;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丰满一区二区免费视频| 91麻豆精品国产| 亚洲黄色av一区| 91.成人天堂一区| 精品一区二区三区欧美| 亚洲国产成人在线| 欧美在线观看视频一区二区三区| 亚洲成人免费av| 精品理论电影在线| 成人小视频在线| 亚洲高清在线精品| 精品国产凹凸成av人网站| 成人免费看视频| 亚洲综合免费观看高清完整版在线 | av色综合久久天堂av综合| 亚洲女与黑人做爰| 日韩欧美不卡一区| 99国产精品久| 午夜伊人狠狠久久| 国产欧美一区二区在线| 欧美三级韩国三级日本三斤| 国产在线精品一区二区夜色| 亚洲精品中文字幕乱码三区| 精品国产亚洲一区二区三区在线观看| caoporen国产精品视频| 蜜桃久久av一区| 亚洲精品免费一二三区| 欧美精品一区二区在线观看| 色婷婷综合久久久中文一区二区| 激情综合色播五月| 亚洲一区二区三区中文字幕| 久久精品视频在线看| 欧美精品电影在线播放| 99久久精品国产毛片| 麻豆成人av在线| 亚洲一区二区在线免费看| 欧美激情中文不卡| 日韩三级免费观看| 欧美性色aⅴ视频一区日韩精品| 国产黄色成人av| 久久国产麻豆精品| 三级欧美在线一区| 亚洲精品老司机| 国产精品久久久久7777按摩| 精品少妇一区二区三区视频免付费| 在线视频欧美区| 成年人国产精品| 国产精品资源网站| 美女视频黄频大全不卡视频在线播放| 一区二区三区不卡视频| 国产精品超碰97尤物18| 精品久久国产老人久久综合| 欧美日韩成人在线一区| 一本大道久久a久久精二百| 国产成人亚洲综合色影视| 久久国内精品自在自线400部| 日韩国产欧美在线视频| 亚洲综合免费观看高清在线观看| 亚洲欧美欧美一区二区三区| 亚洲视频 欧洲视频| 国产精品乱码一区二区三区软件 | 亚洲成av人**亚洲成av**| 一区二区三区四区激情| 亚洲欧美另类久久久精品| |精品福利一区二区三区| 最新高清无码专区| 亚洲黄色片在线观看| 一区二区在线观看免费视频播放| 亚洲精品国产a| 亚洲在线视频免费观看| 亚洲一区精品在线| 丝袜亚洲另类欧美| 免费人成网站在线观看欧美高清| 日韩va亚洲va欧美va久久| 香蕉久久一区二区不卡无毒影院| 亚洲精品日产精品乱码不卡| 一区二区三区在线免费播放| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 久久人人爽爽爽人久久久| 精品国产a毛片| 欧美精品一区男女天堂| 精品国产一区二区三区久久久蜜月 | 亚洲色欲色欲www| 国产精品理论在线观看| 国产精品高潮久久久久无| 国产欧美精品一区二区色综合| 欧美亚洲一区二区在线观看| 91国偷自产一区二区三区成为亚洲经典| av一区二区三区黑人| 成人午夜碰碰视频| heyzo一本久久综合| 成人激情文学综合网| 国产成人精品午夜视频免费| 国产成人啪免费观看软件| 国产福利91精品一区二区三区| 国产精品一区2区| 国产成人综合亚洲网站| 国产一区视频网站| 国产成人午夜99999| 成人激情黄色小说| 色综合久久综合| 欧美日韩亚洲国产综合| 欧美一区二区在线免费播放| 欧美一级黄色片| 久久欧美一区二区| 亚洲色图欧美激情| 日韩中文字幕91| 激情综合五月天| zzijzzij亚洲日本少妇熟睡| 色婷婷综合中文久久一本| 欧美日韩一区二区在线视频| 91麻豆精品国产91久久久久久久久| 91精品国产91久久久久久一区二区| 日韩美女视频一区二区在线观看| 久久久夜色精品亚洲| 亚洲视频1区2区| 午夜成人在线视频| 国产乱人伦偷精品视频免下载| 波多野结衣在线aⅴ中文字幕不卡| 91久久精品一区二区三区| 欧美一区二区三区四区久久 | 日韩欧美国产精品一区| 久久久久久**毛片大全| 中文字幕亚洲区| 午夜亚洲福利老司机| 国产一区二区三区国产| 97精品视频在线观看自产线路二| 欧美在线短视频| 日韩欧美高清在线| 国产精品丝袜一区| 亚洲123区在线观看| 国产激情91久久精品导航| 欧美综合欧美视频| 久久久亚洲精品石原莉奈| 亚洲综合在线五月| 久久不见久久见中文字幕免费| 成人一区二区视频| 日韩一区二区三区视频| 日韩在线一二三区| 美国毛片一区二区三区| 99精品热视频| 日韩精品一区二区三区三区免费| 国产精品乱码人人做人人爱| 亚洲1区2区3区4区| 成人sese在线| 日韩欧美国产综合在线一区二区三区| 国产精品久久久久久久久免费樱桃 | 国产成人精品免费一区二区| 欧美精品丝袜中出| 国产精品国产三级国产有无不卡| 天天综合天天做天天综合| www.欧美色图| 日韩精品在线看片z| 一区二区高清在线| 国产精品一区二区免费不卡| 欧美人牲a欧美精品| 中文av一区二区| 另类综合日韩欧美亚洲| 欧美日韩综合在线| 国产精品第13页| 国产主播一区二区三区| 日韩欧美久久一区| 亚洲精品午夜久久久| 国产一区视频在线看| 在线播放欧美女士性生活| 亚洲色图一区二区三区| 国产成人精品亚洲午夜麻豆| 欧美成人猛片aaaaaaa| 性感美女久久精品| 在线免费不卡电影| 亚洲欧洲av色图| 成人综合婷婷国产精品久久 | 欧美性xxxxxxxx| 亚洲欧美综合在线精品| 国产91在线|亚洲| 精品处破学生在线二十三| 日韩高清不卡在线| 欧美色大人视频| 亚洲综合视频在线观看| 一本大道久久精品懂色aⅴ| 中文字幕在线免费不卡| 国产+成+人+亚洲欧洲自线| 欧美精品一区二区三区久久久| 免费高清视频精品| 日韩亚洲欧美在线| 日韩精品1区2区3区| 91精品国产高清一区二区三区蜜臀| 亚洲国产精品久久久久秋霞影院| 在线观看一区二区视频| 亚洲一区二区三区中文字幕| 91久久精品一区二区三区| 亚洲最新视频在线播放| 日本韩国视频一区二区| 一区二区在线看| 欧美性做爰猛烈叫床潮| 亚洲午夜一区二区三区| 欧美亚洲丝袜传媒另类| 五月婷婷综合激情| 精品国产99国产精品| 国产精品亚洲一区二区三区妖精|