diff options
author | Teddy <ted.sybil@gmail.com> | 2013-08-09 10:31:09 +0800 |
---|---|---|
committer | Teddy <ted.sybil@gmail.com> | 2013-08-09 10:31:09 +0800 |
commit | 0c606491335e99017897a7710461214412243dd7 (patch) | |
tree | bb14db40980d5029d9e582cb0b130e328657d401 /builtin.cpp | |
parent | e782bbeb805fffaaa4a118fb88be96894ac68c28 (diff) |
...
Diffstat (limited to 'builtin.cpp')
-rw-r--r-- | builtin.cpp | 26 |
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) |