Skip to content

Commit

Permalink
Showing 11 changed files with 144 additions and 144 deletions.
12 changes: 6 additions & 6 deletions truffle/src/main/java/org/jruby/truffle/Layouts.java
Original file line number Diff line number Diff line change
@@ -50,10 +50,10 @@
import org.jruby.truffle.core.queue.QueueLayoutImpl;
import org.jruby.truffle.core.queue.SizedQueueLayout;
import org.jruby.truffle.core.queue.SizedQueueLayoutImpl;
import org.jruby.truffle.core.range.IntegerFixnumRangeLayout;
import org.jruby.truffle.core.range.IntegerFixnumRangeLayoutImpl;
import org.jruby.truffle.core.range.LongFixnumRangeLayout;
import org.jruby.truffle.core.range.LongFixnumRangeLayoutImpl;
import org.jruby.truffle.core.range.IntRangeLayout;
import org.jruby.truffle.core.range.IntRangeLayoutImpl;
import org.jruby.truffle.core.range.LongRangeLayout;
import org.jruby.truffle.core.range.LongRangeLayoutImpl;
import org.jruby.truffle.core.range.ObjectRangeLayout;
import org.jruby.truffle.core.range.ObjectRangeLayoutImpl;
import org.jruby.truffle.core.regexp.MatchDataLayout;
@@ -111,10 +111,10 @@ public abstract class Layouts {
public static final ExceptionLayout EXCEPTION = ExceptionLayoutImpl.INSTANCE;
public static final FiberLayout FIBER = FiberLayoutImpl.INSTANCE;
public static final HashLayout HASH = HashLayoutImpl.INSTANCE;
public static final IntegerFixnumRangeLayout INTEGER_FIXNUM_RANGE = IntegerFixnumRangeLayoutImpl.INSTANCE;
public static final IntRangeLayout INT_RANGE = IntRangeLayoutImpl.INSTANCE;
public static final IOBufferLayout IO_BUFFER = IOBufferLayoutImpl.INSTANCE;
public static final IOLayout IO = IOLayoutImpl.INSTANCE;
public static final LongFixnumRangeLayout LONG_FIXNUM_RANGE = LongFixnumRangeLayoutImpl.INSTANCE;
public static final LongRangeLayout LONG_RANGE = LongRangeLayoutImpl.INSTANCE;
public static final MatchDataLayout MATCH_DATA = MatchDataLayoutImpl.INSTANCE;
public static final MethodLayout METHOD = MethodLayoutImpl.INSTANCE;
public static final ModuleLayout MODULE = ModuleLayoutImpl.INSTANCE;
17 changes: 8 additions & 9 deletions truffle/src/main/java/org/jruby/truffle/core/CoreLibrary.java
Original file line number Diff line number Diff line change
@@ -186,6 +186,8 @@ public class CoreLibrary {
private final DynamicObjectFactory procFactory;
private final DynamicObject processModule;
private final DynamicObject rangeClass;
private final DynamicObjectFactory intRangeFactory;
private final DynamicObjectFactory longRangeFactory;
private final DynamicObject rangeErrorClass;
private final DynamicObject rationalClass;
private final DynamicObject regexpClass;
@@ -365,9 +367,6 @@ private enum State {

private State state = State.INITIALIZING;

private final DynamicObjectFactory integerFixnumRangeFactory;
private final DynamicObjectFactory longFixnumRangeFactory;

private static class CoreLibraryNode extends RubyNode {

@Child SingletonClassNode singletonClassNode;
@@ -546,8 +545,8 @@ public CoreLibrary(RubyContext context) {
Layouts.CLASS.setInstanceFactoryUnsafe(sizedQueueClass, Layouts.SIZED_QUEUE.createSizedQueueShape(sizedQueueClass, sizedQueueClass));
rangeClass = defineClass("Range");
Layouts.CLASS.setInstanceFactoryUnsafe(rangeClass, Layouts.OBJECT_RANGE.createObjectRangeShape(rangeClass, rangeClass));
integerFixnumRangeFactory = Layouts.INTEGER_FIXNUM_RANGE.createIntegerFixnumRangeShape(rangeClass, rangeClass);
longFixnumRangeFactory = Layouts.LONG_FIXNUM_RANGE.createLongFixnumRangeShape(rangeClass, rangeClass);
intRangeFactory = Layouts.INT_RANGE.createIntRangeShape(rangeClass, rangeClass);
longRangeFactory = Layouts.LONG_RANGE.createLongRangeShape(rangeClass, rangeClass);
regexpClass = defineClass("Regexp");
Layouts.CLASS.setInstanceFactoryUnsafe(regexpClass, Layouts.REGEXP.createRegexpShape(regexpClass, regexpClass));
stringClass = defineClass("String");
@@ -1423,12 +1422,12 @@ public boolean isSend(InternalMethod method) {
return method.getCallTarget() == basicObjectSendMethod.getCallTarget();
}

public DynamicObjectFactory getIntegerFixnumRangeFactory() {
return integerFixnumRangeFactory;
public DynamicObjectFactory getIntRangeFactory() {
return intRangeFactory;
}

public DynamicObjectFactory getLongFixnumRangeFactory() {
return longFixnumRangeFactory;
public DynamicObjectFactory getLongRangeFactory() {
return longRangeFactory;
}

public DynamicObject getDigestClass() {
24 changes: 12 additions & 12 deletions truffle/src/main/java/org/jruby/truffle/core/array/ArrayNodes.java
Original file line number Diff line number Diff line change
@@ -299,18 +299,18 @@ public DynamicObject slice(VirtualFrame frame, DynamicObject array, int start, i
return readSliceNode.executeReadSlice(array, start, length);
}

@Specialization(guards = "isIntegerFixnumRange(range)")
@Specialization(guards = "isIntRange(range)")
public DynamicObject slice(VirtualFrame frame, DynamicObject array, DynamicObject range, NotProvided len,
@Cached("createBinaryProfile()") ConditionProfile negativeBeginProfile,
@Cached("createBinaryProfile()") ConditionProfile negativeEndProfile) {
final int size = getSize(array);
final int normalizedIndex = ArrayOperations.normalizeIndex(size, Layouts.INTEGER_FIXNUM_RANGE.getBegin(range), negativeBeginProfile);
final int normalizedIndex = ArrayOperations.normalizeIndex(size, Layouts.INT_RANGE.getBegin(range), negativeBeginProfile);

if (normalizedIndex < 0 || normalizedIndex > size) {
return nil();
} else {
final int end = ArrayOperations.normalizeIndex(size, Layouts.INTEGER_FIXNUM_RANGE.getEnd(range), negativeEndProfile);
final int exclusiveEnd = ArrayOperations.clampExclusiveIndex(size, Layouts.INTEGER_FIXNUM_RANGE.getExcludedEnd(range) ? end : end + 1);
final int end = ArrayOperations.normalizeIndex(size, Layouts.INT_RANGE.getEnd(range), negativeEndProfile);
final int exclusiveEnd = ArrayOperations.clampExclusiveIndex(size, Layouts.INT_RANGE.getExcludedEnd(range) ? end : end + 1);

if (exclusiveEnd <= normalizedIndex) {
return allocateObjectNode.allocate(Layouts.BASIC_OBJECT.getLogicalClass(array), null, 0);
@@ -327,13 +327,13 @@ public DynamicObject slice(VirtualFrame frame, DynamicObject array, DynamicObjec
}
}

@Specialization(guards = { "!isInteger(a)", "!isIntegerFixnumRange(a)" })
@Specialization(guards = { "!isInteger(a)", "!isIntRange(a)" })
public Object fallbackIndex(VirtualFrame frame, DynamicObject array, Object a, NotProvided length) {
Object[] objects = new Object[] { a };
return fallback(frame, array, createArray(getContext(), objects, objects.length));
}

@Specialization(guards = { "!isIntegerFixnumRange(a)", "wasProvided(b)" })
@Specialization(guards = { "!isIntRange(a)", "wasProvided(b)" })
public Object fallbackSlice(VirtualFrame frame, DynamicObject array, Object a, Object b) {
Object[] objects = new Object[] { a, b };
return fallback(frame, array, createArray(getContext(), objects, objects.length));
@@ -377,7 +377,7 @@ public Object set(DynamicObject array, int index, Object value, NotProvided unus

// array[index] = object with non-int index

@Specialization(guards = { "!isInteger(indexObject)", "!isIntegerFixnumRange(indexObject)", "!isObjectRange(indexObject)" })
@Specialization(guards = { "!isInteger(indexObject)", "!isRubyRange(indexObject)" })
public Object set(VirtualFrame frame, DynamicObject array, Object indexObject, Object value, NotProvided unused) {
final int index = toInt(frame, indexObject);
return executeSet(frame, array, index, value, unused);
@@ -485,20 +485,20 @@ public Object setStartLengthNotInt(VirtualFrame frame, DynamicObject array, Obje

// array[start..end] = object_or_array

@Specialization(guards = "isIntegerFixnumRange(range)")
@Specialization(guards = "isIntRange(range)")
public Object setRange(VirtualFrame frame, DynamicObject array, DynamicObject range, Object value, NotProvided unused,
@Cached("createBinaryProfile()") ConditionProfile negativeBeginProfile,
@Cached("createBinaryProfile()") ConditionProfile negativeEndProfile,
@Cached("create()") BranchProfile errorProfile) {
final int size = getSize(array);
final int begin = Layouts.INTEGER_FIXNUM_RANGE.getBegin(range);
final int begin = Layouts.INT_RANGE.getBegin(range);
final int start = ArrayOperations.normalizeIndex(size, begin, negativeBeginProfile);
if (start < 0) {
errorProfile.enter();
throw new RaiseException(coreExceptions().rangeError(range, this));
}
final int end = ArrayOperations.normalizeIndex(size, Layouts.INTEGER_FIXNUM_RANGE.getEnd(range), negativeEndProfile);
int inclusiveEnd = Layouts.INTEGER_FIXNUM_RANGE.getExcludedEnd(range) ? end - 1 : end;
final int end = ArrayOperations.normalizeIndex(size, Layouts.INT_RANGE.getEnd(range), negativeEndProfile);
int inclusiveEnd = Layouts.INT_RANGE.getExcludedEnd(range) ? end - 1 : end;
if (inclusiveEnd < 0) {
inclusiveEnd = -1;
}
@@ -507,7 +507,7 @@ public Object setRange(VirtualFrame frame, DynamicObject array, DynamicObject ra
return executeSet(frame, array, start, normalizeLength, value);
}

@Specialization(guards = { "!isIntegerFixnumRange(range)", "isRubyRange(range)" })
@Specialization(guards = { "!isIntRange(range)", "isRubyRange(range)" })
public Object setOtherRange(VirtualFrame frame, DynamicObject array, DynamicObject range, Object value, NotProvided unused,
@Cached("create()") ToIntRangeNode toIntRangeNode) {
DynamicObject intRange = toIntRangeNode.executeToIntRange(frame, range);
Original file line number Diff line number Diff line change
@@ -28,27 +28,27 @@ public static ToIntRangeNode create() {

public abstract DynamicObject executeToIntRange(VirtualFrame frame, DynamicObject range);

@Specialization(guards = "isIntegerFixnumRange(range)")
@Specialization(guards = "isIntRange(range)")
public DynamicObject intRange(DynamicObject range) {
return range;
}

@Specialization(guards = "isLongFixnumRange(range)")
@Specialization(guards = "isLongRange(range)")
public DynamicObject longRange(VirtualFrame frame, DynamicObject range) {
int begin = toInt(frame, Layouts.LONG_FIXNUM_RANGE.getBegin(range));
int end = toInt(frame, Layouts.LONG_FIXNUM_RANGE.getEnd(range));
boolean excludedEnd = Layouts.LONG_FIXNUM_RANGE.getExcludedEnd(range);
return Layouts.INTEGER_FIXNUM_RANGE.createIntegerFixnumRange(
coreLibrary().getIntegerFixnumRangeFactory(), excludedEnd, begin, end);
int begin = toInt(frame, Layouts.LONG_RANGE.getBegin(range));
int end = toInt(frame, Layouts.LONG_RANGE.getEnd(range));
boolean excludedEnd = Layouts.LONG_RANGE.getExcludedEnd(range);
return Layouts.INT_RANGE.createIntRange(
coreLibrary().getIntRangeFactory(), excludedEnd, begin, end);
}

@Specialization(guards = "isObjectRange(range)")
public DynamicObject objectRange(VirtualFrame frame, DynamicObject range) {
int begin = toInt(frame, Layouts.OBJECT_RANGE.getBegin(range));
int end = toInt(frame, Layouts.OBJECT_RANGE.getEnd(range));
boolean excludedEnd = Layouts.OBJECT_RANGE.getExcludedEnd(range);
return Layouts.INTEGER_FIXNUM_RANGE.createIntegerFixnumRange(
coreLibrary().getIntegerFixnumRangeFactory(), excludedEnd, begin, end);
return Layouts.INT_RANGE.createIntRange(
coreLibrary().getIntRangeFactory(), excludedEnd, begin, end);
}

private int toInt(VirtualFrame frame, Object indexObject) {
Original file line number Diff line number Diff line change
@@ -636,11 +636,11 @@ public DynamicObject rangeError(String type, String value, String range, Node cu

@TruffleBoundary
public DynamicObject rangeError(DynamicObject range, Node currentNode) {
assert RubyGuards.isIntegerFixnumRange(range);
assert RubyGuards.isIntRange(range);
return rangeError(String.format("%d..%s%d out of range",
Layouts.INTEGER_FIXNUM_RANGE.getBegin(range),
Layouts.INTEGER_FIXNUM_RANGE.getExcludedEnd(range) ? "." : "",
Layouts.INTEGER_FIXNUM_RANGE.getEnd(range)), currentNode);
Layouts.INT_RANGE.getBegin(range),
Layouts.INT_RANGE.getExcludedEnd(range) ? "." : "",
Layouts.INT_RANGE.getEnd(range)), currentNode);
}

@TruffleBoundary
Original file line number Diff line number Diff line change
@@ -15,18 +15,18 @@
import org.jruby.truffle.core.basicobject.BasicObjectLayout;

@Layout
public interface IntegerFixnumRangeLayout extends BasicObjectLayout {
public interface IntRangeLayout extends BasicObjectLayout {

DynamicObjectFactory createIntegerFixnumRangeShape(DynamicObject logicalClass,
DynamicObject metaClass);
DynamicObjectFactory createIntRangeShape(DynamicObject logicalClass, DynamicObject metaClass);

DynamicObject createIntegerFixnumRange(DynamicObjectFactory factory,
boolean excludedEnd,
int begin,
int end);
DynamicObject createIntRange(
DynamicObjectFactory factory,
boolean excludedEnd,
int begin,
int end);

boolean isIntegerFixnumRange(Object object);
boolean isIntegerFixnumRange(DynamicObject object);
boolean isIntRange(Object object);
boolean isIntRange(DynamicObject object);

boolean getExcludedEnd(DynamicObject object);

Original file line number Diff line number Diff line change
@@ -15,18 +15,19 @@
import org.jruby.truffle.core.basicobject.BasicObjectLayout;

@Layout
public interface LongFixnumRangeLayout extends BasicObjectLayout {
public interface LongRangeLayout extends BasicObjectLayout {

DynamicObjectFactory createLongFixnumRangeShape(DynamicObject logicalClass,
DynamicObject metaClass);
DynamicObjectFactory createLongRangeShape(DynamicObject logicalClass, DynamicObject metaClass);

DynamicObject createLongFixnumRange(DynamicObjectFactory factory,
boolean excludedEnd,
long begin,
long end);
DynamicObject createLongRange(
DynamicObjectFactory factory,
boolean excludedEnd,
long begin,
long end);

boolean isLongFixnumRange(Object object);
boolean isLongFixnumRange(DynamicObject object);
boolean isLongRange(Object object);

boolean isLongRange(DynamicObject object);

boolean getExcludedEnd(DynamicObject object);

136 changes: 68 additions & 68 deletions truffle/src/main/java/org/jruby/truffle/core/range/RangeNodes.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -227,7 +227,7 @@ public Object getIndexString(DynamicObject matchData, DynamicObject index, NotPr
}
}

@Specialization(guards = {"!isRubySymbol(index)", "!isRubyString(index)", "!isIntegerFixnumRange(index)"})
@Specialization(guards = { "!isRubySymbol(index)", "!isRubyString(index)", "!isIntRange(index)" })
public Object getIndex(VirtualFrame frame, DynamicObject matchData, Object index, NotProvided length) {
if (toIntNode == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -238,12 +238,12 @@ public Object getIndex(VirtualFrame frame, DynamicObject matchData, Object index
}

@TruffleBoundary
@Specialization(guards = "isIntegerFixnumRange(range)")
@Specialization(guards = "isIntRange(range)")
public Object getIndex(DynamicObject matchData, DynamicObject range, NotProvided len) {
final Object[] values = Layouts.MATCH_DATA.getValues(matchData);
final int normalizedIndex = ArrayOperations.normalizeIndex(values.length, Layouts.INTEGER_FIXNUM_RANGE.getBegin(range));
final int end = ArrayOperations.normalizeIndex(values.length, Layouts.INTEGER_FIXNUM_RANGE.getEnd(range));
final int exclusiveEnd = ArrayOperations.clampExclusiveIndex(values.length, Layouts.INTEGER_FIXNUM_RANGE.getExcludedEnd(range) ? end : end + 1);
final int normalizedIndex = ArrayOperations.normalizeIndex(values.length, Layouts.INT_RANGE.getBegin(range));
final int end = ArrayOperations.normalizeIndex(values.length, Layouts.INT_RANGE.getEnd(range));
final int exclusiveEnd = ArrayOperations.clampExclusiveIndex(values.length, Layouts.INT_RANGE.getExcludedEnd(range) ? end : end + 1);
final int length = exclusiveEnd - normalizedIndex;

final Object[] store = Arrays.copyOfRange(values, normalizedIndex, normalizedIndex + length);
Original file line number Diff line number Diff line change
@@ -493,15 +493,15 @@ public Object getIndex(VirtualFrame frame, DynamicObject string, Object index, O
return getIndex(frame, string, getToIntNode().doInt(frame, index), length);
}

@Specialization(guards = {"isIntegerFixnumRange(range)", "wasNotProvided(length) || isRubiniusUndefined(length)"})
@Specialization(guards = { "isIntRange(range)", "wasNotProvided(length) || isRubiniusUndefined(length)" })
public Object sliceIntegerRange(VirtualFrame frame, DynamicObject string, DynamicObject range, Object length) {
return sliceRange(frame, string, Layouts.INTEGER_FIXNUM_RANGE.getBegin(range), Layouts.INTEGER_FIXNUM_RANGE.getEnd(range), Layouts.INTEGER_FIXNUM_RANGE.getExcludedEnd(range));
return sliceRange(frame, string, Layouts.INT_RANGE.getBegin(range), Layouts.INT_RANGE.getEnd(range), Layouts.INT_RANGE.getExcludedEnd(range));
}

@Specialization(guards = {"isLongFixnumRange(range)", "wasNotProvided(length) || isRubiniusUndefined(length)"})
@Specialization(guards = { "isLongRange(range)", "wasNotProvided(length) || isRubiniusUndefined(length)" })
public Object sliceLongRange(VirtualFrame frame, DynamicObject string, DynamicObject range, Object length) {
// TODO (nirvdrum 31-Mar-15) The begin and end values should be properly lowered, only if possible.
return sliceRange(frame, string, (int) Layouts.LONG_FIXNUM_RANGE.getBegin(range), (int) Layouts.LONG_FIXNUM_RANGE.getEnd(range), Layouts.LONG_FIXNUM_RANGE.getExcludedEnd(range));
return sliceRange(frame, string, (int) Layouts.LONG_RANGE.getBegin(range), (int) Layouts.LONG_RANGE.getEnd(range), Layouts.LONG_RANGE.getExcludedEnd(range));
}

@Specialization(guards = {"isObjectRange(range)", "wasNotProvided(length) || isRubiniusUndefined(length)"})
18 changes: 9 additions & 9 deletions truffle/src/main/java/org/jruby/truffle/language/RubyGuards.java
Original file line number Diff line number Diff line change
@@ -69,20 +69,20 @@ public static boolean isRubyBigDecimal(DynamicObject value) {
return Layouts.BIG_DECIMAL.isBigDecimal(value);
}

public static boolean isIntegerFixnumRange(Object object) {
return Layouts.INTEGER_FIXNUM_RANGE.isIntegerFixnumRange(object);
public static boolean isIntRange(Object object) {
return Layouts.INT_RANGE.isIntRange(object);
}

public static boolean isIntegerFixnumRange(DynamicObject object) {
return Layouts.INTEGER_FIXNUM_RANGE.isIntegerFixnumRange(object);
public static boolean isIntRange(DynamicObject object) {
return Layouts.INT_RANGE.isIntRange(object);
}

public static boolean isLongFixnumRange(Object object) {
return Layouts.LONG_FIXNUM_RANGE.isLongFixnumRange(object);
public static boolean isLongRange(Object object) {
return Layouts.LONG_RANGE.isLongRange(object);
}

public static boolean isLongFixnumRange(DynamicObject object) {
return Layouts.LONG_FIXNUM_RANGE.isLongFixnumRange(object);
public static boolean isLongRange(DynamicObject object) {
return Layouts.LONG_RANGE.isLongRange(object);
}

public static boolean isObjectRange(Object object) {
@@ -94,7 +94,7 @@ public static boolean isObjectRange(DynamicObject object) {
}

public static boolean isRubyRange(Object value) {
return isIntegerFixnumRange(value) || isLongFixnumRange(value) || isObjectRange(value);
return isIntRange(value) || isLongRange(value) || isObjectRange(value);
}

public static boolean isRubyArray(Object value) {

0 comments on commit 48df4dc

Please sign in to comment.