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