summaryrefslogtreecommitdiff
path: root/src/scheme/ao_scheme_vector.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-14 23:04:39 -0800
committerKeith Packard <keithp@keithp.com>2017-12-14 23:04:39 -0800
commit32f6877288ea6b7eb1cae9a42fbe8e2c5dbb2f08 (patch)
tree4e23989a62ae144b8cbf1d2fd135ca8a6bd743dc /src/scheme/ao_scheme_vector.c
parent2e11cae044cd2c053049effd76df9c5adecb84d7 (diff)
altos/scheme: swap BIGINT and STRING types
This lets BIGINT be a primitive type, allowing it to use all 32 bits for storage. This does make strings another byte longer, and also slightly harder to deal with. It's a trade off. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/scheme/ao_scheme_vector.c')
-rw-r--r--src/scheme/ao_scheme_vector.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/scheme/ao_scheme_vector.c b/src/scheme/ao_scheme_vector.c
index 0114c5a9..a4127f64 100644
--- a/src/scheme/ao_scheme_vector.c
+++ b/src/scheme/ao_scheme_vector.c
@@ -107,14 +107,15 @@ ao_scheme_vector_display(ao_poly v)
static int32_t
ao_scheme_vector_offset(struct ao_scheme_vector *vector, ao_poly i)
{
- int32_t offset = ao_scheme_poly_integer(i);
+ bool fail;
+ int32_t offset = ao_scheme_poly_integer(i, &fail);
- if (offset == AO_SCHEME_NOT_INTEGER)
+ if (fail)
ao_scheme_error(AO_SCHEME_INVALID, "vector index %v not integer", i);
if (offset < 0 || vector->length <= offset) {
ao_scheme_error(AO_SCHEME_INVALID, "vector index %v out of range (max %d)",
i, vector->length);
- offset = AO_SCHEME_NOT_INTEGER;
+ offset = -1;
}
return offset;
}
@@ -125,7 +126,7 @@ ao_scheme_vector_get(ao_poly v, ao_poly i)
struct ao_scheme_vector *vector = ao_scheme_poly_vector(v);
int32_t offset = ao_scheme_vector_offset(vector, i);
- if (offset == AO_SCHEME_NOT_INTEGER)
+ if (offset < 0)
return AO_SCHEME_NIL;
return vector->vals[offset];
}
@@ -136,7 +137,7 @@ ao_scheme_vector_set(ao_poly v, ao_poly i, ao_poly p)
struct ao_scheme_vector *vector = ao_scheme_poly_vector(v);
int32_t offset = ao_scheme_vector_offset(vector, i);
- if (offset == AO_SCHEME_NOT_INTEGER)
+ if (offset < 0)
return AO_SCHEME_NIL;
return vector->vals[offset] = p;
}