Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Some more at_pos / assign_pos streamlining
- have at least < 0 check
- simplified range info in exception (no need to make a real Range object)
  • Loading branch information
lizmat committed Jan 15, 2015
1 parent 4af3cab commit a0de41f
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 44 deletions.
14 changes: 7 additions & 7 deletions src/core/Any.pm
Expand Up @@ -437,12 +437,12 @@ my class Any { # declared in BOOTSTRAP
}

multi method at_pos(Any:D: int \pos) {
fail X::OutOfRange.new(:what<Index>, :got(pos), :range(0..0))
fail X::OutOfRange.new(:what<Index>, :got(pos), :range<0..0>)
unless nqp::not_i(pos);
self;
}
multi method at_pos(Any:D: Int:D \pos) {
fail X::OutOfRange.new(:what<Index>, :got(pos), :range(0..0))
fail X::OutOfRange.new(:what<Index>, :got(pos), :range<0..0>)
if pos != 0;
self;
}
Expand All @@ -461,22 +461,22 @@ my class Any { # declared in BOOTSTRAP

proto method assign_pos(|) { * }
multi method assign_pos(Any:U \SELF: \pos, Mu \assignee) {
SELF.at_pos(pos) = assignee;
SELF.at_pos(pos) = assignee; # defer < 0 check
}

multi method assign_pos(Any:D: int \pos, Mu \assignee) {
self.at_pos(pos) = assignee;
self.at_pos(pos) = assignee; # defer < 0 check
}
multi method assign_pos(Any:D: Int:D \pos, Mu \assignee) {
self.at_pos(pos) = assignee;
self.at_pos(pos) = assignee; # defer < 0 check
}
multi method assign_pos(Any:D: Num:D \pos, Mu \assignee) {
X::Item.new(aggregate => self, index => pos).throw
if nqp::isnanorinf(pos);
self.at_pos(nqp::unbox_i(pos.Int)) = assignee;
self.at_pos(nqp::unbox_i(pos.Int)) = assignee; # defer < 0 check
}
multi method assign_pos(Any:D: Any:D \pos, Mu \assignee) {
self.at_pos(nqp::unbox_i(pos.Int)) = assignee;
self.at_pos(nqp::unbox_i(pos.Int)) = assignee; # defer < 0 check
}
multi method assign_pos(Any:D: Any:U \pos, Mu \assignee) {
die "Cannot use '{pos.^name}' as an index";
Expand Down
10 changes: 9 additions & 1 deletion src/core/Array.pm
Expand Up @@ -13,6 +13,8 @@ class Array { # declared in BOOTSTRAP
}

multi method at_pos(Array:D: int \pos) is rw {
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i(pos,0);
my Mu \items := nqp::p6listitems(self);
# hotpath check for element existence (RT #111848)
if nqp::existspos(items,pos)
Expand All @@ -31,6 +33,8 @@ class Array { # declared in BOOTSTRAP
}
multi method at_pos(Array:D: Int:D \pos) is rw {
my int $pos = nqp::unbox_i(pos.Int);
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i($pos,0);
my Mu \items := nqp::p6listitems(self);
# hotpath check for element existence (RT #111848)
if nqp::existspos(items,$pos)
Expand All @@ -49,6 +53,8 @@ class Array { # declared in BOOTSTRAP
}

multi method assign_pos(Array:D: int \pos, Mu \assignee) is rw {
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i(pos,0);
my \items := nqp::p6listitems(self);
nqp::existspos(items,pos)
|| nqp::isconcrete(nqp::getattr(self,List,'$!nextiter'))
Expand All @@ -57,8 +63,10 @@ class Array { # declared in BOOTSTRAP
!! (nqp::bindpos(items,pos,nqp::p6scalarfromdesc($!descriptor)) = assignee)
}
multi method assign_pos(Array:D: Int:D \pos, Mu \assignee) is rw {
my \items := nqp::p6listitems(self);
my int $pos = nqp::unbox_i(pos);
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i($pos,0);
my \items := nqp::p6listitems(self);
nqp::existspos(items,$pos)
|| nqp::isconcrete(nqp::getattr(self,List,'$!nextiter'))
&& self.exists_pos($pos)
Expand Down
28 changes: 6 additions & 22 deletions src/core/Buf.pm
Expand Up @@ -35,7 +35,7 @@ my role Blob[::T = uint8] does Positional[T] does Stringy is repr('VMArray') is
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,nqp::elems(self)-1))
:range("0..{nqp::elems(self)-1}")
).throw
if nqp::isge_i(pos,nqp::elems(self)) || nqp::islt_i(pos,0);
nqp::atpos_i(self, pos);
Expand All @@ -45,7 +45,7 @@ my role Blob[::T = uint8] does Positional[T] does Stringy is repr('VMArray') is
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,nqp::elems(self)-1))
:range("0..{nqp::elems(self)-1}")
).throw
if nqp::isge_i($pos,nqp::elems(self)) || nqp::islt_i($pos,0);
nqp::atpos_i(self,$pos);
Expand Down Expand Up @@ -254,41 +254,25 @@ my class utf32 does Blob[uint32] is repr('VMArray') {

my role Buf[::T = uint8] does Blob[T] is repr('VMArray') is array_type(T) {
multi method at_pos(Buf:D: int \pos) {
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,Inf))
).throw
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i(pos,0);
nqp::atpos_i(self, pos);
}
multi method at_pos(Buf:D: Int:D \pos) {
my int $pos = nqp::unbox_i(pos);
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,Inf))
).throw
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i($pos,0);
nqp::atpos_i(self,$pos);
}

