Skip to content

Commit

Permalink
Showing 2 changed files with 21 additions and 5 deletions.
1 change: 0 additions & 1 deletion spec/truffle/tags/core/array/delete_tags.txt

This file was deleted.

25 changes: 21 additions & 4 deletions truffle/src/main/java/org/jruby/truffle/core/array/ArrayNodes.java
Original file line number Diff line number Diff line change
@@ -695,8 +695,9 @@ public DynamicObject concat(DynamicObject array, DynamicObject other) {

}

@CoreMethod(names = "delete", required = 1)
public abstract static class DeleteNode extends ArrayCoreMethodNode {
@CoreMethod(names = "delete", required = 1, needsBlock = true)
@ImportStatic(ArrayGuards.class)
public abstract static class DeleteNode extends YieldingCoreMethodNode {

@Child private KernelNodes.SameOrEqualNode equalNode;
@Child private IsFrozenNode isFrozenNode;
@@ -707,16 +708,22 @@ public DeleteNode(RubyContext context, SourceSection sourceSection) {
}

@Specialization(guards = "isNullArray(array)")
public Object deleteNull(VirtualFrame frame, DynamicObject array, Object value) {
public Object deleteNull(VirtualFrame frame, DynamicObject array, Object value, NotProvided block) {
return nil();
}

@Specialization(guards = "isNullArray(array)")
public Object deleteNull(VirtualFrame frame, DynamicObject array, Object value, DynamicObject block) {
return yield(frame, block, value);
}

@Specialization(guards = "strategy.matches(array)", limit = "ARRAY_STRATEGIES")
public Object delete(VirtualFrame frame, DynamicObject array, Object value,
public Object delete(VirtualFrame frame, DynamicObject array, Object value, Object maybeBlock,
@Cached("of(array)") ArrayStrategy strategy) {
final ArrayMirror store = strategy.newMirror(array);

Object found = nil();
boolean isFound = false;

int i = 0;
int n = 0;
@@ -726,6 +733,7 @@ public Object delete(VirtualFrame frame, DynamicObject array, Object value,
if (equalNode.executeSameOrEqual(frame, stored, value)) {
checkFrozen(array);
found = stored;
isFound = true;
continue;
}

@@ -739,6 +747,15 @@ public Object delete(VirtualFrame frame, DynamicObject array, Object value,
if (i != n) {
setStoreAndSize(array, store.getArray(), i);
}

if(!isFound){
if (maybeBlock == NotProvided.INSTANCE) {
return nil();
} else {
return yield(frame, (DynamicObject) maybeBlock, value);
}
}

return found;
}

0 comments on commit 2883eb6

Please sign in to comment.