Skip to content

Commit

Permalink
- Improved the optimizer to cover more methods.
Browse files Browse the repository at this point in the history
- Various minor fixes related to deparsing.
- Added the Complex.is_one() method
  • Loading branch information
trizen committed Nov 17, 2015
1 parent 436a730 commit e3a1a1f
Show file tree
Hide file tree
Showing 5 changed files with 178 additions and 28 deletions.
17 changes: 3 additions & 14 deletions lib/Sidef/Deparse/Sidef.pm
Original file line number Diff line number Diff line change
Expand Up @@ -110,14 +110,7 @@ package Sidef::Deparse::Sidef {

sub _dump_array {
my ($self, $array) = @_;
'[' . join(
', ',

ref($array) eq 'Sidef::Types::Array::Array'
? (map { $self->deparse_expr({self => $_->get_value}) } @{$array})
: (map { $self->deparse_expr(ref($_) eq 'HASH' ? $_ : {self => $_}) } @{$array})
)
. ']';
'[' . join(', ', map { $self->deparse_expr(ref($_) eq 'HASH' ? $_ : {self => $_}) } @{$array}) . ']';
}

sub _dump_class_name {
Expand Down Expand Up @@ -340,17 +333,13 @@ package Sidef::Deparse::Sidef {
$code = 'LazyMethod';
}
elsif ($ref eq 'Sidef::Types::Block::Break') {
if (not exists $expr->{call}) {
$code = 'break';
}
$code = 'break';
}
elsif ($ref eq 'Sidef::Types::Block::Default') {
$code = 'default' . $self->deparse_bare_block($obj->{block}->{code});
}
elsif ($ref eq 'Sidef::Types::Block::Next') {
if (not exists $expr->{call}) {
$code = 'next';
}
$code = 'next';
}
elsif ($ref eq 'Sidef::Types::Block::Continue') {
$code = 'continue';
Expand Down
175 changes: 164 additions & 11 deletions lib/Sidef/Optimizer.pm
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,19 @@ package Sidef::Optimizer {
map {
{ $_, [table(STRING)] }
} methods(STRING, qw(
new call
concat
prepend
gt lt le ge cmp
xor and or
eq ne
index
unpack
crypt
levenshtein
contains
Expand All @@ -68,11 +73,21 @@ package Sidef::Optimizer {
map {
{ $_, [] }
} methods(STRING, qw(
lc uc tc wc tclc lcfirst
lc uc fc tc wc tclc lcfirst
pop
chop
chomp
length
chars_len
bytes_len
graphs_len
chars
bytes
lines
words
graphemes
ord
oct
Expand All @@ -81,10 +96,16 @@ package Sidef::Optimizer {
num
not
first
last
repeat
reverse
clear
sort
is_empty
is_palindrome
trim
trim_beg
Expand Down Expand Up @@ -114,7 +135,7 @@ package Sidef::Optimizer {
times
repeat
char_at
char
sprintf
sprintlnf
Expand All @@ -126,7 +147,11 @@ package Sidef::Optimizer {
),

# String.method(String | Number | Regex)
#(map {{$_, [table(STRING, NUMBER, REGEX)]}} methods(STRING, qw(split))),
(
map {
{ $_, [table(STRING, NUMBER, REGEX)] }
} methods(STRING, qw(split))
),

# String.method(String, String)
(
Expand Down Expand Up @@ -170,20 +195,24 @@ package Sidef::Optimizer {
map {
{ $_, [table(NUMBER)] }
} methods(NUMBER, qw(
new call
+ - / * % **
lt gt le ge cmp acmp
eq ne
and or xor
divmod
digit
complex
root log
max min
round roundf
digit
nok
rdiv
is_div
shift_right
Expand All @@ -198,10 +227,12 @@ package Sidef::Optimizer {
map {
{ $_, [] }
} methods(NUMBER, qw(
new call
inc dec not
factorial
sqrt
troot
abs
hex oct bin
Expand All @@ -216,6 +247,7 @@ package Sidef::Optimizer {
chr
is_zero
is_one
is_nan
is_positive
is_negative
Expand All @@ -228,10 +260,17 @@ package Sidef::Optimizer {
floor
length
parts
numerator
denominator
digits
as_bin
as_oct
as_hex
rat
complex i
sstr
Expand All @@ -247,6 +286,7 @@ package Sidef::Optimizer {
map {
{ $_, [table(NUMBER), table(NUMBER)] }
} methods(NUMBER, qw(
modpow
shift_right
shift_left
)
Expand Down Expand Up @@ -287,8 +327,13 @@ package Sidef::Optimizer {
sum
prod
sort
reverse
unique
last_unique
to_s
to_list
dump
)
)
Expand All @@ -300,6 +345,27 @@ package Sidef::Optimizer {
} methods(ARRAY, qw(
exists
defined
contains
multiply
take_right
take_left
)
)
),

(
map {
{ $_, [table(ARRAY)] }
} methods(ARRAY, qw(
and
or
xor
concat
contains_any
contains_all
)
)
),
Expand All @@ -310,6 +376,8 @@ package Sidef::Optimizer {
} methods(ARRAY, qw(
pack
join
contains
reduce_operator
)
)
),
Expand Down Expand Up @@ -414,13 +482,45 @@ package Sidef::Optimizer {

(COMPLEX) => [

# Complex.method(Complex)
# Complex.method(Complex|Number)
(
map {
{ $_, [table(COMPLEX)] }
{ $_, [table(COMPLEX, NUMBER)] }
} methods(COMPLEX, qw(
cmp
cmp gt lt ge le eq ne
roundf
mul
div
add
sub
exp
log
pow
atan2
)
)
),

# Complex.method(Number|Complex, Number|Complex)
(
map {
{ $_, [table(NUMBER, COMPLEX)] }
} methods(COMPLEX, qw(
call
new
)
)
),

# Complex.method(Number|Complex, Number|Complex)
(
map {
{ $_, [table(NUMBER, COMPLEX), table(NUMBER, COMPLEX)] }
} methods(COMPLEX, qw(
call
new
)
)
),
Expand All @@ -430,21 +530,56 @@ package Sidef::Optimizer {
map {
{ $_, [] }
} methods(COMPLEX, qw(
new call
inc
dec
abs
log
log10
sqrt
cos
sin
tan
csc
sec
cot
asin
acos
atan
acsc
asec
acot
sinh
cosh
tanh
csch
sech
coth
asinh
acosh
atanh
acsch
asech
acoth
pi
int
negate
neg
not
sign
real
imaginary
is_zero
is_one
is_nan
is_positive
is_negative
is_pos
is_neg
is_even
is_odd
is_inf
Expand Down Expand Up @@ -508,6 +643,15 @@ package Sidef::Optimizer {
$obj->{block} = $self->optimize_expr({self => $obj->{block}});
}
}
elsif ($ref eq 'Sidef::Variable::Static') {
if ($addr{refaddr($obj)}++) {
## ok
}
else {
my %code = $self->optimize($obj->{expr});
$obj->{expr} = \%code;
}
}
elsif ($ref eq 'Sidef::Variable::Init') {
if ($addr{refaddr($obj)}++) {
## ok
Expand All @@ -528,6 +672,15 @@ package Sidef::Optimizer {
$obj->{block}{code} = \%code;
}
}
elsif ($ref eq 'Sidef::Types::Block::ForArray') {
if ($addr{refaddr($obj)}++) {
## ok
}
else {
my %code = $self->optimize($obj->{block}{code});
$obj->{block}{code} = \%code;
}
}
elsif ($ref eq 'Sidef::Types::Block::Loop') {
if ($addr{refaddr($obj)}++) {
## ok
Expand Down
7 changes: 5 additions & 2 deletions lib/Sidef/Parser.pm
Original file line number Diff line number Diff line change
Expand Up @@ -2854,8 +2854,11 @@ package Sidef::Parser {
}
elsif (!$has_newline and /\G(if|while|and|or)\b\h*/gc) {
my $keyword = $1;
my $obj =
(/\G(?=\()/ ? $self->parse_arguments(code => $opt{code}) : $self->parse_obj(code => $opt{code}));
my $obj = (
/\G(?=\()/
? $self->parse_arguments(code => $opt{code})
: $self->parse_obj(code => $opt{code})
);
push @{$struct{$self->{class}}[-1]{call}}, {keyword => $keyword, arg => [$obj]};
redo;
}
Expand Down
Loading

0 comments on commit e3a1a1f

Please sign in to comment.