multi method assign_pos(Buf:D: int \pos, Mu \assignee) {
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,Inf))
).throw
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i(pos,0);
nqp::bindpos_i(self,\pos,assignee)
}
multi method assign_pos(Buf:D: Int:D \pos, Mu \assignee) is rw {
my int $pos = nqp::unbox_i(pos);
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,Inf))
).throw
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i($pos,0);
nqp::bindpos_i(self,$pos,assignee)
}
Expand Down
6 changes: 5 additions & 1 deletion src/core/Capture.pm
Expand Up @@ -40,10 +40,14 @@ my class Capture { # declared in BOOTSTRAP
}

multi method at_pos(Capture:D: int \pos) {
nqp::existspos($!list, pos) ?? nqp::atpos($!list, pos) !! Any;
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i(pos,0);
nqp::existspos($!list,pos) ?? nqp::atpos($!list,pos) !! Any;
}
multi method at_pos(Capture:D: Int:D \pos) {
my int $pos = nqp::unbox_i(pos);
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i($pos,0);
nqp::existspos($!list,$pos) ?? nqp::atpos($!list,$pos) !! Any;
}

Expand Down
7 changes: 6 additions & 1 deletion src/core/List.pm
Expand Up @@ -89,10 +89,15 @@ my class List does Positional { # declared in BOOTSTRAP
method Supply(List:D:) { Supply.for(self) }

multi method at_pos(List:D: int \pos) is rw {
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i(pos,0);
self.exists_pos(pos) ?? nqp::atpos($!items,pos) !! Nil;
}
multi method at_pos(List:D: Int:D \pos) is rw {
self.exists_pos(pos) ?? nqp::atpos($!items,nqp::unbox_i(pos)) !! Nil;
my int $pos = nqp::unbox_i(pos);
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i($pos,0);
self.exists_pos($pos) ?? nqp::atpos($!items,$pos) !! Nil;
}

method eager() { self.gimme(*); self }
Expand Down
16 changes: 4 additions & 12 deletions src/core/Parcel.pm
Expand Up @@ -113,23 +113,15 @@ my class Parcel does Positional { # declared in BOOTSTRAP
}

multi method at_pos(Parcel:D: int \pos) is rw {
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,Inf))
).throw
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i(pos,0);
nqp::isge_i(pos,nqp::elems($!storage))
?? Nil
!! nqp::atpos($!storage,pos);
}
multi method at_pos(Parcel:D: Int:D \pos) is rw {
my int $pos = nqp::unbox_i(pos);
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,Inf))
).throw
X::OutOfRange.new(:what<Index>,:got(pos),:range<0..Inf>).throw
if nqp::islt_i($pos,0);
nqp::isge_i($pos,nqp::elems($!storage))
?? Nil
Expand All @@ -140,7 +132,7 @@ my class Parcel does Positional { # declared in BOOTSTRAP
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,nqp::elems($!storage)-1))
:range("0..{nqp::elems($!storage)-1}")
).throw
if nqp::isge_i(pos,nqp::elems($!storage)) || nqp::islt_i(pos,0);
nqp::atpos($!storage,pos) = assignee;
Expand All @@ -150,7 +142,7 @@ my class Parcel does Positional { # declared in BOOTSTRAP
X::OutOfRange.new(
:what<Index>,
:got(pos),
:range(Range.new(0,nqp::elems($!storage)-1))
:range("0..{nqp::elems($!storage)-1}")
).throw
if nqp::isge_i($pos,nqp::elems($!storage)) || nqp::islt_i($pos,0);
nqp::atpos($!storage,$pos) = assignee;
Expand Down

0 comments on commit a0de41f

Please sign in to comment.