Skip to content

Commit bc8f1ed

Browse files
committed
Refactor range class hierarchy.
1 parent 086cb17 commit bc8f1ed

File tree

9 files changed

+80
-57
lines changed

9 files changed

+80
-57
lines changed

src/main/java/org/truffleruby/RubyLanguage.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@
6666
import org.truffleruby.core.proc.RubyProc;
6767
import org.truffleruby.core.queue.RubyQueue;
6868
import org.truffleruby.core.queue.RubySizedQueue;
69-
import org.truffleruby.core.range.RubyIntRange;
70-
import org.truffleruby.core.range.RubyLongRange;
7169
import org.truffleruby.core.range.RubyObjectRange;
7270
import org.truffleruby.core.regexp.RegexpCacheKey;
7371
import org.truffleruby.core.regexp.RegexpTable;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
import org.truffleruby.core.range.RangeNodes.NormalizedStartLengthNode;
6262
import org.truffleruby.core.range.RubyIntRange;
6363
import org.truffleruby.core.range.RubyLongRange;
64-
import org.truffleruby.core.range.RubyRange;
64+
import org.truffleruby.core.range.RubyObjectRange;
6565
import org.truffleruby.core.rope.Rope;
6666
import org.truffleruby.core.rope.RopeNodes;
6767
import org.truffleruby.core.rope.RopeOperations;
@@ -279,7 +279,7 @@ protected Object index(RubyArray array, int index, NotProvided length,
279279
}
280280

