Skip to content

Commit 15d2f59

Browse files
author
Sergey Fedorov
committed
Add support for Array subclass methods to return Array
1 parent f87d531 commit 15d2f59

File tree

5 files changed

+17
-20
lines changed

5 files changed

+17
-20
lines changed

spec/truffleruby.mspec

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,13 @@ class MSpecScript
100100
spec/ruby/core/module/attr_reader_spec.rb
101101
spec/ruby/core/module/attr_writer_spec.rb
102102
spec/ruby/core/module/attr_accessor_spec.rb
103+
spec/ruby/core/array/drop_spec.rb
104+
spec/ruby/core/array/drop_while_spec.rb
105+
spec/ruby/core/array/take_spec.rb
106+
spec/ruby/core/array/take_while_spec.rb
107+
spec/ruby/core/array/uniq_spec.rb
108+
spec/ruby/core/array/multiply_spec.rb
109+
spec/ruby/core/array/slice_spec.rb
103110
]
104111

105112
set :tags_patterns, [

src/main/java/org/truffleruby/core/array/ArrayIndexNodes.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.truffleruby.builtins.Primitive;
1414
import org.truffleruby.builtins.PrimitiveArrayArgumentsNode;
1515
import org.truffleruby.core.array.library.ArrayStoreLibrary;
16-
import org.truffleruby.core.klass.RubyClass;
1716
import org.truffleruby.language.RubyContextSourceNode;
1817
import org.truffleruby.language.RubyNode;
1918

@@ -123,17 +122,16 @@ protected RubyArray readInBounds(RubyArray array, int index, int length,
123122
? length
124123
: size - index;
125124
final Object slice = cowNode.execute(array, index, end);
126-
return createArrayOfSameClass(array, slice, end);
125+
return createArray(array, slice, end);
127126
}
128127

129128
protected static boolean indexInBounds(RubyArray array, int index) {
130129
return index >= 0 && index <= array.size;
131130
}
132131

133-
protected RubyArray createArrayOfSameClass(RubyArray array, Object store, int size) {
134-
final RubyClass logicalClass = array.getLogicalClass();
132+
protected RubyArray createArray(RubyArray array, Object store, int size) {
135133
RubyArray newArray = new RubyArray(
136-
logicalClass,
134+
coreLibrary().arrayClass,
137135
getLanguage().arrayShape,
138136
store,
139137
size);

src/main/java/org/truffleruby/core/array/ArrayNodes.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,8 @@ public abstract static class MulNode extends PrimitiveArrayArgumentsNode {
163163

164164
@Specialization(guards = "count == 0")
165165
protected RubyArray mulZero(RubyArray array, int count) {
166-
final RubyClass logicalClass = array.getLogicalClass();
167166
return new RubyArray(
168-
logicalClass,
167+
coreLibrary().arrayClass,
169168
getLanguage().arrayShape,
170169
ArrayStoreLibrary.INITIAL_STORE,
171170
0);
@@ -197,9 +196,8 @@ protected RubyArray mulOther(RubyArray array, int count,
197196
profileAndReportLoopCount(loopProfile, n);
198197
}
199198

200-
final RubyClass logicalClass = array.getLogicalClass();
201199
return new RubyArray(
202-
logicalClass,
200+
coreLibrary().arrayClass,
203201
getLanguage().arrayShape,
204202
newStore,
205203
newSize);
@@ -217,9 +215,8 @@ protected RubyArray mulLong(RubyArray array, long count) {
217215

218216
@Specialization(guards = { "isEmptyArray(array)" })
219217
protected RubyArray mulEmpty(RubyArray array, long count) {
220-
final RubyClass logicalClass = array.getLogicalClass();
221218
return new RubyArray(
222-
logicalClass,
219+
coreLibrary().arrayClass,
223220
getLanguage().arrayShape,
224221
ArrayStoreLibrary.INITIAL_STORE,
225222
0);

src/main/ruby/truffleruby/core/array.rb

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ def <=>(other)
109109

110110
def *(count)
111111
result = Primitive.array_mul(self, count)
112+
112113
if !Primitive.undefined?(result)
113114
result
114115
elsif str = Truffle::Type.rb_check_convert_type(count, String, :to_str)
@@ -443,9 +444,9 @@ def first(n = undefined)
443444

444445
def flatten(level=-1)
445446
level = Primitive.rb_num2int level
446-
return self.dup if level == 0
447+
return Array.new(self) if level == 0
447448

448-
out = self.class.allocate # new_reserved size
449+
out = [] # new_reserved size
449450
Primitive.array_flatten_helper(self, out, level)
450451
out
451452
end
@@ -1591,13 +1592,6 @@ def delete_range(index, del_length)
15911592
end
15921593
private :delete_range
15931594

1594-
def uniq(&block)
1595-
copy_of_same_class = dup
1596-
result = super(&block)
1597-
Primitive.steal_array_storage(copy_of_same_class, result)
1598-
copy_of_same_class
1599-
end
1600-
16011595
def uniq!(&block)
16021596
Primitive.check_frozen self
16031597
result = uniq(&block)

src/main/ruby/truffleruby/core/enumerable.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,7 @@ class Array
10371037
alias_method :take, :take
10381038
alias_method :drop_while, :drop_while
10391039
alias_method :take_while, :take_while
1040+
alias_method :uniq, :uniq
10401041
alias_method :sum, :sum
10411042
alias_method :all?, :all?
10421043
alias_method :none?, :none?

0 commit comments

Comments
 (0)