comparison src/symbols.c @ 4921:17362f371cc2

add more byte-code assertions and better failure output -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2010-02-03 Ben Wing <ben@xemacs.org> * alloc.c (Fmake_byte_code): * bytecode.h: * lisp.h: * lread.c: * lread.c (readevalloop): * lread.c (Fread): * lread.c (Fread_from_string): * lread.c (read_list_conser): * lread.c (read_list): * lread.c (vars_of_lread): * symbols.c: * symbols.c (Fdefine_function): Turn on the "compiled-function annotation hack". Implement it properly by hooking into Fdefalias(). Note in the docstring to `defalias' that we do this. Remove some old broken code and change code that implemented the old kludgy way of hooking into the Lisp reader into bracketed by `#ifdef COMPILED_FUNCTION_ANNOTATION_HACK_OLD_WAY', which is not enabled. Also enable byte-code metering when DEBUG_XEMACS -- this is a form of profiling for computing histograms of which sequences of two bytecodes are used most often. * bytecode-ops.h: * bytecode-ops.h (OPCODE): New file. Extract out all the opcodes and declare them using OPCODE(), a bit like frame slots and such. This way the file can be included multiple times if necessary to iterate multiple times over the byte opcodes. * bytecode.c: * bytecode.c (NUM_REMEMBERED_BYTE_OPS): * bytecode.c (OPCODE): * bytecode.c (assert_failed_with_remembered_ops): * bytecode.c (READ_UINT_2): * bytecode.c (READ_INT_1): * bytecode.c (READ_INT_2): * bytecode.c (PEEK_INT_1): * bytecode.c (PEEK_INT_2): * bytecode.c (JUMP_RELATIVE): * bytecode.c (JUMP_NEXT): * bytecode.c (PUSH): * bytecode.c (POP_WITH_MULTIPLE_VALUES): * bytecode.c (DISCARD): * bytecode.c (UNUSED): * bytecode.c (optimize_byte_code): * bytecode.c (optimize_compiled_function): * bytecode.c (Fbyte_code): * bytecode.c (vars_of_bytecode): * bytecode.c (init_opcode_table_multi_op): * bytecode.c (reinit_vars_of_bytecode): * emacs.c (main_1): * eval.c (funcall_compiled_function): * symsinit.h: Any time we change either the instruction pointer or the stack pointer, assert that we're going to move it to a valid location. This should catch failures right when they occur rather than sometime later. This requires that we pass in another couple of parameters into some functions (only with error-checking enabled, see below). Also keep track, using a circular queue, of the last 100 byte opcodes seen, and when we hit an assert failure during byte-code execution, output the contents of the queue in a nice readable fashion. This requires that bytecode-ops.h be included a second time so that a table mapping opcodes to the name of their operation can be constructed. This table is constructed in new function reinit_vars_of_bytecode(). Everything in the last two paras happens only when ERROR_CHECK_BYTE_CODE. Add some longish comments describing how the arrays that hold the stack and instructions, and the pointers used to access them, work. * gc.c: Import some code from my `latest-fix' workspace to mark the staticpro's in order from lowest to highest, rather than highest to lowest, so it's easier to debug when something goes wrong. * lisp.h (abort_with_message): Renamed from abort_with_msg(). * symbols.c (defsymbol_massage_name_1): * symbols.c (defsymbol_nodump): * symbols.c (defsymbol): * symbols.c (defkeyword): * symeval.h (DEFVAR_SYMVAL_FWD_OBJECT): Make the various calls to staticpro() instead call staticpro_1(), passing in the name of the C var being staticpro'ed, so that it shows up in staticpro_names. Otherwise staticpro_names just has 1000+ copies of the word `location'.
author Ben Wing <ben@xemacs.org>
date Wed, 03 Feb 2010 08:01:55 -0600
parents 755ae5b97edb
children ba353d7b0ce8
comparison
equal deleted inserted replaced
4914:1628e3b9601a 4921:17362f371cc2
52 objects. This ought to be cleaned up. */ 52 objects. This ought to be cleaned up. */
53 53
54 #include <config.h> 54 #include <config.h>
55 #include "lisp.h" 55 #include "lisp.h"
56 56
57 #include "bytecode.h" /* for COMPILED_FUNCTION_ANNOTATION_HACK,
58 defined in bytecode.h and used here. */
57 #include "buffer.h" /* for Vbuffer_defaults */ 59 #include "buffer.h" /* for Vbuffer_defaults */
58 #include "console-impl.h" 60 #include "console-impl.h"
59 #include "elhash.h" 61 #include "elhash.h"
60 62
61 Lisp_Object Qad_advice_info, Qad_activate; 63 Lisp_Object Qad_advice_info, Qad_activate;
714 716
715 /* FSFmacs */ 717 /* FSFmacs */
716 DEFUN ("define-function", Fdefine_function, 2, 2, 0, /* 718 DEFUN ("define-function", Fdefine_function, 2, 2, 0, /*
717 Set SYMBOL's function definition to NEWDEF, and return NEWDEF. 719 Set SYMBOL's function definition to NEWDEF, and return NEWDEF.
718 Associates the function with the current load file, if any. 720 Associates the function with the current load file, if any.
721 If NEWDEF is a compiled-function object, stores the function name in
722 the `annotated' slot of the compiled-function (retrievable using
723 `compiled-function-annotation').
719 */ 724 */
720 (symbol, newdef)) 725 (symbol, newdef))
721 { 726 {
722 /* This function can GC */ 727 /* This function can GC */
723 Ffset (symbol, newdef); 728 Ffset (symbol, newdef);
724 LOADHIST_ATTACH (Fcons (Qdefun, symbol)); 729 LOADHIST_ATTACH (Fcons (Qdefun, symbol));
730 #ifdef COMPILED_FUNCTION_ANNOTATION_HACK
731 if (COMPILED_FUNCTIONP (newdef))
732 XCOMPILED_FUNCTION (newdef)->annotated = symbol;
733 #endif /* COMPILED_FUNCTION_ANNOTATION_HACK */
725 return newdef; 734 return newdef;
726 } 735 }
727 736
728 DEFUN ("subr-name", Fsubr_name, 1, 1, 0, /* 737 DEFUN ("subr-name", Fsubr_name, 1, 1, 0, /*
729 Return name of function SUBR. 738 Return name of function SUBR.
3551 for (i = 0; i < len; i++) 3560 for (i = 0; i < len; i++)
3552 if (temp[i] == '_') 3561 if (temp[i] == '_')
3553 temp[i] = '-'; 3562 temp[i] = '-';
3554 *location = Fintern (make_string ((const Ibyte *) temp, len), Qnil); 3563 *location = Fintern (make_string ((const Ibyte *) temp, len), Qnil);
3555 if (dump_p) 3564 if (dump_p)
3556 staticpro (location); 3565 staticpro_1 (location, name);
3557 else 3566 else
3558 staticpro_nodump (location); 3567 staticpro_nodump_1 (location, name);
3559 } 3568 }
3560 3569
3561 void 3570 void
3562 defsymbol_massage_name_nodump (Lisp_Object *location, const char *name) 3571 defsymbol_massage_name_nodump (Lisp_Object *location, const char *name)
3563 { 3572 {
3587 defsymbol_nodump (Lisp_Object *location, const char *name) 3596 defsymbol_nodump (Lisp_Object *location, const char *name)
3588 { 3597 {
3589 *location = Fintern (make_string_nocopy ((const Ibyte *) name, 3598 *location = Fintern (make_string_nocopy ((const Ibyte *) name,
3590 strlen (name)), 3599 strlen (name)),
3591 Qnil); 3600 Qnil);
3592 staticpro_nodump (location); 3601 staticpro_nodump_1 (location, name);
3593 } 3602 }
3594 3603
3595 void 3604 void
3596 defsymbol (Lisp_Object *location, const char *name) 3605 defsymbol (Lisp_Object *location, const char *name)
3597 { 3606 {
3598 *location = Fintern (make_string_nocopy ((const Ibyte *) name, 3607 *location = Fintern (make_string_nocopy ((const Ibyte *) name,
3599 strlen (name)), 3608 strlen (name)),
3600 Qnil); 3609 Qnil);
3601 staticpro (location); 3610 staticpro_1 (location, name);
3602 } 3611 }
3603 3612
3604 void 3613 void
3605 defkeyword (Lisp_Object *location, const char *name) 3614 defkeyword (Lisp_Object *location, const char *name)
3606 { 3615 {