Skip to content

Commit

Permalink
Showing 1 changed file with 58 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -2074,7 +2074,7 @@ public RubyBasicObject initializeCopyObject(RubyArray self, RubyArray from) {

}

@CoreMethod(names = {"inject", "reduce"}, needsBlock = true, optional = 1)
@CoreMethod(names = {"inject", "reduce"}, needsBlock = true, optional = 2)
@ImportStatic(ArrayGuards.class)
public abstract static class InjectNode extends YieldingCoreMethodNode {

@@ -2086,96 +2086,129 @@ public InjectNode(RubyContext context, SourceSection sourceSection) {
}

@Specialization(guards = { "isEmptyArray(array)", "wasProvided(initial)" })
public Object injectEmptyArray(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectEmptyArray(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return initial;
}

@Specialization(guards = { "isEmptyArray(array)", "wasNotProvided(initial)" })
public Object injectEmptyArrayNoInitial(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectEmptyArrayNoInitial(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return nil();
}

@Specialization(guards = { "isIntArray(array)", "!isEmptyArray(array)", "wasProvided(initial)" })
public Object injectIntegerFixnum(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectIntegerFixnum(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return injectHelper(frame, ArrayMirror.reflect((int[]) ArrayNodes.getStore(array)), array, initial, block, 0);
}

@Specialization(guards = { "isIntArray(array)", "!isEmptyArray(array)", "wasNotProvided(initial)" })
public Object injectIntegerFixnumNoInitial(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectIntegerFixnumNoInitial(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
final ArrayMirror mirror = ArrayMirror.reflect((int[]) ArrayNodes.getStore(array));

return injectHelper(frame, mirror, array, mirror.get(0), block, 1);
}

@Specialization(guards = { "isLongArray(array)", "!isEmptyArray(array)", "wasProvided(initial)" })
public Object injectLongFixnum(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectLongFixnum(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return injectHelper(frame, ArrayMirror.reflect((long[]) ArrayNodes.getStore(array)), array, initial, block, 0);
}

@Specialization(guards = { "isLongArray(array)", "!isEmptyArray(array)", "wasNotProvided(initial)" })
public Object injectLongFixnumNoInitial(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectLongFixnumNoInitial(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
final ArrayMirror mirror = ArrayMirror.reflect((long[]) ArrayNodes.getStore(array));

return injectHelper(frame, mirror, array, mirror.get(0), block, 1);
}

@Specialization(guards = { "isDoubleArray(array)", "!isEmptyArray(array)", "wasProvided(initial)" })
public Object injectFloat(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectFloat(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return injectHelper(frame, ArrayMirror.reflect((double[]) ArrayNodes.getStore(array)), array, initial, block, 0);
}

@Specialization(guards = { "isDoubleArray(array)", "!isEmptyArray(array)", "wasNotProvided(initial)" })
public Object injectFloatNoInitial(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectFloatNoInitial(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
final ArrayMirror mirror = ArrayMirror.reflect((double[]) ArrayNodes.getStore(array));

return injectHelper(frame, mirror, array, mirror.get(0), block, 1);
}

@Specialization(guards = { "isObjectArray(array)", "!isEmptyArray(array)", "wasProvided(initial)" })
public Object injectObject(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectObject(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return injectHelper(frame, ArrayMirror.reflect((Object[]) ArrayNodes.getStore(array)), array, initial, block, 0);
}

@Specialization(guards = { "isObjectArray(array)", "!isEmptyArray(array)", "wasNotProvided(initial)" })
public Object injectObjectNoInitial(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectObjectNoInitial(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
final ArrayMirror mirror = ArrayMirror.reflect((Object[]) ArrayNodes.getStore(array));

return injectHelper(frame, mirror, array, mirror.get(0), block, 1);
}

@Specialization(guards = { "isNullArray(array)", "wasProvided(initial)" })
public Object injectNull(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectNull(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return initial;
}

@Specialization(guards = { "isNullArray(array)", "wasNotProvided(initial)" })
public Object injectNullNoInitial(VirtualFrame frame, RubyArray array, Object initial, RubyProc block) {
public Object injectNullNoInitial(VirtualFrame frame, RubyArray array, Object initial, NotProvided ignored, RubyProc block) {
return nil();
}

@Specialization(guards = { "isRubySymbol(symbol)", "isEmptyArray(array)" })
public Object injectSymbolEmptyArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided block) {
public Object injectSymbolEmptyArray(VirtualFrame frame, RubyArray array, Object initial, RubyBasicObject symbol, NotProvided block) {
return initial;
}

@Specialization(guards = { "isRubySymbol(symbol)", "isEmptyArray(array)" })
public Object injectSymbolEmptyArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided ignored, NotProvided block) {
return nil();
}

@Specialization(guards = { "isRubySymbol(symbol)", "isIntArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolIntArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((int[]) ArrayNodes.getStore(array)), array, symbol);
public Object injectSymbolIntArray(VirtualFrame frame, RubyArray array, Object initial, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((int[]) ArrayNodes.getStore(array)), array, initial, symbol, 0);
}

@Specialization(guards = { "isRubySymbol(symbol)", "isIntArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolIntArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided ignored, NotProvided block) {
final ArrayMirror mirror = ArrayMirror.reflect((int[]) ArrayNodes.getStore(array));

return injectSymbolHelper(frame, mirror, array, mirror.get(0), symbol, 1);
}

@Specialization(guards = { "isRubySymbol(symbol)", "isLongArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolLongArray(VirtualFrame frame, RubyArray array, Object initial, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((long[]) ArrayNodes.getStore(array)), array, initial, symbol, 0);
}

@Specialization(guards = { "isRubySymbol(symbol)", "isLongArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolLongArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((long[]) ArrayNodes.getStore(array)), array, symbol);
public Object injectSymbolLongArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided ignored, NotProvided block) {
final ArrayMirror mirror = ArrayMirror.reflect((long[]) ArrayNodes.getStore(array));

return injectSymbolHelper(frame, mirror, array, mirror.get(0), symbol, 1);
}

@Specialization(guards = { "isRubySymbol(symbol)", "isDoubleArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolDoubleArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((double[]) ArrayNodes.getStore(array)), array, symbol);
public Object injectSymbolDoubleArray(VirtualFrame frame, RubyArray array, Object initial, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((double[]) ArrayNodes.getStore(array)), array, initial, symbol, 0);
}

@Specialization(guards = { "isRubySymbol(symbol)", "isDoubleArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolDoubleArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided ignored, NotProvided block) {
final ArrayMirror mirror = ArrayMirror.reflect((double[]) ArrayNodes.getStore(array));

return injectSymbolHelper(frame, mirror, array, mirror.get(0), symbol, 1);
}

@Specialization(guards = { "isRubySymbol(symbol)", "isObjectArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolObjectArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((Object[]) ArrayNodes.getStore(array)), array, symbol);
public Object injectSymbolObjectArray(VirtualFrame frame, RubyArray array, Object initial, RubyBasicObject symbol, NotProvided block) {
return injectSymbolHelper(frame, ArrayMirror.reflect((Object[]) ArrayNodes.getStore(array)), array, initial, symbol, 0);
}

@Specialization(guards = { "isRubySymbol(symbol)", "isObjectArray(array)", "!isEmptyArray(array)" })
public Object injectSymbolObjectArray(VirtualFrame frame, RubyArray array, RubyBasicObject symbol, NotProvided ignored, NotProvided block) {
final ArrayMirror mirror = ArrayMirror.reflect((Object[]) ArrayNodes.getStore(array));

return injectSymbolHelper(frame, mirror, array, mirror.get(0), symbol, 1);
}

private Object injectHelper(VirtualFrame frame, ArrayMirror mirror, RubyArray array, Object initial, RubyProc block, int startIndex) {
@@ -2201,13 +2234,13 @@ private Object injectHelper(VirtualFrame frame, ArrayMirror mirror, RubyArray ar
}


private Object injectSymbolHelper(VirtualFrame frame, ArrayMirror mirror, RubyArray array, RubyBasicObject symbol) {
private Object injectSymbolHelper(VirtualFrame frame, ArrayMirror mirror, RubyArray array, Object initial, RubyBasicObject symbol, int startIndex) {
int count = 0;

Object accumulator = mirror.get(0);
Object accumulator = initial;

try {
for (int n = 1; n < getSize(array); n++) {
for (int n = startIndex; n < getSize(array); n++) {
if (CompilerDirectives.inInterpreter()) {
count++;
}

0 comments on commit e909e2d

Please sign in to comment.