aboutsummaryrefslogtreecommitdiff
path: root/builtin.cpp
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2013-08-09 10:31:09 +0800
committerTeddy <ted.sybil@gmail.com>2013-08-09 10:31:09 +0800
commit0c606491335e99017897a7710461214412243dd7 (patch)
treebb14db40980d5029d9e582cb0b130e328657d401 /builtin.cpp
parente782bbeb805fffaaa4a118fb88be96894ac68c28 (diff)
...
Diffstat (limited to 'builtin.cpp')
-rw-r--r--builtin.cpp26
1 files changed, 22 insertions, 4 deletions
diff --git a/builtin.cpp b/builtin.cpp
index cec007e..7c5f3c7 100644
--- a/builtin.cpp
+++ b/builtin.cpp
@@ -1258,12 +1258,24 @@ BUILTIN_PROC_DEF(is_eqv) {
BUILTIN_PROC_DEF(is_equal) {
-#define INC1(x) (++(x) == t1 ? (x) = q1:0)
-#define INC2(x) (++(x) == t2 ? (x) = q2:0)
+//#define INC1(x) (++(x) == t1 ? (x) = q1:0)
+//#define INC2(x) (++(x) == t2 ? (x) = q2:0)
+#define INC1(x) (++(x))
+#define INC2(x) (++(x))
+#define CHK1 \
+do { \
+ if (r1 == q1 + EQUAL_QUEUE_SIZE) \
+ throw NormalError(RUN_ERR_QUEUE_OVERFLOW); \
+} while (0)
+
+#define CHK2 \
+do { \
+ if (r2 == q2 + EQUAL_QUEUE_SIZE) \
+ throw NormalError(RUN_ERR_QUEUE_OVERFLOW); \
+} while (0)
+
static EvalObj *q1[EQUAL_QUEUE_SIZE], *q2[EQUAL_QUEUE_SIZE];
- static EvalObj ** const t1 = q1 + EQUAL_QUEUE_SIZE;
- static EvalObj ** const t2 = q2 + EQUAL_QUEUE_SIZE;
ARGS_EXACTLY_TWO;
EvalObj **l1 = q1, **r1 = l1;
@@ -1285,13 +1297,17 @@ BUILTIN_PROC_DEF(is_equal) {
{
*r1 = TO_PAIR(a)->car;
INC1(r1);
+ CHK1;
*r1 = TO_PAIR(a)->cdr;
INC1(r1);
+ CHK1;
*r2 = TO_PAIR(b)->car;
INC2(r2);
+ CHK2;
*r2 = TO_PAIR(b)->cdr;
INC2(r2);
+ CHK2;
}
else if (otype & CLS_VECT_OBJ)
{
@@ -1305,6 +1321,7 @@ BUILTIN_PROC_DEF(is_equal) {
{
*r1 = TO_PAIR(a)->car;
INC1(r1);
+ CHK1;
}
for (EvalObjVec::iterator
@@ -1313,6 +1330,7 @@ BUILTIN_PROC_DEF(is_equal) {
{
*r2 = TO_PAIR(b)->car;
INC2(r2);
+ CHK2;
}
}
else if (otype & CLS_BOOL_OBJ)