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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? stackobj.pm

?? ARM上的如果你對底層感興趣
?? PM
字號:
#      Stackobj.pm
#
#      Copyright (c) 1996 Malcolm Beattie
#
#      You may distribute under the terms of either the GNU General Public
#      License or the Artistic License, as specified in the README file.
#
package B::Stackobj;
use Exporter ();
@ISA = qw(Exporter);
@EXPORT_OK = qw(set_callback T_UNKNOWN T_DOUBLE T_INT
		VALID_INT VALID_DOUBLE VALID_SV REGISTER TEMPORARY);
%EXPORT_TAGS = (types => [qw(T_UNKNOWN T_DOUBLE T_INT)],
		flags => [qw(VALID_INT VALID_DOUBLE VALID_SV
			     REGISTER TEMPORARY)]);

use Carp qw(confess);
use strict;
use B qw(class);

# Perl internal constants that I should probably define elsewhere.
sub SVf_IOK () { 0x10000 }
sub SVf_NOK () { 0x20000 }

# Types
sub T_UNKNOWN () { 0 }
sub T_DOUBLE ()  { 1 }
sub T_INT ()     { 2 }

# Flags
sub VALID_INT ()	{ 0x01 }
sub VALID_DOUBLE ()	{ 0x02 }
sub VALID_SV ()		{ 0x04 }
sub REGISTER ()		{ 0x08 } # no implicit write-back when calling subs
sub TEMPORARY ()	{ 0x10 } # no implicit write-back needed at all

#
# Callback for runtime code generation
#
my $runtime_callback = sub { confess "set_callback not yet called" };
sub set_callback (&) { $runtime_callback = shift }
sub runtime { &$runtime_callback(@_) }

#
# Methods
#

sub write_back { confess "stack object does not implement write_back" }

sub invalidate { shift->{flags} &= ~(VALID_INT | VALID_DOUBLE) }

sub as_sv {
    my $obj = shift;
    if (!($obj->{flags} & VALID_SV)) {
	$obj->write_back;
	$obj->{flags} |= VALID_SV;
    }
    return $obj->{sv};
}

sub as_int {
    my $obj = shift;
    if (!($obj->{flags} & VALID_INT)) {
	$obj->load_int;
	$obj->{flags} |= VALID_INT;
    }
    return $obj->{iv};
}

sub as_double {
    my $obj = shift;
    if (!($obj->{flags} & VALID_DOUBLE)) {
	$obj->load_double;
	$obj->{flags} |= VALID_DOUBLE;
    }
    return $obj->{nv};
}

sub as_numeric {
    my $obj = shift;
    return $obj->{type} == T_INT ? $obj->as_int : $obj->as_double;
}

#
# Debugging methods
#
sub peek {
    my $obj = shift;
    my $type = $obj->{type};
    my $flags = $obj->{flags};
    my @flags;
    if ($type == T_UNKNOWN) {
	$type = "T_UNKNOWN";
    } elsif ($type == T_INT) {
	$type = "T_INT";
    } elsif ($type == T_DOUBLE) {
	$type = "T_DOUBLE";
    } else {
	$type = "(illegal type $type)";
    }
    push(@flags, "VALID_INT") if $flags & VALID_INT;
    push(@flags, "VALID_DOUBLE") if $flags & VALID_DOUBLE;
    push(@flags, "VALID_SV") if $flags & VALID_SV;
    push(@flags, "REGISTER") if $flags & REGISTER;
    push(@flags, "TEMPORARY") if $flags & TEMPORARY;
    @flags = ("none") unless @flags;
    return sprintf("%s type=$type flags=%s sv=$obj->{sv}",
		   class($obj), join("|", @flags));
}

sub minipeek {
    my $obj = shift;
    my $type = $obj->{type};
    my $flags = $obj->{flags};
    if ($type == T_INT || $flags & VALID_INT) {
	return $obj->{iv};
    } elsif ($type == T_DOUBLE || $flags & VALID_DOUBLE) {
	return $obj->{nv};
    } else {
	return $obj->{sv};
    }
}

