starlark: more validity checks
...in Starlark.call and StarlarkList.{of,copyOf,immutableCopyOf}.
Benchmarks showed no significant cost.
Several tests that passed Integer needed fixing.
PiperOrigin-RevId: 341727596
diff --git a/src/main/java/net/starlark/java/eval/Starlark.java b/src/main/java/net/starlark/java/eval/Starlark.java
index 3a96b4f..086be09 100644
--- a/src/main/java/net/starlark/java/eval/Starlark.java
+++ b/src/main/java/net/starlark/java/eval/Starlark.java
@@ -568,7 +568,7 @@
int i = 0;
for (Map.Entry<String, Object> e : kwargs.entrySet()) {
named[i++] = e.getKey();
- named[i++] = e.getValue();
+ named[i++] = Starlark.checkValid(e.getValue());
}
return fastcall(thread, fn, args.toArray(), named);
}
diff --git a/src/main/java/net/starlark/java/eval/StarlarkList.java b/src/main/java/net/starlark/java/eval/StarlarkList.java
index c11bfcc..9383d3a 100644
--- a/src/main/java/net/starlark/java/eval/StarlarkList.java
+++ b/src/main/java/net/starlark/java/eval/StarlarkList.java
@@ -158,7 +158,15 @@
return list;
}
- return wrap(mutability, Iterables.toArray(elems, Object.class));
+ Object[] array = Iterables.toArray(elems, Object.class);
+ checkElemsValid(array);
+ return wrap(mutability, array);
+ }
+
+ private static void checkElemsValid(Object[] elems) {
+ for (Object elem : elems) {
+ Starlark.checkValid(elem);
+ }
}
/**
@@ -173,11 +181,13 @@
* mutability} is null, the list is immutable.
*/
public static <T> StarlarkList<T> of(@Nullable Mutability mutability, T... elems) {
+ checkElemsValid(elems);
return wrap(mutability, Arrays.copyOf(elems, elems.length));
}
/** Returns an immutable {@code StarlarkList} with the given items. */
public static <T> StarlarkList<T> immutableOf(T... elems) {
+ checkElemsValid(elems);
return wrap(null, Arrays.copyOf(elems, elems.length));
}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java b/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
index b6632de..215e616 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/StarlarkProviderTest.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.cmdline.Label;
import net.starlark.java.eval.Mutability;
import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
import net.starlark.java.eval.StarlarkSemantics;
import net.starlark.java.eval.StarlarkThread;
import org.junit.Test;
@@ -140,7 +141,8 @@
thread,
provider,
/*args=*/ ImmutableList.of(),
- /*kwargs=*/ ImmutableMap.of("a", 1, "b", 2, "c", 3));
+ /*kwargs=*/ ImmutableMap.of(
+ "a", StarlarkInt.of(1), "b", StarlarkInt.of(2), "c", StarlarkInt.of(3)));
assertThat(result).isInstanceOf(StarlarkInfo.class);
return (StarlarkInfo) result;
}
@@ -149,8 +151,8 @@
/** Asserts that a {@link StarlarkInfo} has fields a=1, b=2, c=3 (and nothing else). */
private static void assertHasExactlyValuesA1B2C3(StarlarkInfo info) throws Exception {
assertThat(info.getFieldNames()).containsExactly("a", "b", "c");
- assertThat(info.getValue("a")).isEqualTo(1);
- assertThat(info.getValue("b")).isEqualTo(2);
- assertThat(info.getValue("c")).isEqualTo(3);
+ assertThat(info.getValue("a")).isEqualTo(StarlarkInt.of(1));
+ assertThat(info.getValue("b")).isEqualTo(StarlarkInt.of(2));
+ assertThat(info.getValue("c")).isEqualTo(StarlarkInt.of(3));
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
index 95a81a7..8f32c63 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
@@ -375,7 +375,11 @@
.addScope(
Scope.newBuilder()
.setName("global")
- .addBinding(getValueProto("x", StarlarkList.of(/*mutability=*/ null, 1, 2, 3))))
+ .addBinding(
+ getValueProto(
+ "x",
+ StarlarkList.immutableOf(
+ StarlarkInt.of(1), StarlarkInt.of(2), StarlarkInt.of(3)))))
.build());
}
@@ -398,7 +402,10 @@
Value xValue = frames.getFrame(0).getScope(0).getBinding(0);
assertValuesEqualIgnoringId(
- xValue, getValueProto("x", StarlarkList.of(/*mutability=*/ null, 1, 2, 3)));
+ xValue,
+ getValueProto(
+ "x",
+ StarlarkList.immutableOf(StarlarkInt.of(1), StarlarkInt.of(2), StarlarkInt.of(3))));
List<Value> children = getChildren(xValue);
@@ -563,7 +570,11 @@
ListFramesResponse frames = listFrames(threadId);
assertThat(frames.getFrame(0).getScope(0).getBindingList())
- .contains(getValueProto("x", StarlarkList.of(/*mutability=*/ null, 1, 2, 3, 4)));
+ .contains(
+ getValueProto(
+ "x",
+ StarlarkList.immutableOf(
+ StarlarkInt.of(1), StarlarkInt.of(2), StarlarkInt.of(3), StarlarkInt.of(4))));
}
@Test
diff --git a/src/test/java/net/starlark/java/eval/PrinterTest.java b/src/test/java/net/starlark/java/eval/PrinterTest.java
index e5accf4..92957a6 100644
--- a/src/test/java/net/starlark/java/eval/PrinterTest.java
+++ b/src/test/java/net/starlark/java/eval/PrinterTest.java
@@ -45,22 +45,25 @@
assertThat(Starlark.repr("'")).isEqualTo("\"'\"");
assertThat(Starlark.str("\"")).isEqualTo("\"");
assertThat(Starlark.repr("\"")).isEqualTo("\"\\\"\"");
- assertThat(Starlark.str(3)).isEqualTo("3");
- assertThat(Starlark.repr(3)).isEqualTo("3");
+ assertThat(Starlark.str(StarlarkInt.of(3))).isEqualTo("3");
+ assertThat(Starlark.repr(StarlarkInt.of(3))).isEqualTo("3");
assertThat(Starlark.repr(Starlark.NONE)).isEqualTo("None");
List<?> list = StarlarkList.of(null, "foo", "bar");
List<?> tuple = Tuple.of("foo", "bar");
- assertThat(Starlark.str(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
- assertThat(Starlark.repr(Tuple.of(1, list, 3))).isEqualTo("(1, [\"foo\", \"bar\"], 3)");
- assertThat(Starlark.str(StarlarkList.of(null, 1, tuple, 3)))
+ assertThat(Starlark.str(Tuple.of(StarlarkInt.of(1), list, StarlarkInt.of(3))))
+ .isEqualTo("(1, [\"foo\", \"bar\"], 3)");
+ assertThat(Starlark.repr(Tuple.of(StarlarkInt.of(1), list, StarlarkInt.of(3))))
+ .isEqualTo("(1, [\"foo\", \"bar\"], 3)");
+ assertThat(Starlark.str(StarlarkList.of(null, StarlarkInt.of(1), tuple, StarlarkInt.of(3))))
.isEqualTo("[1, (\"foo\", \"bar\"), 3]");
- assertThat(Starlark.repr(StarlarkList.of(null, 1, tuple, 3)))
+ assertThat(Starlark.repr(StarlarkList.of(null, StarlarkInt.of(1), tuple, StarlarkInt.of(3))))
.isEqualTo("[1, (\"foo\", \"bar\"), 3]");
Map<Object, Object> dict =
- ImmutableMap.<Object, Object>of(1, tuple, 2, list, "foo", StarlarkList.of(null));
+ ImmutableMap.<Object, Object>of(
+ StarlarkInt.of(1), tuple, StarlarkInt.of(2), list, "foo", StarlarkList.of(null));
assertThat(Starlark.str(dict))
.isEqualTo("{1: (\"foo\", \"bar\"), 2: [\"foo\", \"bar\"], \"foo\": []}");
assertThat(Starlark.repr(dict))
@@ -76,11 +79,12 @@
@Test
public void testOutputOrderOfMap() throws Exception {
Map<Object, Object> map = new LinkedHashMap<>();
- map.put(5, 5);
- map.put(3, 3);
- map.put("foo", 42);
- map.put(7, "bar");
- assertThat(Starlark.str(map)).isEqualTo("{5: 5, 3: 3, \"foo\": 42, 7: \"bar\"}");
+ map.put(StarlarkInt.of(5), StarlarkInt.of(5));
+ map.put(StarlarkInt.of(3), StarlarkInt.of(3));
+ map.put("foo", StarlarkInt.of(42));
+ map.put(StarlarkInt.of(7), "bar");
+ assertThat(Starlark.str(Starlark.fromJava(map, null)))
+ .isEqualTo("{5: 5, 3: 3, \"foo\": 42, 7: \"bar\"}");
}
@Test
diff --git a/src/test/java/net/starlark/java/eval/StarlarkMutableTest.java b/src/test/java/net/starlark/java/eval/StarlarkMutableTest.java
index 6e8e9bf..e7cc32c 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkMutableTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkMutableTest.java
@@ -33,7 +33,9 @@
@Test
public void testListViewsCheckMutability() throws Exception {
Mutability mutability = Mutability.create("test");
- StarlarkList<Object> list = StarlarkList.copyOf(mutability, ImmutableList.of(1, 2, 3));
+ StarlarkList<Object> list =
+ StarlarkList.copyOf(
+ mutability, ImmutableList.of(StarlarkInt.of(1), StarlarkInt.of(2), StarlarkInt.of(3)));
mutability.freeze();
{