@@ -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 ();
0 commit comments