Skip to content

Commit

Permalink
[Truffle] Add ArrayStrategy#setStore for more flexibility when giving…
Browse files Browse the repository at this point in the history
… a new store.
  • Loading branch information
eregon committed Dec 2, 2016
1 parent 084b730 commit 581251e
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 7 deletions.
Expand Up @@ -41,7 +41,7 @@ public DynamicObject appendOneEmpty(DynamicObject array, Object value,
@Cached("forValue(value)") ArrayStrategy strategy) {
final ArrayMirror storeMirror = strategy.newArray(1);
storeMirror.set(0, value);
Layouts.ARRAY.setStore(array, storeMirror.getArray());
strategy.setStore(array, storeMirror.getArray());
setSize(array, 1);
return array;
}
Expand All @@ -59,7 +59,7 @@ public DynamicObject appendOneSameType(DynamicObject array, Object value,
if (extendProfile.profile(newSize > storeMirror.getLength())) {
final ArrayMirror newStoreMirror = storeMirror.copyArrayAndMirror(ArrayUtils.capacityForOneMore(getContext(), storeMirror.getLength()));
newStoreMirror.set(oldSize, value);
Layouts.ARRAY.setStore(array, newStoreMirror.getArray());
strategy.setStore(array, newStoreMirror.getArray());
setSize(array, newSize);
} else {
storeMirror.set(oldSize, value);
Expand All @@ -84,7 +84,7 @@ public DynamicObject appendOneGeneralize(DynamicObject array, Object value,
final ArrayMirror storeMirror = generalizedStrategy.newArray(newCapacity);
currentMirror.copyTo(storeMirror, 0, 0, oldSize);
storeMirror.set(oldSize, value);
Layouts.ARRAY.setStore(array, storeMirror.getArray());
generalizedStrategy.setStore(array, storeMirror.getArray());
setSize(array, newSize);
return array;
}
Expand Down
Expand Up @@ -17,7 +17,6 @@
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.api.source.SourceSection;
import org.jruby.truffle.Layouts;
import org.jruby.truffle.RubyContext;
import org.jruby.truffle.language.RubyNode;

Expand Down Expand Up @@ -46,7 +45,7 @@ public boolean ensureCapacity(DynamicObject array, int requiredCapacity,

if (extendProfile.profile(mirror.getLength() < requiredCapacity)) {
final int capacity = ArrayUtils.capacity(getContext(), mirror.getLength(), requiredCapacity);
Layouts.ARRAY.setStore(array, mirror.copyArrayAndMirror(capacity).getArray());
strategy.setStore(array, mirror.copyArrayAndMirror(capacity).getArray());
return true;
} else {
return false;
Expand Down
Expand Up @@ -58,7 +58,7 @@ public Object[] generalize(DynamicObject array, int requiredCapacity,
capacity = mirror.getLength();
}
final Object[] store = mirror.getBoxedCopy(capacity);
Layouts.ARRAY.setStore(array, store);
strategy.setStore(array, store);
return store;
}

Expand Down
Expand Up @@ -52,6 +52,11 @@ protected ArrayMirror newMirrorFromStore(Object store) {
throw unsupported();
}

public void setStore(DynamicObject array, Object store) {
assert !(store instanceof ArrayMirror);
Layouts.ARRAY.setStore(array, store);
}

@Override
public abstract String toString();

Expand Down
Expand Up @@ -89,7 +89,7 @@ public Object writeWithinGeneralize(DynamicObject array, int index, Object value
final ArrayMirror storeMirror = generalizedStrategy.newArray(currentMirror.getLength());
currentMirror.copyTo(storeMirror, 0, 0, size);
storeMirror.set(index, value);
Layouts.ARRAY.setStore(array, storeMirror.getArray());
generalizedStrategy.setStore(array, storeMirror.getArray());
return value;
}

Expand Down

0 comments on commit 581251e

Please sign in to comment.