#
# Caller needs to ensure that set_int, set_double,
# set_numeric and set_sv are only invoked on legal lvalues.
#
sub set_int {
    my ($obj, $expr) = @_;
    runtime("$obj->{iv} = $expr;");
    $obj->{flags} &= ~(VALID_SV | VALID_DOUBLE);
    $obj->{flags} |= VALID_INT;
}

sub set_double {
    my ($obj, $expr) = @_;
    runtime("$obj->{nv} = $expr;");
    $obj->{flags} &= ~(VALID_SV | VALID_INT);
    $obj->{flags} |= VALID_DOUBLE;
}

sub set_numeric {
    my ($obj, $expr) = @_;
    if ($obj->{type} == T_INT) {
	$obj->set_int($expr);
    } else {
	$obj->set_double($expr);
    }
}

sub set_sv {
    my ($obj, $expr) = @_;
    runtime("SvSetSV($obj->{sv}, $expr);");
    $obj->invalidate;
    $obj->{flags} |= VALID_SV;
}

#
# Stackobj::Padsv
#

@B::Stackobj::Padsv::ISA = 'B::Stackobj';
sub B::Stackobj::Padsv::new {
    my ($class, $type, $extra_flags, $ix, $iname, $dname) = @_;
    bless {
	type => $type,
	flags => VALID_SV | $extra_flags,
	sv => "PL_curpad[$ix]",
	iv => "$iname",
	nv => "$dname"
    }, $class;
}

sub B::Stackobj::Padsv::load_int {
    my $obj = shift;
    if ($obj->{flags} & VALID_DOUBLE) {
	runtime("$obj->{iv} = $obj->{nv};");
    } else {
	runtime("$obj->{iv} = SvIV($obj->{sv});");
    }
    $obj->{flags} |= VALID_INT;
}

sub B::Stackobj::Padsv::load_double {
    my $obj = shift;
    $obj->write_back;
    runtime("$obj->{nv} = SvNV($obj->{sv});");
    $obj->{flags} |= VALID_DOUBLE;
}

sub B::Stackobj::Padsv::write_back {
    my $obj = shift;
    my $flags = $obj->{flags};
    return if $flags & VALID_SV;
    if ($flags & VALID_INT) {
	runtime("sv_setiv($obj->{sv}, $obj->{iv});");
    } elsif ($flags & VALID_DOUBLE) {
	runtime("sv_setnv($obj->{sv}, $obj->{nv});");
    } else {
	confess "write_back failed for lexical @{[$obj->peek]}\n";
    }
    $obj->{flags} |= VALID_SV;
}

#
# Stackobj::Const
#

@B::Stackobj::Const::ISA = 'B::Stackobj';
sub B::Stackobj::Const::new {
    my ($class, $sv) = @_;
    my $obj = bless {
	flags => 0,
	sv => $sv    # holds the SV object until write_back happens
    }, $class;
    my $svflags = $sv->FLAGS;
    if ($svflags & SVf_IOK) {
	$obj->{flags} = VALID_INT|VALID_DOUBLE;
	$obj->{type} = T_INT;
	$obj->{nv} = $obj->{iv} = $sv->IV;
    } elsif ($svflags & SVf_NOK) {
	$obj->{flags} = VALID_INT|VALID_DOUBLE;
	$obj->{type} = T_DOUBLE;
	$obj->{iv} = $obj->{nv} = $sv->NV;
    } else {
	$obj->{type} = T_UNKNOWN;
    }
    return $obj;
}

sub B::Stackobj::Const::write_back {
    my $obj = shift;
    return if $obj->{flags} & VALID_SV;
    # Save the SV object and replace $obj->{sv} by its C source code name
    $obj->{sv} = $obj->{sv}->save;
    $obj->{flags} |= VALID_SV|VALID_INT|VALID_DOUBLE;
}

sub B::Stackobj::Const::load_int {
    my $obj = shift;
    $obj->{iv} = int($obj->{sv}->PV);
    $obj->{flags} |= VALID_INT;
}

