Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Streamline .WHICH methods where possible
- don't use .^name unless needed
- makes .WHICH up to 1.8x as fast
  • Loading branch information
lizmat committed Mar 16, 2017
1 parent 79bb179 commit 65b0040
Show file tree
Hide file tree
Showing 12 changed files with 88 additions and 45 deletions.
12 changes: 11 additions & 1 deletion src/core/Buf.pm
Expand Up @@ -21,7 +21,17 @@ my role Blob[::T = uint8] does Positional[T] does Stringy is repr('VMArray') is
} // 1;

multi method WHICH(Blob:D:) {
self.^name ~ '|' ~ nqp::sha1(self.decode("latin-1"))
nqp::box_s(
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Blob),
'Blob|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
nqp::sha1(self.decode("latin-1"))
),
ObjAt
)
}

multi method new(Blob:) { nqp::create(self) }
Expand Down
2 changes: 1 addition & 1 deletion src/core/Capture.pm
Expand Up @@ -18,7 +18,7 @@ my class Capture { # declared in BOOTSTRAP
}

multi method WHICH (Capture:D:) {
my $WHICH = self.^name;
my $WHICH = nqp::istype(self.WHAT,Capture) ?? 'Capture' !! self.^name;
if !nqp::isnull(@!list) && @!list {
$WHICH ~= '|';
$WHICH ~= ( '(' ~ $_.WHICH ~ ')' )
Expand Down
14 changes: 9 additions & 5 deletions src/core/Complex.pm
Expand Up @@ -14,12 +14,16 @@ my class Complex is Cool does Numeric {

multi method WHICH(Complex:D:) {
nqp::box_s(
nqp::concat(
nqp::concat(nqp::unbox_s(self.^name), '|'),
nqp::concat($!re, nqp::concat('|', $!im))
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Complex),
'Complex|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
ObjAt
);
nqp::concat($!re, nqp::concat('|', $!im))
),
ObjAt
)
}

method reals(Complex:D:) {
Expand Down
14 changes: 9 additions & 5 deletions src/core/Date.pm
Expand Up @@ -74,12 +74,16 @@ my class Date does Dateish {

multi method WHICH(Date:D:) {
nqp::box_s(
nqp::concat(
nqp::concat(nqp::unbox_s(self.^name), '|'),
nqp::unbox_i(self.daycount)
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Date),
'Date|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
ObjAt
);
nqp::unbox_i(self.daycount)
),
ObjAt
)
}

method truncated-to(Cool $unit) {
Expand Down
18 changes: 9 additions & 9 deletions src/core/Int.pm
Expand Up @@ -11,16 +11,16 @@ my class Int does Real { # declared in BOOTSTRAP

multi method WHICH(Int:D:) {
nqp::box_s(
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Int),
'Int|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
nqp::tostr_I(self)
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Int),
'Int|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
ObjAt
);
nqp::tostr_I(self)
),
ObjAt
)
}
multi method new($value) {
# clone to ensure we return a new object for any cached
Expand Down
3 changes: 1 addition & 2 deletions src/core/Map.pm
Expand Up @@ -5,8 +5,7 @@ my class Map does Iterable does Associative { # declared in BOOTSTRAP
# has Mu $!storage;

multi method WHICH(Map:D:) {
self.^name
~ '|'
(nqp::istype(self.WHAT,Map) ?? 'Map|' !! (self.^name ~ '|'))
~ self.keys.sort.map( { $_.WHICH ~ '(' ~ self.AT-KEY($_) ~ ')' } )
}
method new(*@args) {
Expand Down
14 changes: 9 additions & 5 deletions src/core/Num.pm
Expand Up @@ -7,12 +7,16 @@ my class Num does Real { # declared in BOOTSTRAP

multi method WHICH(Num:D:) {
nqp::box_s(
nqp::concat(
nqp::concat(nqp::unbox_s(self.^name), '|'),
nqp::unbox_n(self)
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Num),
'Num|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
ObjAt
);
nqp::unbox_n(self)
),
ObjAt
)
}
method Num() { self }
method Bridge(Num:D:) { self }
Expand Down
14 changes: 9 additions & 5 deletions src/core/ObjAt.pm
Expand Up @@ -7,12 +7,16 @@ my class ObjAt { # declared in BOOTSTRAP

multi method WHICH(ObjAt:D:) {
nqp::box_s(
nqp::concat(
nqp::concat(nqp::unbox_s(self.^name), '|'),
$!value
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,ObjAt),
'ObjAt|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
ObjAt
);
$!value
),
ObjAt
)
}
multi method Str(ObjAt:D:) {
nqp::p6box_s(nqp::unbox_s(self));
Expand Down
4 changes: 2 additions & 2 deletions src/core/Range.pm
Expand Up @@ -78,8 +78,8 @@ my class Range is Cool does Iterable does Positional {
method is-int() { nqp::p6bool($!is-int) }

multi method WHICH (Range:D:) {
self.^name
~ "|$!min"
(nqp::istype(self.WHAT,Range) ?? 'Range|' !! (self.^name ~ '|'))
~ $!min
~ ("^" if $!excludes-min)
~ '..'
~ ("^" if $!excludes-max)
Expand Down
20 changes: 12 additions & 8 deletions src/core/Rational.pm
Expand Up @@ -4,15 +4,19 @@ my role Rational[::NuT, ::DeT] does Real {

multi method WHICH(Rational:D:) {
nqp::box_s(
nqp::concat(
nqp::concat(nqp::unbox_s(self.^name), '|'),
nqp::concat(
nqp::tostr_I($!numerator),
nqp::concat('/', nqp::tostr_I($!denominator))
)
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Rational),
'Rational|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
ObjAt
);
nqp::concat(
nqp::tostr_I($!numerator),
nqp::concat('/', nqp::tostr_I($!denominator))
)
),
ObjAt
)
}

method new(NuT \nu = 0, DeT \de = 1) {
Expand Down
6 changes: 5 additions & 1 deletion src/core/Set.pm
Expand Up @@ -5,7 +5,11 @@ my class Set does Setty {
nqp::if(
nqp::attrinited(self,Set,'$!WHICH'),
$!WHICH,
$!WHICH := self.^name ~ '|' ~ %!elems.keys.sort
$!WHICH := nqp::if(
nqp::istype(self.WHAT,Set),
'Set|',
nqp::concat(self.^name,'|')
) ~ %!elems.keys.sort
)
}

Expand Down
12 changes: 11 additions & 1 deletion src/core/Version.pm
Expand Up @@ -106,7 +106,17 @@ class Version {
}

multi method WHICH(Version:D:) {
nqp::box_s(nqp::unbox_s(self.^name ~ '|' ~ $!string), ObjAt);
nqp::box_s(
nqp::concat(
nqp::if(
nqp::eqaddr(self.WHAT,Version),
'Version|',
nqp::concat(nqp::unbox_s(self.^name), '|')
),
$!string
),
ObjAt
)
}

method parts() { nqp::hllize($!parts) }
Expand Down

0 comments on commit 65b0040

Please sign in to comment.