Skip to content

Commit

Permalink
- Fixed the usage of the underscore variable ('_') in function argume…
Browse files Browse the repository at this point in the history
…nts.

Example:
	func test(_) {
		say _;		# prints: 42
	}
	test(42);
  • Loading branch information
trizen committed Oct 23, 2015
1 parent 6b8ac8d commit 2827b5e
Showing 1 changed file with 28 additions and 35 deletions.
63 changes: 28 additions & 35 deletions lib/Sidef/Parser.pm
Original file line number Diff line number Diff line change
Expand Up @@ -415,15 +415,19 @@ package Sidef::Parser {

foreach my $var (@{$self->{vars}{$class}}) {
next if ref $var eq 'ARRAY';
return ($var, 1) if $var->{name} eq $var_name;
if ($var->{name} eq $var_name) {
return (wantarray ? ($var, 1) : $var);
}
}

foreach my $var (@{$self->{ref_vars_refs}{$class}}) {
next if ref $var eq 'ARRAY';
return ($var, 0) if $var->{name} eq $var_name;
if ($var->{name} eq $var_name) {
return (wantarray ? ($var, 0) : $var);
}
}

();
return;
}

sub check_declarations {
Expand Down Expand Up @@ -653,15 +657,6 @@ package Sidef::Parser {
);
}

#~ if (!$opt{private}) {
#~ my ($var, $code) = $self->find_var($name, $class_name);

#~ if (defined($var) && $code) {
#~ warn "[WARN] Redeclaration of $opt{type} '$name' in same scope, at "
#~ . "$self->{file_name}, line $self->{line}\n";
#~ }
#~ }

my $value;
if (defined($end_delim) && /$self->{var_init_sep_re}/goc) {
my $obj = $self->parse_obj(code => $opt{code});
Expand Down Expand Up @@ -1165,7 +1160,7 @@ package Sidef::Parser {

if (
$try_expr or exists($self->{built_in_classes}{$name}) or do {
my ($obj) = $self->find_var($name, $class_name);
my $obj = $self->find_var($name, $class_name);
defined($obj) and $obj->{type} eq 'class';
}
) {
Expand Down Expand Up @@ -1231,10 +1226,10 @@ package Sidef::Parser {

my $private = 0;
if (($type eq 'method' or $type eq 'func') and $name ne '') {
my ($var) = $self->find_var($name, $class_name);
my $var = $self->find_var($name, $class_name);

# Redeclaration of a function or a method in the same scope
if (ref $var) {
if (defined $var) {

if ($var->{obj}{type} ne $type) {
$self->fatal_error(
Expand Down Expand Up @@ -1288,8 +1283,7 @@ package Sidef::Parser {
if (/\G\h*<<?\h*/gc) {
while (/\G($self->{var_name_re})\h*/gco) {
my ($name) = $1;
my ($class) = $self->find_var($name, $class_name);
if (ref $class) {
if (defined(my $class = $self->find_var($name, $class_name))) {
if ($class->{type} eq 'class') {
push @{$obj->{inherit}}, $class->{obj}; #$class_name . '::' . $name;

Expand Down Expand Up @@ -1396,7 +1390,7 @@ package Sidef::Parser {
$try_expr or (
defined($ret_name) and (
exists($self->{built_in_classes}{$ret_name}) or do {
my ($obj) = $self->find_var($ret_name, $class_name);
my $obj = $self->find_var($ret_name, $class_name);
defined($obj) and $obj->{type} eq 'class';
}
)
Expand Down Expand Up @@ -1502,9 +1496,8 @@ package Sidef::Parser {

# Implicit method call on special variable: _
if (/\G\./) {
my ($var) = $self->find_var('_', $self->{class});

if (defined $var) {
if (defined(my $var = $self->find_var('_', $self->{class}))) {
$var->{count}++;
ref($var->{obj}) eq 'Sidef::Variable::Variable' && do {
$var->{obj}{in_use} = 1;
Expand Down Expand Up @@ -1691,13 +1684,10 @@ package Sidef::Parser {
# Variable call
if (/\G($self->{var_name_re})/goc) {
my ($name, $class) = $self->get_name_and_class($1);
my ($var, $code) = $self->find_var($name, $class);

if (ref $var) {
if (defined(my $var = $self->find_var($name, $class))) {
$var->{count}++;
ref($var->{obj}) eq 'Sidef::Variable::Variable' && do {

#$var->{closure} = 1 if $code == 0; # it might be a closure
$var->{obj}{in_use} = 1;
};
return $var->{obj};
Expand Down Expand Up @@ -1734,8 +1724,7 @@ package Sidef::Parser {
)
) {
if (exists $self->{current_method}) {
my ($var, $code) = $self->find_var('self', $class);
if (ref $var) {
if (defined(my $var = $self->find_var('self', $class))) {
$var->{count}++;
$var->{obj}{in_use} = 1;
return
Expand Down Expand Up @@ -1984,14 +1973,18 @@ package Sidef::Parser {
{ # special '_' variable
my $var_obj = Sidef::Variable::Variable->new(name => '_', type => 'var', class => $self->{class});
push @{$var_objs}, $var_obj;
unshift @{$self->{vars}{$self->{class}}},
{
obj => $var_obj,
name => '_',
count => 0,
type => 'var',
line => $self->{line},
};

my (undef, $code) = $self->find_var('_', $self->{class});
if (not defined($code) or $code == 0) {
unshift @{$self->{vars}{$self->{class}}},
{
obj => $var_obj,
name => '_',
count => 0,
type => 'var',
line => $self->{line},
};
}
}

my $obj = $self->parse_script(code => $opt{code});
Expand Down Expand Up @@ -2444,7 +2437,7 @@ package Sidef::Parser {
);
}

my ($var, $code) = $self->find_var($name, $class);
my $var = $self->find_var($name, $class);

if (not defined $var) {
$self->fatal_error(
Expand Down

0 comments on commit 2827b5e

Please sign in to comment.