Stackobj.pm revision 7c478bd95313f5f23a4c958a745db2134aa03244
#
# 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 ();
use Carp qw(confess);
use strict;
# Types
sub T_UNKNOWN () { 0 }
sub T_DOUBLE () { 1 }
sub T_INT () { 2 }
sub T_SPECIAL () { 3 }
# Flags
sub VALID_INT () { 0x01 }
sub VALID_UNSIGNED () { 0x02 }
sub VALID_DOUBLE () { 0x04 }
sub VALID_SV () { 0x08 }
#
# 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 as_sv {
my $obj = shift;
$obj->write_back;
}
}
sub as_int {
my $obj = shift;
}
}
sub as_double {
my $obj = shift;
$obj->load_double;
}
}
sub as_numeric {
my $obj = shift;
}
sub as_bool {
my $obj=shift;
}
}
}
#
# Debugging methods
#
sub peek {
my $obj = shift;
my @flags;
$type = "T_UNKNOWN";
$type = "T_INT";
$type = "T_DOUBLE";
} else {
$type = "(illegal type $type)";
}
return sprintf("%s type=$type flags=%s sv=$obj->{sv}",
}
sub minipeek {
my $obj = shift;
} else {
}
}
#
# Caller needs to ensure that set_int, set_double,
# set_numeric and set_sv are only invoked on legal lvalues.
#
sub set_int {
runtime("$obj->{iv} = $expr;");
}
sub set_double {
runtime("$obj->{nv} = $expr;");
}
sub set_numeric {
} else {
}
}
sub set_sv {
runtime("SvSetSV($obj->{sv}, $expr);");
$obj->invalidate;
}
#
# Stackobj::Padsv
#
bless {
sv => "PL_curpad[$ix]",
iv => "$iname",
nv => "$dname"
}, $class;
}
my $obj = shift;
runtime("$obj->{iv} = $obj->{nv};");
} else {
runtime("$obj->{iv} = SvIV($obj->{sv});");
}
}
my $obj = shift;
$obj->write_back;
runtime("$obj->{nv} = SvNV($obj->{sv});");
}
my $obj = shift;
}
my $obj = shift;
}
my $obj = shift;
if ($flags & VALID_UNSIGNED ){
runtime("sv_setuv($obj->{sv}, $obj->{iv});");
}else{
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";
}
}
#
# Stackobj::Const
#
my $obj = bless {
flags => 0,
}, $class;
if ( ref($sv) eq "B::SPECIAL" ){
}else{
if ($svflags & SVf_IVisUV){
}else{
}
} else {
}
}
return $obj;
}
my $obj = shift;
# Save the SV object and replace $obj->{sv} by its C source code name
}
my $obj = shift;
}else{
}
}
my $obj = shift;
}else{
}
}
#
# Stackobj::Bool
#
my $obj = bless {
}, $class;
return $obj;
}
my $obj = shift;
}
# XXX Might want to handle as_double/set_double/load_double?
1;
=head1 NAME
B::Stackobj - Helper module for CC backend
=head1 SYNOPSIS
use B::Stackobj;
=head1 DESCRIPTION
=head1 AUTHOR
Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>
=cut