# For making sure that no conflicts occur
package
SymTab;
use
Carp;
sub
new {
my
(
$type
,
%ids
) =
@_
;
my
(
$this
) =
bless
{
Id2Sym
=> {},
Sym2Id
=> {},
IsPar
=> {},
},
$type
;
$this
->add_ids(
%ids
);
$this
;
}
sub
add_ids {
my
(
$this
,
%hash
) =
@_
;
for
(
keys
%hash
) {
$this
->{Id2Sym}{
$_
} =
$hash
{
$_
};
# This usually sets the 'undef' key to whatever is in $_, because the
# object in $hash{$_} is usually a scalar, not an array. I know this
# becuase this function is called by AddArgsyms in PDL::PP, which
# conructs the %hash to be
#
# sym_name => sym_name
#
# The only other place that invokes this code is the constructor,
# which itself is called by MkDefSyms in PDL::PP. That invocation is
# called with %hash set as
#
# _PDL_ThisTrans => ["__privtrans",C::Type->new(undef,"$_[0] *foo")]
#
# AFAIK, Sym2Id is never used anywhere in the code generation, and
# the setting of undef throws warning messages, so I am going to
# comment-out this line for now. --David Mertens, 12-12-2011
#$this->{Sym2Id}{$hash{$_}->[0]} = $_;
}
}
sub
add_params {
my
(
$this
,
%hash
) =
@_
;
$this
->add_ids(
%hash
);
for
(
keys
%hash
) {
$this
->{IsPar}{
$_
} = 1;
}
}
sub
decl_locals {
my
(
$this
) =
@_
;
my
$str
;
for
(
keys
%{
$this
->{Id2Sym}}) {
if
(!
$this
->{IsPar}{
$_
}) {
$str
.=
$this
->{Id2Sym}{
$_
}[1]
->get_decl(
$this
->{Id2Sym}{
$_
}[0]).
";"
;
}
}
$str
;
}
sub
get_params {
}
sub
get_symname {
my
(
$this
,
$id
) =
@_
;
confess
"Symbol not found: $id\n"
if
(!
defined
(
$this
->{Id2Sym}{
$id
}));
return
$this
->{Id2Sym}{
$id
}[0];
}
1;