diff options
Diffstat (limited to 'src/bytecode.c')
| -rw-r--r-- | src/bytecode.c | 35 |
1 files changed, 14 insertions, 21 deletions
diff --git a/src/bytecode.c b/src/bytecode.c index 29674a0d9de..8bc1ecfeaa5 100644 --- a/src/bytecode.c +++ b/src/bytecode.c | |||
| @@ -1431,29 +1431,22 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, | |||
| 1431 | { /* Do a linear search if there are not many cases | 1431 | { /* Do a linear search if there are not many cases |
| 1432 | FIXME: 5 is arbitrarily chosen. */ | 1432 | FIXME: 5 is arbitrarily chosen. */ |
| 1433 | EMACS_UINT hash_code = h->test.hashfn (&h->test, v1); | 1433 | EMACS_UINT hash_code = h->test.hashfn (&h->test, v1); |
| 1434 | for (i = 0; i < h->count; i++) | 1434 | for (i = h->count; 0 <= --i;) |
| 1435 | { | 1435 | if (EQ (v1, HASH_KEY (h, i)) |
| 1436 | if (BYTE_CODE_SAFE) | 1436 | || (h->test.cmpfn |
| 1437 | eassert (!NILP (HASH_HASH (h, i))); | 1437 | && hash_code == XUINT (HASH_HASH (h, i)) |
| 1438 | 1438 | && h->test.cmpfn (&h->test, v1, HASH_KEY (h, i)))) | |
| 1439 | if (EQ (v1, HASH_KEY (h, i)) | 1439 | break; |
| 1440 | || (h->test.cmpfn | 1440 | |
| 1441 | && hash_code == XUINT (HASH_HASH (h, i)) | ||
| 1442 | && h->test.cmpfn (&h->test, v1, HASH_KEY (h, i)))) | ||
| 1443 | { | ||
| 1444 | op = XINT (HASH_VALUE (h, i)); | ||
| 1445 | goto op_branch; | ||
| 1446 | } | ||
| 1447 | } | ||
| 1448 | } | 1441 | } |
| 1449 | else | 1442 | else |
| 1450 | { | 1443 | i = hash_lookup(h, v1, NULL); |
| 1451 | i = hash_lookup(h, v1, NULL); | 1444 | |
| 1452 | if (i >= 0) { | 1445 | if (i >= 0) |
| 1453 | op = XINT(HASH_VALUE (h, i)); | 1446 | { |
| 1454 | goto op_branch; | 1447 | op = XINT (HASH_VALUE (h, i)); |
| 1455 | } | 1448 | goto op_branch; |
| 1456 | } | 1449 | } |
| 1457 | } | 1450 | } |
| 1458 | NEXT; | 1451 | NEXT; |
| 1459 | 1452 | ||