sub B::Stackobj::Const::load_double {
    my $obj = shift;
    $obj->{nv} = $obj->{sv}->PV + 0.0;
    $obj->{flags} |= VALID_DOUBLE;
}

sub B::Stackobj::Const::invalidate {}

#
# Stackobj::Bool
#

@B::Stackobj::Bool::ISA = 'B::Stackobj';
sub B::Stackobj::Bool::new {
    my ($class, $preg) = @_;
    my $obj = bless {
	type => T_INT,
	flags => VALID_INT|VALID_DOUBLE,
	iv => $$preg,
	nv => $$preg,
	preg => $preg		# this holds our ref to the pseudo-reg
    }, $class;
    return $obj;
}

sub B::Stackobj::Bool::write_back {
    my $obj = shift;
    return if $obj->{flags} & VALID_SV;
    $obj->{sv} = "($obj->{iv} ? &PL_sv_yes : &PL_sv_no)";
    $obj->{flags} |= VALID_SV;
}

# XXX Might want to handle as_double/set_double/load_double?

sub B::Stackobj::Bool::invalidate {}

1;

__END__

=head1 NAME

B::Stackobj - Helper module for CC backend

=head1 SYNOPSIS

	use B::Stackobj;

=head1 DESCRIPTION

See F<ext/B/README>.

=head1 AUTHOR

Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>

