Skip to content

Commit 0ea2318

Browse files
committed
Remove usages of ArrayBuilderNode.start() without a length
1 parent 6c2faef commit 0ea2318

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

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

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,37 @@ public RubyArray execute(VirtualFrame frame) {
4040
arrayBuilderNode = insert(ArrayBuilderNode.create());
4141
}
4242

43-
BuilderState state = arrayBuilderNode.start();
44-
int length = 0;
43+
// Compute the total length
44+
int totalLength = 0;
45+
final Object[] values = new Object[children.length];
46+
for (int n = 0; n < children.length; n++) {
47+
final Object value = values[n] = children[n].execute(frame);
48+
49+
if (isArrayProfile.profile(value instanceof RubyArray)) {
50+
totalLength += ((RubyArray) value).size;
51+
} else {
52+
totalLength++;
53+
}
54+
}
55+
56+
// Create a builder with the right length and append values
57+
BuilderState state = arrayBuilderNode.start(totalLength);
58+
int index = 0;
4559

4660
for (int n = 0; n < children.length; n++) {
47-
final Object childObject = children[n].execute(frame);
61+
final Object value = values[n];
4862

49-
if (isArrayProfile.profile(childObject instanceof RubyArray)) {
50-
final RubyArray childArray = (RubyArray) childObject;
51-
final int size = childArray.size;
52-
arrayBuilderNode.appendArray(state, length, childArray);
53-
length += size;
63+
if (isArrayProfile.profile(value instanceof RubyArray)) {
64+
final RubyArray childArray = (RubyArray) value;
65+
arrayBuilderNode.appendArray(state, index, childArray);
66+
index += childArray.size;
5467
} else {
55-
arrayBuilderNode.appendValue(state, length, childObject);
56-
length++;
68+
arrayBuilderNode.appendValue(state, index, value);
69+
index++;
5770
}
5871
}
5972

60-
return createArray(arrayBuilderNode.finish(state, length), length);
73+
return createArray(arrayBuilderNode.finish(state, index), index);
6174
}
6275

6376
@ExplodeLoop

src/test/java/org/truffleruby/ArrayBuilderTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class ArrayBuilderTest {
4343
public void emptyBuilderTest() {
4444
testInContext(() -> {
4545
ArrayBuilderNode builder = createBuilder();
46-
BuilderState state = builder.start();
46+
BuilderState state = builder.start(0);
4747
assertEquals(ArrayStoreLibrary.initialStorage(false), builder.finish(state, 0));
4848
});
4949
}

0 commit comments

Comments
 (0)