Mercurial > emacs
comparison src/bytecode.c @ 16784:79ea730b7e20
(Fbyte_code): Add error check for jumping out of range.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Mon, 30 Dec 1996 05:59:42 +0000 |
| parents | 25e8123eb6c5 |
| children | 9e0f59154164 |
comparison
equal
deleted
inserted
replaced
| 16783:b87f9489bcd3 | 16784:79ea730b7e20 |
|---|---|
| 256 | 256 |
| 257 #define MAYBE_GC() \ | 257 #define MAYBE_GC() \ |
| 258 if (consing_since_gc > gc_cons_threshold) \ | 258 if (consing_since_gc > gc_cons_threshold) \ |
| 259 Fgarbage_collect (); | 259 Fgarbage_collect (); |
| 260 | 260 |
| 261 /* Check for jumping out of range. */ | |
| 262 #define CHECK_RANGE(ARG) \ | |
| 263 if (ARG >= bytestr_length) abort () | |
| 264 | |
| 261 DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0, | 265 DEFUN ("byte-code", Fbyte_code, Sbyte_code, 3, 3, 0, |
| 262 "Function used internally in byte-compiled code.\n\ | 266 "Function used internally in byte-compiled code.\n\ |
| 263 The first argument, BYTESTR, is a string of byte code;\n\ | 267 The first argument, BYTESTR, is a string of byte code;\n\ |
| 264 the second, VECTOR, a vector of constants;\n\ | 268 the second, VECTOR, a vector of constants;\n\ |
| 265 the third, MAXDEPTH, the maximum stack depth used in this function.\n\ | 269 the third, MAXDEPTH, the maximum stack depth used in this function.\n\ |
| 286 /* Copy of BYTESTR, saved so we can tell if BYTESTR was relocated. */ | 290 /* Copy of BYTESTR, saved so we can tell if BYTESTR was relocated. */ |
| 287 Lisp_Object string_saved; | 291 Lisp_Object string_saved; |
| 288 /* Cached address of beginning of string, | 292 /* Cached address of beginning of string, |
| 289 valid if BYTESTR equals STRING_SAVED. */ | 293 valid if BYTESTR equals STRING_SAVED. */ |
| 290 register unsigned char *strbeg; | 294 register unsigned char *strbeg; |
| 295 int bytestr_length = XSTRING (bytestr)->size; | |
| 291 | 296 |
| 292 CHECK_STRING (bytestr, 0); | 297 CHECK_STRING (bytestr, 0); |
| 293 if (!VECTORP (vector)) | 298 if (!VECTORP (vector)) |
| 294 vector = wrong_type_argument (Qvectorp, vector); | 299 vector = wrong_type_argument (Qvectorp, vector); |
| 295 CHECK_NUMBER (maxdepth, 2); | 300 CHECK_NUMBER (maxdepth, 2); |
| 439 | 444 |
| 440 case Bgoto: | 445 case Bgoto: |
| 441 MAYBE_GC (); | 446 MAYBE_GC (); |
| 442 QUIT; | 447 QUIT; |
| 443 op = FETCH2; /* pc = FETCH2 loses since FETCH2 contains pc++ */ | 448 op = FETCH2; /* pc = FETCH2 loses since FETCH2 contains pc++ */ |
| 449 CHECK_RANGE (op); | |
| 444 pc = XSTRING (string_saved)->data + op; | 450 pc = XSTRING (string_saved)->data + op; |
| 445 break; | 451 break; |
| 446 | 452 |
| 447 case Bgotoifnil: | 453 case Bgotoifnil: |
| 448 MAYBE_GC (); | 454 MAYBE_GC (); |
| 449 op = FETCH2; | 455 op = FETCH2; |
| 450 if (NILP (POP)) | 456 if (NILP (POP)) |
| 451 { | 457 { |
| 452 QUIT; | 458 QUIT; |
| 459 CHECK_RANGE (op); | |
| 453 pc = XSTRING (string_saved)->data + op; | 460 pc = XSTRING (string_saved)->data + op; |
| 454 } | 461 } |
| 455 break; | 462 break; |
| 456 | 463 |
| 457 case Bgotoifnonnil: | 464 case Bgotoifnonnil: |
| 458 MAYBE_GC (); | 465 MAYBE_GC (); |
| 459 op = FETCH2; | 466 op = FETCH2; |
| 460 if (!NILP (POP)) | 467 if (!NILP (POP)) |
| 461 { | 468 { |
| 462 QUIT; | 469 QUIT; |
| 470 CHECK_RANGE (op); | |
| 463 pc = XSTRING (string_saved)->data + op; | 471 pc = XSTRING (string_saved)->data + op; |
| 464 } | 472 } |
| 465 break; | 473 break; |
| 466 | 474 |
| 467 case Bgotoifnilelsepop: | 475 case Bgotoifnilelsepop: |
| 468 MAYBE_GC (); | 476 MAYBE_GC (); |
| 469 op = FETCH2; | 477 op = FETCH2; |
| 470 if (NILP (TOP)) | 478 if (NILP (TOP)) |
| 471 { | 479 { |
| 472 QUIT; | 480 QUIT; |
| 481 CHECK_RANGE (op); | |
| 473 pc = XSTRING (string_saved)->data + op; | 482 pc = XSTRING (string_saved)->data + op; |
| 474 } | 483 } |
| 475 else DISCARD (1); | 484 else DISCARD (1); |
| 476 break; | 485 break; |
| 477 | 486 |
| 479 MAYBE_GC (); | 488 MAYBE_GC (); |
| 480 op = FETCH2; | 489 op = FETCH2; |
| 481 if (!NILP (TOP)) | 490 if (!NILP (TOP)) |
| 482 { | 491 { |
| 483 QUIT; | 492 QUIT; |
| 493 CHECK_RANGE (op); | |
| 484 pc = XSTRING (string_saved)->data + op; | 494 pc = XSTRING (string_saved)->data + op; |
| 485 } | 495 } |
| 486 else DISCARD (1); | 496 else DISCARD (1); |
| 487 break; | 497 break; |
| 488 | 498 |