281281
@Specialization
282-
protected Object indexRange(RubyArray array, RubyRange range, NotProvided length,
282+
protected Object indexRange(RubyArray array, RubyObjectRange range, NotProvided length,
283283
@Cached NormalizedStartLengthNode startLengthNode,
284284
@Cached ReadSliceNormalizedNode readSlice) {
285285
final int[] startLength = startLengthNode.execute(range, array.size);
@@ -381,7 +381,7 @@ protected Object set(RubyArray array, int index, Object value, NotProvided unuse
381381
}
382382

383383
@Specialization
384-
protected Object setRange(RubyArray array, RubyRange range, Object value, NotProvided unused,
384+
protected Object setRange(RubyArray array, RubyObjectRange range, Object value, NotProvided unused,
385385
@Cached NormalizedStartLengthNode normalizedStartLength,
386386
@Cached BranchProfile negativeStart) {
387387
final int[] startLength = normalizedStartLength.execute(range, array.size);

src/main/java/org/truffleruby/core/range/RangeNodes.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ protected RubyArray map(RubyIntRange range, RubyProc block,
8585
}
8686

8787
@Specialization(guards = "!isIntRange(range)")
88-
protected Object mapFallback(RubyRange range, Object block) {
88+
protected Object mapFallback(RubyObjectRange range, Object block) {
8989
return FAILURE;
9090
}
9191
}
@@ -156,7 +156,7 @@ protected Object eachObject(RubyObjectRange range, RubyProc block) {
156156
public abstract static class ExcludeEndNode extends CoreMethodArrayArgumentsNode {
157157

158158
@Specialization
159-
protected boolean excludeEnd(RubyRange range) {
159+
protected boolean excludeEnd(RubyObjectRange range) {
160160
return range.excludedEnd;
161161
}
162162

src/main/java/org/truffleruby/core/range/RubyIntRange.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,18 @@
99
*/
1010
package org.truffleruby.core.range;
1111

12+
import com.oracle.truffle.api.dsl.Cached;
13+
import com.oracle.truffle.api.dsl.Cached.Exclusive;
14+
import com.oracle.truffle.api.interop.InteropLibrary;
15+
import com.oracle.truffle.api.library.CachedLibrary;
16+
import com.oracle.truffle.api.library.ExportLibrary;
17+
import com.oracle.truffle.api.library.ExportMessage;
18+
19+
import org.truffleruby.RubyContext;
1220
import org.truffleruby.language.ImmutableRubyObject;
21+
import org.truffleruby.language.dispatch.DispatchNode;
1322

23+
@ExportLibrary(InteropLibrary.class)
1424
public final class RubyIntRange extends ImmutableRubyObject {
1525

1626
public final int begin;
@@ -24,4 +34,17 @@ public RubyIntRange(boolean excludedEnd, int begin, int end) {
2434

2535
}
2636

37+
@ExportMessage
38+
public boolean hasIterator() {
39+
return true;
40+
}
41+
42+
@ExportMessage
43+
public Object getIterator(
44+
@CachedLibrary("this") InteropLibrary node,
45+
@Exclusive @Cached DispatchNode dispatchNode) {
46+
final RubyContext context = RubyContext.get(node);
47+
return dispatchNode.call(context.getCoreLibrary().truffleInteropOperationsModule, "get_iterator", this);
48+
}
49+
2750
}

src/main/java/org/truffleruby/core/range/RubyLongRange.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,18 @@
99
*/
1010
package org.truffleruby.core.range;
1111

12+
import com.oracle.truffle.api.dsl.Cached;
13+
import com.oracle.truffle.api.dsl.Cached.Exclusive;
14+
import com.oracle.truffle.api.interop.InteropLibrary;
15+
import com.oracle.truffle.api.library.CachedLibrary;
16+
import com.oracle.truffle.api.library.ExportLibrary;
17+
import com.oracle.truffle.api.library.ExportMessage;
18+
19+
import org.truffleruby.RubyContext;
1220
import org.truffleruby.language.ImmutableRubyObject;
21+
import org.truffleruby.language.dispatch.DispatchNode;
1322

23+
@ExportLibrary(InteropLibrary.class)
1424
public final class RubyLongRange extends ImmutableRubyObject {
1525

1626
public final long begin;
@@ -23,4 +33,17 @@ public RubyLongRange(boolean excludedEnd, long begin, long end) {
2333
this.end = end;
2434
}
2535

36+
@ExportMessage
37+
public boolean hasIterator() {
38+
return true;
39+
}
40+
41+
@ExportMessage
42+
public Object getIterator(
43+
@CachedLibrary("this") InteropLibrary node,
44+
@Exclusive @Cached DispatchNode dispatchNode) {
45+
final RubyContext context = RubyContext.get(node);
46+
return dispatchNode.call(context.getCoreLibrary().truffleInteropOperationsModule, "get_iterator", this);
47+
}
48+
2649
}

src/main/java/org/truffleruby/core/range/RubyObjectRange.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,23 @@
99
*/
1010
package org.truffleruby.core.range;
1111

12-
import org.truffleruby.core.klass.RubyClass;
13-
import org.truffleruby.language.Nil;
12+
import java.util.Set;
1413

14+
import com.oracle.truffle.api.library.ExportLibrary;
15+
import com.oracle.truffle.api.library.ExportMessage;
1516
import com.oracle.truffle.api.object.Shape;
17+
import org.truffleruby.core.klass.RubyClass;
18+
import org.truffleruby.language.Nil;
19+
import org.truffleruby.language.RubyDynamicObject;
20+
import org.truffleruby.language.library.RubyLibrary;
1621
import org.truffleruby.language.objects.ObjectGraph;
1722
import org.truffleruby.language.objects.ObjectGraphNode;
1823

19-
import java.util.Set;
20-
21-
public final class RubyObjectRange extends RubyRange implements ObjectGraphNode {
24+
@ExportLibrary(RubyLibrary.class)
25+
public final class RubyObjectRange extends RubyDynamicObject implements ObjectGraphNode {
2226

27+
public boolean excludedEnd;
28+
public boolean frozen;
2329
public Object begin;
2430
public Object end;
2531

@@ -30,9 +36,21 @@ public RubyObjectRange(
3036
Object begin,
3137
Object end,
3238
boolean frozen) {
33-
super(rubyClass, shape, excludedEnd, frozen);
39+
super(rubyClass, shape);
40+
this.excludedEnd = excludedEnd;
3441
this.begin = begin;
3542
this.end = end;
43+
this.frozen = frozen;
44+
}
45+
46+
@ExportMessage
47+
protected void freeze() {
48+
frozen = true;
49+
}
50+
51+
@ExportMessage
52+
protected boolean isFrozen() {
53+
return frozen;
3654
}
3755

3856
public boolean isBoundless() {

src/main/java/org/truffleruby/core/range/RubyRange.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/main/java/org/truffleruby/language/RubyDynamicObject.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.truffleruby.core.cast.ToLongNode;
2222
import org.truffleruby.core.kernel.KernelNodes;
2323
import org.truffleruby.core.klass.RubyClass;
24-
import org.truffleruby.core.range.RubyRange;
24+
import org.truffleruby.core.range.RubyObjectRange;
2525
import org.truffleruby.core.string.RubyString;
2626
import org.truffleruby.core.string.StringUtils;
2727
import org.truffleruby.interop.ForeignToRubyArgumentsNode;
@@ -119,7 +119,7 @@ public boolean isFrozen(
119119

120120
public boolean isFrozenUncached() {
121121
CompilerAsserts.neverPartOfCompilation("Use RubyLibrary instead in PE code");
122-
assert !(this instanceof RubyString) && !(this instanceof RubyRange);
122+
assert !(this instanceof RubyString) && !(this instanceof RubyObjectRange);
123123
return (getShape().getFlags() & FROZEN) != 0;
124124
}
125125
// endregion

src/main/java/org/truffleruby/language/RubyGuards.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.truffleruby.core.proc.RubyProc;
2323
import org.truffleruby.core.range.RubyIntRange;
2424
import org.truffleruby.core.range.RubyLongRange;
25-
import org.truffleruby.core.range.RubyRange;
25+
import org.truffleruby.core.range.RubyObjectRange;
2626
import org.truffleruby.core.regexp.RubyMatchData;
2727
import org.truffleruby.core.regexp.RubyRegexp;
2828
import org.truffleruby.core.string.ImmutableRubyString;
@@ -104,7 +104,8 @@ public static boolean isIntRange(Object value) {
104104
}
105105

106106
public static boolean isRubyRange(Object value) {
107-
return value instanceof RubyRange || value instanceof RubyIntRange || value instanceof RubyLongRange;
107+
return value instanceof RubyObjectRange || value instanceof RubyIntRange ||
108+
value instanceof RubyLongRange;
108109
}
109110

110111
public static boolean isRubyArray(Object value) {

0 commit comments

Comments
 (0)