diff --git a/convex-core/src/main/java/convex/core/data/Blob.java b/convex-core/src/main/java/convex/core/data/Blob.java index 1396f5c82..7b9d4e340 100644 --- a/convex-core/src/main/java/convex/core/data/Blob.java +++ b/convex-core/src/main/java/convex/core/data/Blob.java @@ -22,6 +22,9 @@ */ public class Blob extends AArrayBlob { public static final Blob EMPTY = wrap(Utils.EMPTY_BYTES); + public static final Blob ZERO = wrap(new byte[] {0}); + public static final Blob ONE = wrap(new byte[] {1});; + public static final Blob NULL_ENCODING = Blob.wrap(new byte[] {Tag.NULL}); public static final int CHUNK_LENGTH = 4096; diff --git a/convex-core/src/main/java/convex/core/data/prim/CVMBool.java b/convex-core/src/main/java/convex/core/data/prim/CVMBool.java index 2149a1508..bb9c94c21 100644 --- a/convex-core/src/main/java/convex/core/data/prim/CVMBool.java +++ b/convex-core/src/main/java/convex/core/data/prim/CVMBool.java @@ -2,6 +2,7 @@ import convex.core.data.ACell; import convex.core.data.AString; +import convex.core.data.Blob; import convex.core.data.BlobBuilder; import convex.core.data.Strings; import convex.core.data.Tag; @@ -109,4 +110,8 @@ public AString toCVMString(long limit) { return this==a; } + public Blob toBlob() { + return value?Blob.ONE:Blob.ZERO; + } + } diff --git a/convex-core/src/main/java/convex/core/lang/RT.java b/convex-core/src/main/java/convex/core/lang/RT.java index 8dbe62d1c..bc9e38ee6 100644 --- a/convex-core/src/main/java/convex/core/lang/RT.java +++ b/convex-core/src/main/java/convex/core/lang/RT.java @@ -1229,6 +1229,8 @@ public static ABlob castBlob(ACell a) { return ((AInteger)a).toBlob(); if (a instanceof AString) return Blobs.fromHex((AString)a); + if (a instanceof CVMBool) + return ((CVMBool)a).toBlob(); return null; } diff --git a/convex-core/src/test/java/convex/core/lang/CoreTest.java b/convex-core/src/test/java/convex/core/lang/CoreTest.java index ecea55f1f..3eb0780a3 100644 --- a/convex-core/src/test/java/convex/core/lang/CoreTest.java +++ b/convex-core/src/test/java/convex/core/lang/CoreTest.java @@ -141,6 +141,10 @@ public void testBlob() { // Address converts to regular Blob assertEquals(eval("0x0000000000000013"),eval("(blob #19)")); + + // Booleans become 0/1 bytes + assertEquals(eval("0x00"),eval("(blob false)")); + assertEquals(eval("0x01"),eval("(blob true)")); // Account key should be a Blob assertEquals(eval("*key*"),eval("(blob *key*)")); @@ -464,6 +468,8 @@ public void testChar() { public void testBoolean() { // test precise values assertSame(CVMBool.TRUE, eval("(boolean 1)")); + assertSame(CVMBool.TRUE, eval("(boolean 0)")); + assertSame(CVMBool.TRUE, eval("(boolean 0x00)")); assertSame(CVMBool.FALSE, eval("(boolean nil)")); // nil and false should be falsey diff --git a/convex-core/src/test/java/convex/test/Samples.java b/convex-core/src/test/java/convex/test/Samples.java index 70eb7d27c..ddf116cb8 100644 --- a/convex-core/src/test/java/convex/test/Samples.java +++ b/convex-core/src/test/java/convex/test/Samples.java @@ -112,7 +112,7 @@ public class Samples { public static final ASet LONG_SET_10 = Sets.create(INT_VECTOR_10); public static final ASet LONG_SET_100 = Sets.create(INT_VECTOR_300); - public static final Blob ONE_ZERO_BYTE_DATA = Blob.fromHex("00"); + public static final Blob ONE_ZERO_BYTE_DATA = Blob.ZERO; public static final Keyword FOO = Keyword.create("foo"); public static final Keyword BAR = Keyword.create("bar");