=cut

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区免费观看| 欧美三区在线视频| 日本伦理一区二区| 精品人在线二区三区| 亚洲激情成人在线| 大尺度一区二区| 欧美一卡2卡三卡4卡5免费| 国产精品天美传媒| 激情文学综合丁香| 在线不卡欧美精品一区二区三区| 欧美国产日韩a欧美在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 日本韩国精品一区二区在线观看| 久久久www免费人成精品| 天天射综合影视| 欧美三级三级三级| 亚洲丝袜美腿综合| 国产suv精品一区二区6| 2021久久国产精品不只是精品| 亚洲不卡av一区二区三区| 色综合亚洲欧洲| 中文字幕一区二区三区在线观看 | 精品久久久网站| 亚州成人在线电影| 欧美色图激情小说| 亚洲国产精品久久一线不卡| 一本一道综合狠狠老| 亚洲日本欧美天堂| 99久久精品久久久久久清纯| 国产精品久久久久久久久免费樱桃| 国产一区二区视频在线| 欧美va日韩va| 激情文学综合网| 国产婷婷精品av在线| 国产成人免费在线| 欧美国产日韩在线观看| 成人av资源在线| 中文字幕人成不卡一区| eeuss影院一区二区三区| 国产精品美女www爽爽爽| 99久久er热在这里只有精品15| 亚洲少妇最新在线视频| 在线观看日产精品| 午夜一区二区三区视频| 91精品国产色综合久久不卡电影 | 一区二区三区四区国产精品| 色综合天天做天天爱| 亚洲一区二区三区中文字幕 | 日本久久精品电影| 亚洲一区日韩精品中文字幕| 欧美剧情片在线观看| 蜜桃一区二区三区在线| 国产欧美一区二区精品性| 99精品久久99久久久久| 亚洲福利视频一区| 久久久久99精品一区| 色诱亚洲精品久久久久久| 香蕉成人啪国产精品视频综合网| 6080日韩午夜伦伦午夜伦| 国产一区视频导航| 亚洲欧洲精品一区二区三区不卡| 欧美又粗又大又爽| 国精产品一区一区三区mba桃花 | 久久综合资源网| 成人福利视频在线看| 午夜一区二区三区视频| 久久久精品免费网站| 一本大道久久a久久精品综合| 日韩av电影免费观看高清完整版在线观看| 欧美精品一区二区三| 91久久精品一区二区| 激情综合一区二区三区| 夜夜精品视频一区二区 | 欧美一区二区高清| 风间由美一区二区三区在线观看| 亚洲电影第三页| 日韩伦理电影网| 91麻豆精品国产91久久久使用方法| 国产乱码精品一区二区三区五月婷| 一区二区三区精品在线| 久久综合av免费| 欧美日韩综合在线免费观看| 精品一区二区国语对白| 亚洲午夜久久久| 国产精品美女久久久久久| 欧美成人乱码一区二区三区| 欧洲一区在线观看| 国产成a人无v码亚洲福利| 日本三级韩国三级欧美三级| 亚洲精品国产a| 国产精品灌醉下药二区| 久久精品视频在线看| 日韩一区二区三区视频| 欧美亚洲愉拍一区二区| www.激情成人| 成人午夜视频福利| 精品中文av资源站在线观看| 五月开心婷婷久久| 一区二区三区不卡视频在线观看| 亚洲国产成人自拍| 久久久久久久精| 国产午夜亚洲精品羞羞网站| 精品福利av导航| 精品国产亚洲在线| 日韩美一区二区三区| 欧美一二三区在线| 欧美群妇大交群的观看方式| 色综合中文综合网| 一本到高清视频免费精品| 高清久久久久久| 国产精品综合二区| 狠狠色狠狠色综合日日91app| 日本伊人午夜精品| 日本欧美一区二区在线观看| 国产成人免费av在线| 久久精品国产色蜜蜜麻豆| 日韩av午夜在线观看| 美女精品自拍一二三四| 日韩成人av影视| 蜜桃传媒麻豆第一区在线观看| 亚洲成人av在线电影| 天堂成人国产精品一区| 亚洲电影欧美电影有声小说| 午夜精品久久久久| 日韩激情av在线| 经典三级一区二区| 国产乱码一区二区三区| 成人精品鲁一区一区二区| 97精品久久久午夜一区二区三区 | 日韩电影在线免费| 麻豆精品视频在线观看视频| 国产一区在线不卡| 99久久亚洲一区二区三区青草 | 亚洲欧美国产77777| 亚洲欧美经典视频| 天堂va蜜桃一区二区三区漫画版| 免费不卡在线视频| 国产电影一区二区三区| 99精品国产99久久久久久白柏| 91麻豆免费看| 欧美丰满嫩嫩电影| 久久精品免费在线观看| 中文字幕永久在线不卡| 香蕉久久一区二区不卡无毒影院 | 欧美性受xxxx| 日韩欧美高清dvd碟片| 国产欧美视频一区二区三区| 亚洲人成电影网站色mp4| 日韩精品一级中文字幕精品视频免费观看 | 激情综合网av| 91在线观看免费视频| 欧美色综合网站| 国产日韩精品一区二区三区在线| 亚洲精品乱码久久久久久日本蜜臀| 亚洲成人在线观看视频| 国产大陆精品国产| 精品视频一区二区不卡| 久久免费偷拍视频| 亚洲成a人片在线观看中文| 国产经典欧美精品| 欧美日韩一区不卡| 国产精品拍天天在线| 午夜精品视频在线观看| 成人综合婷婷国产精品久久 | 欧美日韩三级在线| 久久久美女毛片| 午夜av一区二区| 99久久精品费精品国产一区二区| 欧美一级高清大全免费观看| 亚洲色图视频免费播放| 狠狠色伊人亚洲综合成人| 欧美日韩免费在线视频| 欧美国产日韩精品免费观看| 美女视频一区在线观看| 色婷婷久久久亚洲一区二区三区 | 国产精品视频第一区| 免费在线观看日韩欧美| 在线观看三级视频欧美| 欧美韩国日本一区| 国产一区二区三区免费观看| 欧美日韩一区二区三区四区 | 欧美日韩一区二区三区不卡| 欧美国产禁国产网站cc| 精品一区二区三区免费观看| 欧美日韩免费高清一区色橹橹 | 亚洲综合色网站| av不卡一区二区三区| 精品国产制服丝袜高跟| 偷窥少妇高潮呻吟av久久免费 | 色欧美片视频在线观看 | 在线免费观看不卡av| 国产精品美女久久久久aⅴ国产馆| 极品尤物av久久免费看| 精品免费日韩av| 麻豆成人91精品二区三区| 欧美一区二区三区四区五区 | 91黄色小视频| 亚洲激情图片qvod| 一本到三区不卡视频| 亚洲精品国产a|