Skip to content

Commit 2c7cc10

Browse files
author
Sergey Fedorov
committed
Add support for Array subclass methods to return Array
1 parent 2d94d3b commit 2c7cc10

File tree

10 files changed

+8
-63
lines changed

10 files changed

+8
-63
lines changed

spec/tags/core/array/drop_tags.txt

-1
This file was deleted.

spec/tags/core/array/element_reference_tags.txt

-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
fails:Array#[] with a subclass of Array returns a Array instance with [n, m]
2-
fails:Array#[] with a subclass of Array returns a Array instance with [-n, m]
3-
fails:Array#[] with a subclass of Array returns a Array instance with [n..m]
4-
fails:Array#[] with a subclass of Array returns a Array instance with [n...m]
5-
fails:Array#[] with a subclass of Array returns a Array instance with [-n..-m]
6-
fails:Array#[] with a subclass of Array returns a Array instance with [-n...-m]
71
fails:Array#[] can be sliced with Enumerator::ArithmeticSequence has endless range and positive steps
82
fails:Array#[] can be sliced with Enumerator::ArithmeticSequence has beginless range and positive steps
93
fails:Array#[] can be sliced with Enumerator::ArithmeticSequence has endless range and negative steps

spec/tags/core/array/flatten_tags.txt

-1
This file was deleted.

spec/tags/core/array/multiply_tags.txt

-1
This file was deleted.

spec/tags/core/array/slice_tags.txt

-12
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,3 @@
1-
fails:Array#slice! with a subclass of Array returns a Array instance with [n, m]
2-
fails:Array#slice! with a subclass of Array returns a Array instance with [-n, m]
3-
fails:Array#slice! with a subclass of Array returns a Array instance with [n..m]
4-
fails:Array#slice! with a subclass of Array returns a Array instance with [n...m]
5-
fails:Array#slice! with a subclass of Array returns a Array instance with [-n..-m]
6-
fails:Array#slice! with a subclass of Array returns a Array instance with [-n...-m]
7-
fails:Array#slice with a subclass of Array returns a Array instance with [n, m]
8-
fails:Array#slice with a subclass of Array returns a Array instance with [-n, m]
9-
fails:Array#slice with a subclass of Array returns a Array instance with [n..m]
10-
fails:Array#slice with a subclass of Array returns a Array instance with [n...m]
11-
fails:Array#slice with a subclass of Array returns a Array instance with [-n..-m]
12-
fails:Array#slice with a subclass of Array returns a Array instance with [-n...-m]
131
fails:Array#slice can be sliced with Enumerator::ArithmeticSequence has endless range and positive steps
142
fails:Array#slice can be sliced with Enumerator::ArithmeticSequence has beginless range and positive steps
153
fails:Array#slice can be sliced with Enumerator::ArithmeticSequence has endless range and negative steps

spec/tags/core/array/uniq_tags.txt

-1
This file was deleted.

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

+1-14
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

@@ -25,7 +24,6 @@
2524
import com.oracle.truffle.api.dsl.Specialization;
2625
import com.oracle.truffle.api.library.CachedLibrary;
2726
import com.oracle.truffle.api.profiles.ConditionProfile;
28-
import org.truffleruby.language.objects.AllocationTracing;
2927

3028
@CoreModule(value = "Truffle::ArrayIndex", isClass = false)
3129
public abstract class ArrayIndexNodes {
@@ -123,22 +121,11 @@ protected RubyArray readInBounds(RubyArray array, int index, int length,
123121
? length
124122
: size - index;
125123
final Object slice = cowNode.execute(array, index, end);
126-
return createArrayOfSameClass(array, slice, end);
124+
return createArray(slice, end);
127125
}
128126

129127
protected static boolean indexInBounds(RubyArray array, int index) {
130128
return index >= 0 && index <= array.size;
131129
}
132-
133-
protected RubyArray createArrayOfSameClass(RubyArray array, Object store, int size) {
134-
final RubyClass logicalClass = array.getLogicalClass();
135-
RubyArray newArray = new RubyArray(
136-
logicalClass,
137-
getLanguage().arrayShape,
138-
store,
139-
size);
140-
AllocationTracing.trace(newArray, this);
141-
return newArray;
142-
}
143130
}
144131
}

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

+3-18
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,7 @@ 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();
167-
return new RubyArray(
168-
logicalClass,
169-
getLanguage().arrayShape,
170-
ArrayStoreLibrary.INITIAL_STORE,
171-
0);
166+
return createEmptyArray();
172167
}
173168

174169
@Specialization(
@@ -197,12 +192,7 @@ protected RubyArray mulOther(RubyArray array, int count,
197192
profileAndReportLoopCount(loopProfile, n);
198193
}
199194

200-
final RubyClass logicalClass = array.getLogicalClass();
201-
return new RubyArray(
202-
logicalClass,
203-
getLanguage().arrayShape,
204-
newStore,
205-
newSize);
195+
return createArray(newStore, newSize);
206196
}
207197

208198
@Specialization(guards = "count < 0")
@@ -217,12 +207,7 @@ protected RubyArray mulLong(RubyArray array, long count) {
217207

218208
@Specialization(guards = { "isEmptyArray(array)" })
219209
protected RubyArray mulEmpty(RubyArray array, long count) {
220-
final RubyClass logicalClass = array.getLogicalClass();
221-
return new RubyArray(
222-
logicalClass,
223-
getLanguage().arrayShape,
224-
ArrayStoreLibrary.INITIAL_STORE,
225-
0);
210+
return createEmptyArray();
226211
}
227212

228213
@Specialization(guards = { "!isImplicitLong(count)" })

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

+3-9
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

+1
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,7 @@ class Array
10511051
alias_method :take, :take
10521052
alias_method :drop_while, :drop_while
10531053
alias_method :take_while, :take_while
1054+
alias_method :uniq, :uniq
10541055
alias_method :sum, :sum
10551056
alias_method :all?, :all?
10561057
alias_method :none?, :none?

0 commit comments

Comments
 (0)