From f3f8c689a8f370f6ce187242c1c13dd7fa57452e Mon Sep 17 00:00:00 2001 From: gnembon Date: Thu, 7 Jan 2021 00:40:39 -0400 Subject: [PATCH] fixing incorrect default upper bound for `slice`. Fixes #657 --- src/main/java/carpet/script/language/DataStructures.java | 2 +- src/main/java/carpet/script/value/FunctionValue.java | 2 +- src/main/java/carpet/script/value/LazyListValue.java | 4 ++-- src/main/java/carpet/script/value/ListValue.java | 4 +++- src/main/java/carpet/script/value/MapValue.java | 2 +- src/main/java/carpet/script/value/Value.java | 3 ++- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/carpet/script/language/DataStructures.java b/src/main/java/carpet/script/language/DataStructures.java index 10c21c94..95b18749 100644 --- a/src/main/java/carpet/script/language/DataStructures.java +++ b/src/main/java/carpet/script/language/DataStructures.java @@ -87,7 +87,7 @@ public class DataStructures { throw new InternalExpressionException("'slice' takes 2 or 3 arguments"); Value hwat = lv.get(0); long from = NumericValue.asNumber(lv.get(1)).getLong(); - long to = -1; + Long to = null; if (lv.size()== 3) to = NumericValue.asNumber(lv.get(2)).getLong(); return hwat.slice(from, to); diff --git a/src/main/java/carpet/script/value/FunctionValue.java b/src/main/java/carpet/script/value/FunctionValue.java index c9370369..6517dd66 100644 --- a/src/main/java/carpet/script/value/FunctionValue.java +++ b/src/main/java/carpet/script/value/FunctionValue.java @@ -133,7 +133,7 @@ public class FunctionValue extends Value implements Fluff.ILazyFunction } @Override - public Value slice(long from, long to) + public Value slice(long from, Long to) { throw new InternalExpressionException("Cannot slice a function"); } diff --git a/src/main/java/carpet/script/value/LazyListValue.java b/src/main/java/carpet/script/value/LazyListValue.java index 5c68a75a..5584e628 100644 --- a/src/main/java/carpet/script/value/LazyListValue.java +++ b/src/main/java/carpet/script/value/LazyListValue.java @@ -129,9 +129,9 @@ public abstract class LazyListValue extends AbstractListValue implements Iterato } @Override - public Value slice(long from, long to) + public Value slice(long from, Long to) { - if (to < 0) to = Integer.MAX_VALUE; + if (to == null || to < 0) to = (long) Integer.MAX_VALUE; if (from < 0) from = 0; if (from > to) return ListValue.of(); diff --git a/src/main/java/carpet/script/value/ListValue.java b/src/main/java/carpet/script/value/ListValue.java index f6a3d8eb..a036af56 100644 --- a/src/main/java/carpet/script/value/ListValue.java +++ b/src/main/java/carpet/script/value/ListValue.java @@ -334,11 +334,13 @@ public class ListValue extends AbstractListValue implements ContainerValueInterf } @Override - public Value slice(long fromDesc, long toDesc) + public Value slice(long fromDesc, Long toDesc) { List items = getItems(); int size = items.size(); int from = normalizeIndex(fromDesc, size); + if (toDesc == null) + return new ListValue((Collection) getItems().subList(from, size)); int to = normalizeIndex(toDesc, size); if (from > to) return ListValue.of(); diff --git a/src/main/java/carpet/script/value/MapValue.java b/src/main/java/carpet/script/value/MapValue.java index 2cb3da44..abefe087 100644 --- a/src/main/java/carpet/script/value/MapValue.java +++ b/src/main/java/carpet/script/value/MapValue.java @@ -198,7 +198,7 @@ public class MapValue extends AbstractListValue implements ContainerValueInterfa } @Override - public Value slice(long from, long to) + public Value slice(long from, Long to) { throw new InternalExpressionException("Cannot slice a map value"); } diff --git a/src/main/java/carpet/script/value/Value.java b/src/main/java/carpet/script/value/Value.java index aea956a6..8f79f462 100644 --- a/src/main/java/carpet/script/value/Value.java +++ b/src/main/java/carpet/script/value/Value.java @@ -178,11 +178,12 @@ public abstract class Value implements Comparable, Cloneable return getString().length(); } - public Value slice(long fromDesc, long toDesc) + public Value slice(long fromDesc, Long toDesc) { String value = this.getString(); int size = value.length(); int from = ListValue.normalizeIndex(fromDesc, size); + if (toDesc == null) return new StringValue(value.substring(from)); int to = ListValue.normalizeIndex(toDesc, size); if (from > to) return StringValue.EMPTY; return new StringValue(value.substring(from, to));