Skip to content

Commit 7f6f373

Browse files
committed
[GR-17457] Fix Enumerable#inject edge case usage with arrays
PullRequest: truffleruby/3262
2 parents a7c94e0 + b3c59e3 commit 7f6f373

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

spec/ruby/core/enumerable/shared/inject.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
end
1818

1919
it "ignores the block if two arguments" do
20-
EnumerableSpecs::Numerous.new(1, 2, 3).send(@method, 10, :-){ raise "we never get here"}.should == 4
20+
EnumerableSpecs::Numerous.new(1, 2, 3).send(@method, 10, :-) { raise "we never get here"}.should == 4
21+
[].send(@method, 3, :+) { raise "we never get here"}.should == 3
2122
end
2223

2324
it "can take a symbol argument" do

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

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ public abstract static class InjectNode extends YieldingCoreMethodNode {
13351335

13361336
@Child private DispatchNode dispatch = DispatchNode.create(PUBLIC);
13371337

1338-
// With block
1338+
// Uses block
13391339

13401340
@Specialization(guards = { "isEmptyArray(array)", "wasProvided(initialOrSymbol)" })
13411341
@ReportPolymorphism.Exclude
@@ -1392,15 +1392,7 @@ public Object injectBlockHelper(ArrayStoreLibrary stores, RubyArray array,
13921392
return accumulator;
13931393
}
13941394

1395-
// With Symbol
1396-
1397-
@Specialization(
1398-
guards = {
1399-
"isEmptyArray(array)",
1400-
"wasProvided(initialOrSymbol)" })
1401-
protected Object injectSymbolEmptyArray(RubyArray array, Object initialOrSymbol, RubySymbol symbol, Nil block) {
1402-
return initialOrSymbol;
1403-
}
1395+
// Uses Symbol
14041396

14051397
@Specialization(guards = { "isEmptyArray(array)" })
14061398
protected Object injectSymbolEmptyArrayNoInitial(
@@ -1410,11 +1402,18 @@ protected Object injectSymbolEmptyArrayNoInitial(
14101402

14111403
@Specialization(
14121404
guards = {
1413-
"!isEmptyArray(array)",
1414-
"wasProvided(initialOrSymbol)" },
1405+
"isEmptyArray(array)",
1406+
"wasProvided(initialOrSymbol)" })
1407+
protected Object injectSymbolEmptyArray(
1408+
RubyArray array, Object initialOrSymbol, RubySymbol symbol, Object maybeBlock) {
1409+
return initialOrSymbol;
1410+
}
1411+
1412+
@Specialization(
1413+
guards = { "!isEmptyArray(array)" },
14151414
limit = "storageStrategyLimit()")
1416-
protected Object injectSymbolWithInitial(
1417-
VirtualFrame frame, RubyArray array, Object initialOrSymbol, RubySymbol symbol, Nil block,
1415+
protected Object injectSymbolNoInitial(
1416+
VirtualFrame frame, RubyArray array, RubySymbol initialOrSymbol, NotProvided symbol, Nil block,
14181417
@Bind("array.store") Object store,
14191418
@CachedLibrary("store") ArrayStoreLibrary stores,
14201419
@Cached IntValueProfile arraySizeProfile,
@@ -1423,20 +1422,22 @@ protected Object injectSymbolWithInitial(
14231422
return injectSymbolHelper(
14241423
frame,
14251424
array,
1426-
toJavaString.executeToJavaString(symbol),
1425+
toJavaString.executeToJavaString(initialOrSymbol),
14271426
stores,
14281427
store,
1429-
initialOrSymbol,
1430-
0,
1428+
stores.read(store, 0),
1429+
1,
14311430
arraySizeProfile,
14321431
loopProfile);
14331432
}
14341433

14351434
@Specialization(
1436-
guards = { "!isEmptyArray(array)" },
1435+
guards = {
1436+
"!isEmptyArray(array)",
1437+
"wasProvided(initialOrSymbol)" },
14371438
limit = "storageStrategyLimit()")
1438-
protected Object injectSymbolNoInitial(
1439-
VirtualFrame frame, RubyArray array, RubySymbol initialOrSymbol, NotProvided symbol, Nil block,
1439+
protected Object injectSymbolWithInitial(
1440+
VirtualFrame frame, RubyArray array, Object initialOrSymbol, RubySymbol symbol, Object block,
14401441
@Bind("array.store") Object store,
14411442
@CachedLibrary("store") ArrayStoreLibrary stores,
14421443
@Cached IntValueProfile arraySizeProfile,
@@ -1445,15 +1446,17 @@ protected Object injectSymbolNoInitial(
14451446
return injectSymbolHelper(
14461447
frame,
14471448
array,
1448-
toJavaString.executeToJavaString(initialOrSymbol),
1449+
toJavaString.executeToJavaString(symbol),
14491450
stores,
14501451
store,
1451-
stores.read(store, 0),
1452-
1,
1452+
initialOrSymbol,
1453+
0,
14531454
arraySizeProfile,
14541455
loopProfile);
14551456
}
14561457

1458+
// No Symbol or Block
1459+
14571460
@Specialization
14581461
protected Object injectNoSymbolNonEmptyArrayNoInitial(
14591462
RubyArray array, NotProvided initialOrSymbol, NotProvided symbol, Nil block) {

0 commit comments

Comments
 (0)