Skip to content

Commit 1be054e

Browse files
authored
Merge pull request #70 from DanexCodr/copilot/move-range-files-to-unit-internal
Replace Java RangeSpec/MultiRangeSpec with internal.range runtime objects
2 parents dffa76d + b656a3e commit 1be054e

16 files changed

Lines changed: 297 additions & 154 deletions

source_.jar

388 Bytes
Binary file not shown.
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
unit test
22

3-
use {internal.RangeSpec}
3+
use {internal.range.RangeSpec}
44

55
share InternalRangeSpecImport {
66
share main() {
7-
out(internal.RangeSpec.format(1, 1, 5))
8-
out(internal.RangeSpec.format(2, 1, 9))
7+
out("internal.range.RangeSpec import ok")
98
}
109
}

src/main/cod/internal/MultiRangeSpec.cod renamed to src/main/cod/internal/range/MultiRangeSpec.cod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
unit internal
1+
unit internal.range
22

33
share MultiRangeSpec {
44
rangesText: text = ""
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
unit internal
1+
unit internal.range
22

33
share RangeSpec {
44
step: int = 1

src/main/java/cod/interpreter/InterpreterVisitor.java

Lines changed: 66 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ private static class LinearRecurrencePattern {
102102
private final Stack<ExecutionContext> contextStack = new Stack<ExecutionContext>();
103103
private final ExpressionHandler expressionHandler;
104104
private final AssignmentHandler assignmentHandler;
105+
// Lazily resolved internal.range type references used for runtime range index objects.
106+
private Type internalRangeSpecType;
107+
private Type internalMultiRangeSpecType;
105108

106109
private final LiteralRegistry literalRegistry;
107110

@@ -434,6 +437,42 @@ private Range getRangeFromArray(NaturalArray arr) {
434437
}
435438
}
436439

440+
private Type resolveInternalRangeSpecType() {
441+
if (internalRangeSpecType != null) {
442+
return internalRangeSpecType;
443+
}
444+
try {
445+
Type type = interpreter.getImportResolver().resolveImport("internal.range.RangeSpec");
446+
if (type == null) {
447+
throw new ProgramError("Unable to load internal.range.RangeSpec");
448+
}
449+
internalRangeSpecType = type;
450+
return type;
451+
} catch (ProgramError e) {
452+
throw e;
453+
} catch (Exception e) {
454+
throw new InternalError("Failed loading internal.range.RangeSpec", e);
455+
}
456+
}
457+
458+
private Type resolveInternalMultiRangeSpecType() {
459+
if (internalMultiRangeSpecType != null) {
460+
return internalMultiRangeSpecType;
461+
}
462+
try {
463+
Type type = interpreter.getImportResolver().resolveImport("internal.range.MultiRangeSpec");
464+
if (type == null) {
465+
throw new ProgramError("Unable to load internal.range.MultiRangeSpec");
466+
}
467+
internalMultiRangeSpecType = type;
468+
return type;
469+
} catch (ProgramError e) {
470+
throw e;
471+
} catch (Exception e) {
472+
throw new InternalError("Failed loading internal.range.MultiRangeSpec", e);
473+
}
474+
}
475+
437476
private boolean isVariableDeclaredInAnyScope(ExecutionContext ctx, String name) {
438477
if (ctx == null || name == null) return false;
439478
List<Map<String, Object>> localsStack = ctx.getLocalsStack();
@@ -2384,15 +2423,15 @@ public Object visit(IndexAccess node) {
23842423
return applyTupleIndices(arrayObj, (List<?>) indexObj);
23852424
}
23862425

2387-
if (indexObj instanceof RangeSpec) {
2426+
if (RangeObjects.isRangeSpec(indexObj)) {
23882427
if (arrayObj instanceof String) {
2389-
return applyStringRangeIndex((String) arrayObj, (RangeSpec) indexObj);
2428+
return applyStringRangeIndex((String) arrayObj, indexObj);
23902429
}
2391-
return applyRangeIndex(arrayObj, (RangeSpec) indexObj);
2430+
return applyRangeIndex(arrayObj, indexObj);
23922431
}
23932432

2394-
if (indexObj instanceof MultiRangeSpec) {
2395-
return applyMultiRangeIndex(arrayObj, (MultiRangeSpec) indexObj);
2433+
if (RangeObjects.isMultiRangeSpec(indexObj)) {
2434+
return applyMultiRangeIndex(arrayObj, indexObj);
23962435
}
23972436

23982437
if (arrayObj instanceof String) {
@@ -2456,7 +2495,7 @@ public Object visit(RangeIndex node) {
24562495
Object start = dispatch(node.start);
24572496
Object end = dispatch(node.end);
24582497

2459-
return new RangeSpec(step, start, end);
2498+
return RangeObjects.createRangeSpec(resolveInternalRangeSpecType(), step, start, end);
24602499
} catch (ProgramError e) {
24612500
throw e;
24622501
} catch (Exception e) {
@@ -2471,11 +2510,15 @@ public Object visit(MultiRangeIndex node) {
24712510
}
24722511

24732512
try {
2474-
List<RangeSpec> ranges = new ArrayList<RangeSpec>();
2513+
List<Object> ranges = new ArrayList<Object>();
24752514
for (RangeIndex rangeNode : node.ranges) {
2476-
ranges.add((RangeSpec) visit(rangeNode));
2515+
Object range = visit(rangeNode);
2516+
if (!RangeObjects.isRangeSpec(range)) {
2517+
throw new InternalError("Multi-range index contains non-range value");
2518+
}
2519+
ranges.add(range);
24772520
}
2478-
return new MultiRangeSpec(ranges);
2521+
return RangeObjects.createMultiRangeSpec(resolveInternalMultiRangeSpecType(), ranges);
24792522
} catch (ProgramError e) {
24802523
throw e;
24812524
} catch (Exception e) {
@@ -3078,7 +3121,7 @@ private Object handleSuperMethodCall(MethodCall node) {
30783121
}
30793122

30803123
@SuppressWarnings("unchecked")
3081-
private Object applyRangeIndex(Object array, RangeSpec range) {
3124+
private Object applyRangeIndex(Object array, Object range) {
30823125
if (array instanceof NaturalArray) {
30833126
NaturalArray natural = (NaturalArray) array;
30843127
return natural.getRange(range);
@@ -3091,7 +3134,7 @@ private Object applyRangeIndex(Object array, RangeSpec range) {
30913134
}
30923135

30933136
@SuppressWarnings("unchecked")
3094-
private Object applyMultiRangeIndex(Object array, MultiRangeSpec multiRange) {
3137+
private Object applyMultiRangeIndex(Object array, Object multiRange) {
30953138
if (array instanceof NaturalArray) {
30963139
NaturalArray natural = (NaturalArray) array;
30973140
return natural.getMultiRange(multiRange);
@@ -3108,12 +3151,12 @@ private Object applyTupleIndices(Object array, List<?> indices) {
31083151
Object current = array;
31093152
for (Object rawIndex : indices) {
31103153
Object indexObj = typeSystem.unwrap(rawIndex);
3111-
if (indexObj instanceof RangeSpec) {
3112-
current = applyRangeIndex(current, (RangeSpec) indexObj);
3154+
if (RangeObjects.isRangeSpec(indexObj)) {
3155+
current = applyRangeIndex(current, indexObj);
31133156
continue;
31143157
}
3115-
if (indexObj instanceof MultiRangeSpec) {
3116-
current = applyMultiRangeIndex(current, (MultiRangeSpec) indexObj);
3158+
if (RangeObjects.isMultiRangeSpec(indexObj)) {
3159+
current = applyMultiRangeIndex(current, indexObj);
31173160
continue;
31183161
}
31193162
if (current instanceof NaturalArray) {
@@ -3137,14 +3180,14 @@ private Object applyTupleIndices(Object array, List<?> indices) {
31373180
return current;
31383181
}
31393182

3140-
private List<Object> getListRange(List<Object> list, RangeSpec range) {
3183+
private List<Object> getListRange(List<Object> list, Object range) {
31413184
try {
31423185
long start, end;
31433186

3144-
start = expressionHandler.toLongIndex(range.start);
3187+
start = expressionHandler.toLongIndex(RangeObjects.getStart(range));
31453188
if (start < 0) start = list.size() + start;
31463189

3147-
end = expressionHandler.toLongIndex(range.end);
3190+
end = expressionHandler.toLongIndex(RangeObjects.getEnd(range));
31483191
if (end < 0) end = list.size() + end;
31493192

31503193
long step = expressionHandler.calculateStep(range);
@@ -3169,10 +3212,10 @@ private List<Object> getListRange(List<Object> list, RangeSpec range) {
31693212
}
31703213
}
31713214

3172-
private List<Object> getListMultiRange(List<Object> list, MultiRangeSpec multiRange) {
3215+
private List<Object> getListMultiRange(List<Object> list, Object multiRange) {
31733216
try {
31743217
List<Object> result = new ArrayList<Object>();
3175-
for (RangeSpec range : multiRange.ranges) {
3218+
for (Object range : RangeObjects.getRanges(multiRange)) {
31763219
result.addAll(getListRange(list, range));
31773220
}
31783221
return result;
@@ -3183,10 +3226,10 @@ private List<Object> getListMultiRange(List<Object> list, MultiRangeSpec multiRa
31833226
}
31843227
}
31853228

3186-
private String applyStringRangeIndex(String text, RangeSpec range) {
3229+
private String applyStringRangeIndex(String text, Object range) {
31873230
try {
3188-
long start = expressionHandler.toLongIndex(range.start);
3189-
long end = expressionHandler.toLongIndex(range.end);
3231+
long start = expressionHandler.toLongIndex(RangeObjects.getStart(range));
3232+
long end = expressionHandler.toLongIndex(RangeObjects.getEnd(range));
31903233
long step = expressionHandler.calculateStep(range);
31913234

31923235
int length = text.length();

src/main/java/cod/interpreter/handler/AssignmentHandler.java

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import cod.error.InternalError;
55
import cod.error.ProgramError;
66
import cod.range.NaturalArray;
7-
import cod.range.MultiRangeSpec;
8-
import cod.range.RangeSpec;
7+
import cod.range.RangeObjects;
98
import cod.interpreter.context.ExecutionContext;
109
import cod.interpreter.*;
1110
import cod.semantic.ConstructorResolver;
@@ -174,12 +173,12 @@ private Object handleIndexAssignment(IndexAccess indexAccess, Object newValue, E
174173
return assignTupleIndex(arrayObj, (List<?>) indexObj, newValue);
175174
}
176175

177-
if (indexObj instanceof RangeSpec) {
178-
return assignRange(arrayObj, (RangeSpec) indexObj, newValue);
176+
if (RangeObjects.isRangeSpec(indexObj)) {
177+
return assignRange(arrayObj, indexObj, newValue);
179178
}
180179

181-
if (indexObj instanceof MultiRangeSpec) {
182-
return assignMultiRange(arrayObj, (MultiRangeSpec) indexObj, newValue);
180+
if (RangeObjects.isMultiRangeSpec(indexObj)) {
181+
return assignMultiRange(arrayObj, indexObj, newValue);
183182
}
184183

185184
if (arrayObj instanceof NaturalArray) {
@@ -214,12 +213,12 @@ private Object assignTupleIndex(Object arrayObj, List<?> tupleIndices, Object ne
214213
Object current = arrayObj;
215214
for (int i = 0; i < tupleIndices.size() - 1; i++) {
216215
Object idxObj = typeSystem.unwrap(tupleIndices.get(i));
217-
if (idxObj instanceof RangeSpec) {
218-
current = extractRange(current, (RangeSpec) idxObj);
216+
if (RangeObjects.isRangeSpec(idxObj)) {
217+
current = extractRange(current, idxObj);
219218
continue;
220219
}
221-
if (idxObj instanceof MultiRangeSpec) {
222-
current = extractMultiRange(current, (MultiRangeSpec) idxObj);
220+
if (RangeObjects.isMultiRangeSpec(idxObj)) {
221+
current = extractMultiRange(current, idxObj);
223222
continue;
224223
}
225224
if (current instanceof NaturalArray) {
@@ -242,11 +241,11 @@ private Object assignTupleIndex(Object arrayObj, List<?> tupleIndices, Object ne
242241
}
243242

244243
Object lastIdxObj = typeSystem.unwrap(tupleIndices.get(tupleIndices.size() - 1));
245-
if (lastIdxObj instanceof RangeSpec) {
246-
return assignRange(current, (RangeSpec) lastIdxObj, newValue);
244+
if (RangeObjects.isRangeSpec(lastIdxObj)) {
245+
return assignRange(current, lastIdxObj, newValue);
247246
}
248-
if (lastIdxObj instanceof MultiRangeSpec) {
249-
return assignMultiRange(current, (MultiRangeSpec) lastIdxObj, newValue);
247+
if (RangeObjects.isMultiRangeSpec(lastIdxObj)) {
248+
return assignMultiRange(current, lastIdxObj, newValue);
250249
}
251250
if (current instanceof NaturalArray) {
252251
NaturalArray natural = (NaturalArray) current;
@@ -266,15 +265,15 @@ private Object assignTupleIndex(Object arrayObj, List<?> tupleIndices, Object ne
266265
}
267266

268267
@SuppressWarnings("unchecked")
269-
private Object extractRange(Object array, RangeSpec range) {
268+
private Object extractRange(Object array, Object range) {
270269
if (array instanceof NaturalArray) {
271270
return ((NaturalArray) array).getRange(range);
272271
}
273272
if (array instanceof List) {
274273
List<Object> list = (List<Object>) array;
275274
List<Object> result = new ArrayList<Object>();
276-
long start = expressionHandler.toLongIndex(range.start);
277-
long end = expressionHandler.toLongIndex(range.end);
275+
long start = expressionHandler.toLongIndex(RangeObjects.getStart(range));
276+
long end = expressionHandler.toLongIndex(RangeObjects.getEnd(range));
278277
long step = expressionHandler.calculateStep(range);
279278
start = normalizeListIndex(start, list.size());
280279
end = normalizeListIndex(end, list.size());
@@ -303,14 +302,14 @@ private Object extractRange(Object array, RangeSpec range) {
303302
}
304303

305304
@SuppressWarnings("unchecked")
306-
private Object extractMultiRange(Object array, MultiRangeSpec multiRange) {
305+
private Object extractMultiRange(Object array, Object multiRange) {
307306
if (array instanceof NaturalArray) {
308307
return ((NaturalArray) array).getMultiRange(multiRange);
309308
}
310309
if (array instanceof List) {
311310
List<Object> list = (List<Object>) array;
312311
List<Object> result = new ArrayList<Object>();
313-
for (RangeSpec range : multiRange.ranges) {
312+
for (Object range : RangeObjects.getRanges(multiRange)) {
314313
Object sub = extractRange(list, range);
315314
if (sub instanceof List) {
316315
result.addAll((List<Object>) sub);
@@ -507,7 +506,7 @@ private boolean isFieldDeclaredInTypeHierarchy(Type type, String fieldName, Exec
507506
// === Range/Multi-Range Assignment Methods ===
508507

509508
@SuppressWarnings("unchecked")
510-
private Object assignRange(Object array, RangeSpec range, Object value) {
509+
private Object assignRange(Object array, Object range, Object value) {
511510
try {
512511
if (array instanceof NaturalArray) {
513512
NaturalArray natural = (NaturalArray) array;
@@ -528,7 +527,7 @@ private Object assignRange(Object array, RangeSpec range, Object value) {
528527
}
529528

530529
@SuppressWarnings("unchecked")
531-
private Object assignMultiRange(Object array, MultiRangeSpec multiRange, Object value) {
530+
private Object assignMultiRange(Object array, Object multiRange, Object value) {
532531
try {
533532
if (array instanceof NaturalArray) {
534533
NaturalArray natural = (NaturalArray) array;
@@ -548,10 +547,10 @@ private Object assignMultiRange(Object array, MultiRangeSpec multiRange, Object
548547
}
549548
}
550549

551-
private void setListRange(List<Object> list, RangeSpec range, Object value) {
550+
private void setListRange(List<Object> list, Object range, Object value) {
552551
try {
553-
long start = expressionHandler.toLongIndex(range.start);
554-
long end = expressionHandler.toLongIndex(range.end);
552+
long start = expressionHandler.toLongIndex(RangeObjects.getStart(range));
553+
long end = expressionHandler.toLongIndex(RangeObjects.getEnd(range));
555554
long step = expressionHandler.calculateStep(range);
556555

557556
if (start < 0) start = list.size() + start;
@@ -575,9 +574,9 @@ private void setListRange(List<Object> list, RangeSpec range, Object value) {
575574
}
576575
}
577576

578-
private void setListMultiRange(List<Object> list, MultiRangeSpec multiRange, Object value) {
577+
private void setListMultiRange(List<Object> list, Object multiRange, Object value) {
579578
try {
580-
for (RangeSpec range : multiRange.ranges) {
579+
for (Object range : RangeObjects.getRanges(multiRange)) {
581580
setListRange(list, range, value);
582581
}
583582
} catch (ProgramError e) {

src/main/java/cod/interpreter/handler/ExpressionHandler.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
import cod.math.AutoStackingNumber;
77
import cod.interpreter.context.ExecutionContext;
88
import cod.interpreter.InterpreterVisitor;
9-
import cod.range.MultiRangeSpec;
109
import cod.range.NaturalArray;
11-
import cod.range.RangeSpec;
10+
import cod.range.RangeObjects;
1211

1312
import java.util.*;
1413

@@ -390,11 +389,11 @@ public long toLongIndex(Object indexObj) {
390389
return (long) d;
391390
}
392391

393-
if (indexObj instanceof RangeSpec) {
392+
if (RangeObjects.isRangeSpec(indexObj)) {
394393
throw new ProgramError("Cannot use range as index for single element access");
395394
}
396395

397-
if (indexObj instanceof MultiRangeSpec) {
396+
if (RangeObjects.isMultiRangeSpec(indexObj)) {
398397
throw new ProgramError("Cannot use multi-range as index for single element access");
399398
}
400399

@@ -444,17 +443,20 @@ public int toIntIndex(Object indexObj) {
444443
}
445444
}
446445

447-
public long calculateStep(RangeSpec range) {
446+
public long calculateStep(Object range) {
448447
if (range == null) {
449448
throw new InternalError("calculateStep called with null range");
450449
}
451450

452451
try {
453-
if (range.step != null) {
454-
return toLongIndex(range.step);
452+
Object step = RangeObjects.getStep(range);
453+
Object startObj = RangeObjects.getStart(range);
454+
Object endObj = RangeObjects.getEnd(range);
455+
if (step != null) {
456+
return toLongIndex(step);
455457
}
456-
long start = toLongIndex(range.start);
457-
long end = toLongIndex(range.end);
458+
long start = toLongIndex(startObj);
459+
long end = toLongIndex(endObj);
458460
if (start == end) return 1L;
459461
return (start < end) ? 1L : -1L;
460462
} catch (ProgramError e) {

0 commit comments

Comments
 (0)