X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/3e9fa60a5c99568817a12a1011b0e61cce5d3a67..b06bf4dc3ceea6aa39aae5ed64c2b9345eb1920f:/src/data.c diff --git a/src/data.c b/src/data.c index bf863aaed7..9fb276cc89 100644 --- a/src/data.c +++ b/src/data.c @@ -38,6 +38,7 @@ along with GNU Emacs. If not, see . */ #include "keymap.h" Lisp_Object Qnil, Qt, Qquote, Qlambda, Qunbound; +Lisp_Object Qnil_, Qt_; static Lisp_Object Qsubr; Lisp_Object Qerror_conditions, Qerror_message, Qtop_level; Lisp_Object Qerror, Quser_error, Qquit, Qargs_out_of_range; @@ -86,10 +87,11 @@ static Lisp_Object Qmany, Qunevalled; Lisp_Object Qfont_spec, Qfont_entity, Qfont_object; static Lisp_Object Qdefun; +Lisp_Object Qspecial_operator; Lisp_Object Qinteractive_form; static Lisp_Object Qdefalias_fset_function; -static void swap_in_symval_forwarding (struct Lisp_Symbol *, struct Lisp_Buffer_Local_Value *); +static void swap_in_symval_forwarding (sym_t, struct Lisp_Buffer_Local_Value *); static bool BOOLFWDP (union Lisp_Fwd *a) @@ -140,7 +142,7 @@ XOBJFWD (union Lisp_Fwd *a) static void CHECK_SUBR (Lisp_Object x) { - CHECK_TYPE (SUBRP (x), Qsubrp, x); + CHECK_TYPE (! NILP (Fsubrp (x)), Qsubrp, x); } static void @@ -205,12 +207,6 @@ wrong_type_argument (register Lisp_Object predicate, register Lisp_Object value) xsignal2 (Qwrong_type_argument, predicate, value); } -void -pure_write_error (Lisp_Object obj) -{ - xsignal2 (Qerror, build_string ("Attempt to modify read-only object"), obj); -} - void args_out_of_range (Lisp_Object a1, Lisp_Object a2) { @@ -250,21 +246,16 @@ The symbol returned names the object's basic type; for example, (type-of 1) returns `integer'. */) (Lisp_Object object) { - switch (XTYPE (object)) + if (INTEGERP (object)) + return Qinteger; + else if (SYMBOLP (object)) + return Qsymbol; + else if (STRINGP (object)) + return Qstring; + else if (CONSP (object)) + return Qcons; + else if (MISCP (object)) { - case_Lisp_Int: - return Qinteger; - - case Lisp_Symbol: - return Qsymbol; - - case Lisp_String: - return Qstring; - - case Lisp_Cons: - return Qcons; - - case Lisp_Misc: switch (XMISCTYPE (object)) { case Lisp_Misc_Marker: @@ -275,16 +266,15 @@ for example, (type-of 1) returns `integer'. */) return Qfloat; } emacs_abort (); - - case Lisp_Vectorlike: + } + else if (VECTORLIKEP (object)) + { if (WINDOW_CONFIGURATIONP (object)) return Qwindow_configuration; if (PROCESSP (object)) return Qprocess; if (WINDOWP (object)) return Qwindow; - if (SUBRP (object)) - return Qsubr; if (COMPILEDP (object)) return Qcompiled_function; if (BUFFERP (object)) @@ -304,13 +294,13 @@ for example, (type-of 1) returns `integer'. */) if (FONT_OBJECT_P (object)) return Qfont_object; return Qvector; - - case Lisp_Float: - return Qfloat; - - default: - emacs_abort (); } + else if (FLOATP (object)) + return Qfloat; + else if (! NILP (Fsubrp (object))) + return Qsubr; + else + return Qt; } DEFUN ("consp", Fconsp, Sconsp, 1, 1, 0, @@ -359,6 +349,15 @@ DEFUN ("symbolp", Fsymbolp, Ssymbolp, 1, 1, 0, return Qnil; } +static bool +SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object sym) +{ + /* Should be initial_obarray */ + Lisp_Object tem = Ffind_symbol (SYMBOL_NAME (sym), Vobarray); + return (! NILP (scm_c_value_ref (tem, 1)) + && (EQ (sym, scm_c_value_ref (tem, 0)))); +} + /* Define this in C to avoid unnecessarily consing up the symbol name. */ DEFUN ("keywordp", Fkeywordp, Skeywordp, 1, 1, 0, @@ -471,7 +470,9 @@ DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0, doc: /* Return t if OBJECT is a built-in function. */) (Lisp_Object object) { - if (SUBRP (object)) + if (CONSP (object) && EQ (XCAR (object), Qspecial_operator)) + object = XCDR (object); + if (SCM_PRIMITIVE_P (object)) return Qt; return Qnil; } @@ -619,12 +620,12 @@ global value outside of any lexical scope. */) (register Lisp_Object symbol) { Lisp_Object valcontents; - struct Lisp_Symbol *sym; + sym_t sym; CHECK_SYMBOL (symbol); sym = XSYMBOL (symbol); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_PLAINVAL: valcontents = SYMBOL_VAL (sym); break; case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; @@ -652,53 +653,17 @@ global value outside of any lexical scope. */) return (EQ (valcontents, Qunbound) ? Qnil : Qt); } -/* FIXME: Make it an alias for function-symbol! */ -DEFUN ("fboundp", Ffboundp, Sfboundp, 1, 1, 0, - doc: /* Return t if SYMBOL's function definition is not void. */) - (register Lisp_Object symbol) -{ - CHECK_SYMBOL (symbol); - return NILP (XSYMBOL (symbol)->function) ? Qnil : Qt; -} - -DEFUN ("makunbound", Fmakunbound, Smakunbound, 1, 1, 0, - doc: /* Make SYMBOL's value be void. -Return SYMBOL. */) - (register Lisp_Object symbol) -{ - CHECK_SYMBOL (symbol); - if (SYMBOL_CONSTANT_P (symbol)) - xsignal1 (Qsetting_constant, symbol); - Fset (symbol, Qunbound); - return symbol; -} - -DEFUN ("fmakunbound", Ffmakunbound, Sfmakunbound, 1, 1, 0, - doc: /* Make SYMBOL's function definition be nil. -Return SYMBOL. */) - (register Lisp_Object symbol) -{ - CHECK_SYMBOL (symbol); - if (NILP (symbol) || EQ (symbol, Qt)) - xsignal1 (Qsetting_constant, symbol); - set_symbol_function (symbol, Qnil); - return symbol; -} - -DEFUN ("symbol-function", Fsymbol_function, Ssymbol_function, 1, 1, 0, - doc: /* Return SYMBOL's function definition, or nil if that is void. */) - (register Lisp_Object symbol) -{ - CHECK_SYMBOL (symbol); - return XSYMBOL (symbol)->function; -} +WRAP1 (Ffboundp, "fboundp") +WRAP1 (Fmakunbound, "makunbound") +WRAP1 (Ffmakunbound, "fmakunbound") +WRAP1 (Fsymbol_function, "symbol-function") DEFUN ("symbol-plist", Fsymbol_plist, Ssymbol_plist, 1, 1, 0, doc: /* Return SYMBOL's property list. */) (register Lisp_Object symbol) { CHECK_SYMBOL (symbol); - return XSYMBOL (symbol)->plist; + return symbol_plist (symbol); } DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, @@ -712,30 +677,7 @@ DEFUN ("symbol-name", Fsymbol_name, Ssymbol_name, 1, 1, 0, return name; } -DEFUN ("fset", Ffset, Sfset, 2, 2, 0, - doc: /* Set SYMBOL's function definition to DEFINITION, and return DEFINITION. */) - (register Lisp_Object symbol, Lisp_Object definition) -{ - register Lisp_Object function; - CHECK_SYMBOL (symbol); - - function = XSYMBOL (symbol)->function; - - if (!NILP (Vautoload_queue) && !NILP (function)) - Vautoload_queue = Fcons (Fcons (symbol, function), Vautoload_queue); - - if (AUTOLOADP (function)) - Fput (symbol, Qautoload, XCDR (function)); - - /* Convert to eassert or remove after GC bug is found. In the - meantime, check unconditionally, at a slight perf hit. */ - if (valid_lisp_object_p (definition) < 1) - emacs_abort (); - - set_symbol_function (symbol, definition); - - return definition; -} +WRAP2 (Ffset, "fset") DEFUN ("defalias", Fdefalias, Sdefalias, 2, 3, 0, doc: /* Set SYMBOL's function definition to DEFINITION. @@ -762,7 +704,7 @@ The return value is undefined. */) { /* Only add autoload entries after dumping, because the ones before are not useful and else we get loads of them from the loaddefs.el. */ - if (AUTOLOADP (XSYMBOL (symbol)->function)) + if (AUTOLOADP (SYMBOL_FUNCTION (symbol))) /* Remember that the function was already an autoload. */ LOADHIST_ATTACH (Fcons (Qt, symbol)); LOADHIST_ATTACH (Fcons (autoload ? Qautoload : Qdefun, symbol)); @@ -802,14 +744,27 @@ of args. MAX is the maximum number or the symbol `many', for a function with `&rest' args, or `unevalled' for a special form. */) (Lisp_Object subr) { - short minargs, maxargs; + Lisp_Object min, max; + Lisp_Object arity; + bool special = false; + CHECK_SUBR (subr); - minargs = XSUBR (subr)->min_args; - maxargs = XSUBR (subr)->max_args; - return Fcons (make_number (minargs), - maxargs == MANY ? Qmany - : maxargs == UNEVALLED ? Qunevalled - : make_number (maxargs)); + if (CONSP (subr) && EQ (XCAR (subr), Qspecial_operator)) + { + subr = XCDR (subr); + special = true; + } + arity = scm_procedure_minimum_arity (subr); + if (scm_is_false (arity)) + return Qnil; + min = XCAR (arity); + if (special) + max = Qunevalled; + else if (scm_is_true (XCAR (XCDR (XCDR (arity))))) + max = Qmany; + else + max = scm_sum (min, XCAR (XCDR (arity))); + return Fcons (min, max); } DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0, @@ -817,10 +772,10 @@ DEFUN ("subr-name", Fsubr_name, Ssubr_name, 1, 1, 0, SUBR must be a built-in function. */) (Lisp_Object subr) { - const char *name; CHECK_SUBR (subr); - name = XSUBR (subr)->symbol_name; - return build_string (name); + if (CONSP (subr) && EQ (XCAR (subr), Qspecial_operator)) + subr = XCDR (subr); + return Fsymbol_name (SCM_SUBR_NAME (subr)); } DEFUN ("interactive-form", Finteractive_form, Sinteractive_form, 1, 1, 0, @@ -846,19 +801,18 @@ Value, if non-nil, is a list \(interactive SPEC). */) fun = Fsymbol_function (fun); } - if (SUBRP (fun)) - { - const char *spec = XSUBR (fun)->intspec; - if (spec) - return list2 (Qinteractive, - (*spec != '(') ? build_string (spec) : - Fcar (Fread_from_string (build_string (spec), Qnil, Qnil))); - } - else if (COMPILEDP (fun)) + if (COMPILEDP (fun)) { if ((ASIZE (fun) & PSEUDOVECTOR_SIZE_MASK) > COMPILED_INTERACTIVE) return list2 (Qinteractive, AREF (fun, COMPILED_INTERACTIVE)); } + else if (scm_is_true (scm_procedure_p (fun))) + { + Lisp_Object tem = scm_assq (Qinteractive_form, + scm_procedure_properties (fun)); + if (scm_is_pair (tem)) + return list2 (Qinteractive, scm_cdr (tem)); + } else if (AUTOLOADP (fun)) return Finteractive_form (Fautoload_do_load (fun, cmd, Qnil)); else if (CONSP (fun)) @@ -881,17 +835,17 @@ Value, if non-nil, is a list \(interactive SPEC). */) `cyclic-variable-indirection' if SYMBOL's chain of variable indirections contains a loop. */ -struct Lisp_Symbol * -indirect_variable (struct Lisp_Symbol *symbol) +sym_t +indirect_variable (sym_t symbol) { - struct Lisp_Symbol *tortoise, *hare; + sym_t tortoise, hare; hare = tortoise = symbol; - while (hare->redirect == SYMBOL_VARALIAS) + while (SYMBOL_REDIRECT (hare) == SYMBOL_VARALIAS) { hare = SYMBOL_ALIAS (hare); - if (hare->redirect != SYMBOL_VARALIAS) + if (SYMBOL_REDIRECT (hare) != SYMBOL_VARALIAS) break; hare = SYMBOL_ALIAS (hare); @@ -921,7 +875,7 @@ chain of aliases, signal a `cyclic-variable-indirection' error. */) { if (SYMBOLP (object)) { - struct Lisp_Symbol *sym = indirect_variable (XSYMBOL (object)); + sym_t sym = indirect_variable (XSYMBOL (object)); XSETSYMBOL (object, sym); } return object; @@ -1056,7 +1010,7 @@ store_symval_forwarding (union Lisp_Fwd *valcontents, register Lisp_Object newva of BLV are marked after this function has changed them. */ void -swap_in_global_binding (struct Lisp_Symbol *symbol) +swap_in_global_binding (sym_t symbol) { struct Lisp_Buffer_Local_Value *blv = SYMBOL_BLV (symbol); @@ -1082,7 +1036,7 @@ swap_in_global_binding (struct Lisp_Symbol *symbol) This could be another forwarding pointer. */ static void -swap_in_symval_forwarding (struct Lisp_Symbol *symbol, struct Lisp_Buffer_Local_Value *blv) +swap_in_symval_forwarding (sym_t symbol, struct Lisp_Buffer_Local_Value *blv) { register Lisp_Object tem1; @@ -1134,13 +1088,13 @@ swap_in_symval_forwarding (struct Lisp_Symbol *symbol, struct Lisp_Buffer_Local_ Lisp_Object find_symbol_value (Lisp_Object symbol) { - struct Lisp_Symbol *sym; + sym_t sym; CHECK_SYMBOL (symbol); sym = XSYMBOL (symbol); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: return SYMBOL_VAL (sym); @@ -1193,7 +1147,7 @@ set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where, bool bindflag) { bool voide = EQ (newval, Qunbound); - struct Lisp_Symbol *sym; + sym_t sym; Lisp_Object tem1; /* If restoring in a dead buffer, do nothing. */ @@ -1214,7 +1168,7 @@ set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where, sym = XSYMBOL (symbol); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: SET_SYMBOL_VAL (sym , newval); return; @@ -1324,7 +1278,7 @@ set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where, if (voide) { /* If storing void (making the symbol void), forward only through buffer-local indicator, not through Lisp_Objfwd, etc. */ - sym->redirect = SYMBOL_PLAINVAL; + SET_SYMBOL_REDIRECT (sym, SYMBOL_PLAINVAL); SET_SYMBOL_VAL (sym, newval); } else @@ -1344,13 +1298,13 @@ set_internal (Lisp_Object symbol, Lisp_Object newval, Lisp_Object where, static Lisp_Object default_value (Lisp_Object symbol) { - struct Lisp_Symbol *sym; + sym_t sym; CHECK_SYMBOL (symbol); sym = XSYMBOL (symbol); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: return SYMBOL_VAL (sym); @@ -1418,7 +1372,7 @@ The default value is seen in buffers that do not have their own values for this variable. */) (Lisp_Object symbol, Lisp_Object value) { - struct Lisp_Symbol *sym; + sym_t sym; CHECK_SYMBOL (symbol); if (SYMBOL_CONSTANT_P (symbol)) @@ -1433,7 +1387,7 @@ for this variable. */) sym = XSYMBOL (symbol); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: return Fset (symbol, value); @@ -1481,39 +1435,6 @@ for this variable. */) default: emacs_abort (); } } - -DEFUN ("setq-default", Fsetq_default, Ssetq_default, 0, UNEVALLED, 0, - doc: /* Set the default value of variable VAR to VALUE. -VAR, the variable name, is literal (not evaluated); -VALUE is an expression: it is evaluated and its value returned. -The default value of a variable is seen in buffers -that do not have their own values for the variable. - -More generally, you can use multiple variables and values, as in - (setq-default VAR VALUE VAR VALUE...) -This sets each VAR's default value to the corresponding VALUE. -The VALUE for the Nth VAR can refer to the new default values -of previous VARs. -usage: (setq-default [VAR VALUE]...) */) - (Lisp_Object args) -{ - Lisp_Object args_left, symbol, val; - struct gcpro gcpro1; - - args_left = val = args; - GCPRO1 (args); - - while (CONSP (args_left)) - { - val = eval_sub (Fcar (XCDR (args_left))); - symbol = XCAR (args_left); - Fset_default (symbol, val); - args_left = Fcdr (XCDR (args_left)); - } - - UNGCPRO; - return val; -} /* Lisp functions for creating and removing buffer-local variables. */ @@ -1524,7 +1445,7 @@ union Lisp_Val_Fwd }; static struct Lisp_Buffer_Local_Value * -make_blv (struct Lisp_Symbol *sym, bool forwarded, +make_blv (sym_t sym, bool forwarded, union Lisp_Val_Fwd valcontents) { struct Lisp_Buffer_Local_Value *blv = xmalloc (sizeof *blv); @@ -1570,7 +1491,7 @@ property. The function `default-value' gets the default value and `set-default' sets it. */) (register Lisp_Object variable) { - struct Lisp_Symbol *sym; + sym_t sym; struct Lisp_Buffer_Local_Value *blv = NULL; union Lisp_Val_Fwd valcontents IF_LINT (= {LISP_INITIALLY_ZERO}); bool forwarded IF_LINT (= 0); @@ -1579,7 +1500,7 @@ The function `default-value' gets the default value and `set-default' sets it. sym = XSYMBOL (variable); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: @@ -1604,13 +1525,13 @@ The function `default-value' gets the default value and `set-default' sets it. default: emacs_abort (); } - if (sym->constant) + if (SYMBOL_CONSTANT (sym)) error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable))); if (!blv) { blv = make_blv (sym, forwarded, valcontents); - sym->redirect = SYMBOL_LOCALIZED; + SET_SYMBOL_REDIRECT (sym, SYMBOL_LOCALIZED); SET_SYMBOL_BLV (sym, blv); { Lisp_Object symbol; @@ -1650,14 +1571,14 @@ Instead, use `add-hook' and specify t for the LOCAL argument. */) Lisp_Object tem; bool forwarded IF_LINT (= 0); union Lisp_Val_Fwd valcontents IF_LINT (= {LISP_INITIALLY_ZERO}); - struct Lisp_Symbol *sym; + sym_t sym; struct Lisp_Buffer_Local_Value *blv = NULL; CHECK_SYMBOL (variable); sym = XSYMBOL (variable); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: @@ -1677,7 +1598,7 @@ Instead, use `add-hook' and specify t for the LOCAL argument. */) default: emacs_abort (); } - if (sym->constant) + if (SYMBOL_CONSTANT (sym)) error ("Symbol %s may not be buffer-local", SDATA (SYMBOL_NAME (variable))); @@ -1693,7 +1614,7 @@ Instead, use `add-hook' and specify t for the LOCAL argument. */) if (!blv) { blv = make_blv (sym, forwarded, valcontents); - sym->redirect = SYMBOL_LOCALIZED; + SET_SYMBOL_REDIRECT (sym, SYMBOL_LOCALIZED); SET_SYMBOL_BLV (sym, blv); { Lisp_Object symbol; @@ -1749,13 +1670,13 @@ From now on the default value will apply in this buffer. Return VARIABLE. */) { register Lisp_Object tem; struct Lisp_Buffer_Local_Value *blv; - struct Lisp_Symbol *sym; + sym_t sym; CHECK_SYMBOL (variable); sym = XSYMBOL (variable); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: return variable; @@ -1836,14 +1757,14 @@ frame-local bindings). */) { bool forwarded; union Lisp_Val_Fwd valcontents; - struct Lisp_Symbol *sym; + sym_t sym; struct Lisp_Buffer_Local_Value *blv = NULL; CHECK_SYMBOL (variable); sym = XSYMBOL (variable); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: @@ -1866,12 +1787,12 @@ frame-local bindings). */) default: emacs_abort (); } - if (sym->constant) + if (SYMBOL_CONSTANT (sym)) error ("Symbol %s may not be frame-local", SDATA (SYMBOL_NAME (variable))); blv = make_blv (sym, forwarded, valcontents); blv->frame_local = 1; - sym->redirect = SYMBOL_LOCALIZED; + SET_SYMBOL_REDIRECT (sym, SYMBOL_LOCALIZED); SET_SYMBOL_BLV (sym, blv); { Lisp_Object symbol; @@ -1890,7 +1811,7 @@ BUFFER defaults to the current buffer. */) (register Lisp_Object variable, Lisp_Object buffer) { register struct buffer *buf; - struct Lisp_Symbol *sym; + sym_t sym; if (NILP (buffer)) buf = current_buffer; @@ -1904,7 +1825,7 @@ BUFFER defaults to the current buffer. */) sym = XSYMBOL (variable); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: return Qnil; @@ -1955,13 +1876,13 @@ value in BUFFER, or if VARIABLE is automatically buffer-local (see `make-variable-buffer-local'). */) (register Lisp_Object variable, Lisp_Object buffer) { - struct Lisp_Symbol *sym; + sym_t sym; CHECK_SYMBOL (variable); sym = XSYMBOL (variable); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: return Qnil; @@ -1988,7 +1909,7 @@ If the current binding is frame-local, the value is the selected frame. If the current binding is global (the default), the value is nil. */) (register Lisp_Object variable) { - struct Lisp_Symbol *sym; + sym_t sym; CHECK_SYMBOL (variable); sym = XSYMBOL (variable); @@ -1997,7 +1918,7 @@ If the current binding is global (the default), the value is nil. */) find_symbol_value (variable); start: - switch (sym->redirect) + switch (SYMBOL_REDIRECT (sym)) { case SYMBOL_VARALIAS: sym = indirect_variable (sym); goto start; case SYMBOL_PLAINVAL: return Qnil; @@ -2015,7 +1936,7 @@ If the current binding is global (the default), the value is nil. */) buffer's or frame's value we are saving. */ if (!NILP (Flocal_variable_p (variable, Qnil))) return Fcurrent_buffer (); - else if (sym->redirect == SYMBOL_LOCALIZED + else if (SYMBOL_REDIRECT (sym) == SYMBOL_LOCALIZED && blv_found (SYMBOL_BLV (sym))) return SYMBOL_BLV (sym)->where; else @@ -2086,12 +2007,12 @@ indirect_function (register Lisp_Object object) { if (!SYMBOLP (hare) || NILP (hare)) break; - hare = XSYMBOL (hare)->function; + hare = SYMBOL_FUNCTION (hare); if (!SYMBOLP (hare) || NILP (hare)) break; - hare = XSYMBOL (hare)->function; + hare = SYMBOL_FUNCTION (hare); - tortoise = XSYMBOL (tortoise)->function; + tortoise = SYMBOL_FUNCTION (tortoise); if (EQ (hare, tortoise)) xsignal1 (Qcyclic_function_indirection, object); @@ -2115,7 +2036,7 @@ function chain of symbols. */) /* Optimize for no indirection. */ result = object; if (SYMBOLP (result) && !NILP (result) - && (result = XSYMBOL (result)->function, SYMBOLP (result))) + && (result = SYMBOL_FUNCTION (result), SYMBOLP (result))) result = indirect_function (result); if (!NILP (result)) return result; @@ -2237,7 +2158,7 @@ bool-vector. IDX starts at 0. */) unsigned char *str = SAFE_ALLOCA (nbytes); memcpy (str, SDATA (array), nbytes); - allocate_string_data (XSTRING (array), nchars, + allocate_string_data (array, nchars, nbytes + new_bytes - prev_bytes); memcpy (SDATA (array), str, idxval_byte); p1 = SDATA (array) + idxval_byte; @@ -2332,7 +2253,7 @@ arithcompare_driver (ptrdiff_t nargs, Lisp_Object *args, ptrdiff_t argnum; for (argnum = 1; argnum < nargs; ++argnum) { - if (EQ (Qnil, arithcompare (args[argnum-1], args[argnum], comparison))) + if (EQ (Qnil, arithcompare (args[argnum - 1], args[argnum], comparison))) return Qnil; } return Qt; @@ -2347,7 +2268,7 @@ usage: (= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) } DEFUN ("<", Flss, Slss, 1, MANY, 0, - doc: /* Return t if each arg is less than the next arg. All must be numbers or markers. + doc: /* Return t if each arg (a number or marker), is less than the next arg. usage: (< NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { @@ -2355,7 +2276,7 @@ usage: (< NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) } DEFUN (">", Fgtr, Sgtr, 1, MANY, 0, - doc: /* Return t if each arg is greater than the next arg. All must be numbers or markers. + doc: /* Return t if each arg (a number or marker) is greater than the next arg. usage: (> NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { @@ -2363,8 +2284,7 @@ usage: (> NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) } DEFUN ("<=", Fleq, Sleq, 1, MANY, 0, - doc: /* Return t if each arg is less than or equal to the next arg. -All must be numbers or markers. + doc: /* Return t if each arg (a number or marker) is less than or equal to the next. usage: (<= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { @@ -2372,8 +2292,7 @@ usage: (<= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) } DEFUN (">=", Fgeq, Sgeq, 1, MANY, 0, - doc: /* Return t if each arg is greater than or equal to the next arg. -All must be numbers or markers. + doc: /* Return t if each arg (a number or marker) is greater than or equal to the next. usage: (>= NUMBER-OR-MARKER &rest NUMBERS-OR-MARKERS) */) (ptrdiff_t nargs, Lisp_Object *args) { @@ -2386,24 +2305,6 @@ DEFUN ("/=", Fneq, Sneq, 2, 2, 0, { return arithcompare (num1, num2, ARITH_NOTEQUAL); } - -DEFUN ("zerop", Fzerop, Szerop, 1, 1, 0, - doc: /* Return t if NUMBER is zero. */) - (register Lisp_Object number) -{ - CHECK_NUMBER_OR_FLOAT (number); - - if (FLOATP (number)) - { - if (XFLOAT_DATA (number) == 0.0) - return Qt; - return Qnil; - } - - if (!XINT (number)) - return Qt; - return Qnil; -} /* Convert the cons-of-integers, integer, or float value C to an unsigned value with maximum value MAX. Signal an error if C does not @@ -3404,11 +3305,29 @@ A is a bool vector, B is t or nil, and I is an index into A. */) } +DEFUN ("bind-symbol", Fbind_symbol, Sbind_symbol, 3, 3, 0, + doc: /* Bind symbol. */) + (Lisp_Object symbol, Lisp_Object value, Lisp_Object thunk) +{ + Lisp_Object val; + dynwind_begin (); + specbind (symbol, value); + val = call0 (thunk); + dynwind_end (); + return val; +} + void syms_of_data (void) { Lisp_Object error_tail, arith_tail; + /* Used by defsubr. */ + DEFSYM (Qspecial_operator, "special-operator"); + DEFSYM (Qinteractive_form, "interactive-form"); + +#include "data.x" + DEFSYM (Qquote, "quote"); DEFSYM (Qlambda, "lambda"); DEFSYM (Qsubr, "subr"); @@ -3573,122 +3492,17 @@ syms_of_data (void) DEFSYM (Qfont_entity, "font-entity"); DEFSYM (Qfont_object, "font-object"); - DEFSYM (Qinteractive_form, "interactive-form"); DEFSYM (Qdefalias_fset_function, "defalias-fset-function"); - defsubr (&Sindirect_variable); - defsubr (&Sinteractive_form); - defsubr (&Seq); - defsubr (&Snull); - defsubr (&Stype_of); - defsubr (&Slistp); - defsubr (&Snlistp); - defsubr (&Sconsp); - defsubr (&Satom); - defsubr (&Sintegerp); - defsubr (&Sinteger_or_marker_p); - defsubr (&Snumberp); - defsubr (&Snumber_or_marker_p); - defsubr (&Sfloatp); - defsubr (&Snatnump); - defsubr (&Ssymbolp); - defsubr (&Skeywordp); - defsubr (&Sstringp); - defsubr (&Smultibyte_string_p); - defsubr (&Svectorp); - defsubr (&Schar_table_p); - defsubr (&Svector_or_char_table_p); - defsubr (&Sbool_vector_p); - defsubr (&Sarrayp); - defsubr (&Ssequencep); - defsubr (&Sbufferp); - defsubr (&Smarkerp); - defsubr (&Ssubrp); - defsubr (&Sbyte_code_function_p); - defsubr (&Schar_or_string_p); - defsubr (&Scar); - defsubr (&Scdr); - defsubr (&Scar_safe); - defsubr (&Scdr_safe); - defsubr (&Ssetcar); - defsubr (&Ssetcdr); - defsubr (&Ssymbol_function); - defsubr (&Sindirect_function); - defsubr (&Ssymbol_plist); - defsubr (&Ssymbol_name); - defsubr (&Smakunbound); - defsubr (&Sfmakunbound); - defsubr (&Sboundp); - defsubr (&Sfboundp); - defsubr (&Sfset); - defsubr (&Sdefalias); - defsubr (&Ssetplist); - defsubr (&Ssymbol_value); - defsubr (&Sset); - defsubr (&Sdefault_boundp); - defsubr (&Sdefault_value); - defsubr (&Sset_default); - defsubr (&Ssetq_default); - defsubr (&Smake_variable_buffer_local); - defsubr (&Smake_local_variable); - defsubr (&Skill_local_variable); - defsubr (&Smake_variable_frame_local); - defsubr (&Slocal_variable_p); - defsubr (&Slocal_variable_if_set_p); - defsubr (&Svariable_binding_locus); -#if 0 /* XXX Remove this. --lorentey */ - defsubr (&Sterminal_local_value); - defsubr (&Sset_terminal_local_value); -#endif - defsubr (&Saref); - defsubr (&Saset); - defsubr (&Snumber_to_string); - defsubr (&Sstring_to_number); - defsubr (&Seqlsign); - defsubr (&Slss); - defsubr (&Sgtr); - defsubr (&Sleq); - defsubr (&Sgeq); - defsubr (&Sneq); - defsubr (&Szerop); - defsubr (&Splus); - defsubr (&Sminus); - defsubr (&Stimes); - defsubr (&Squo); - defsubr (&Srem); - defsubr (&Smod); - defsubr (&Smax); - defsubr (&Smin); - defsubr (&Slogand); - defsubr (&Slogior); - defsubr (&Slogxor); - defsubr (&Slsh); - defsubr (&Sash); - defsubr (&Sadd1); - defsubr (&Ssub1); - defsubr (&Slognot); - defsubr (&Sbyteorder); - defsubr (&Ssubr_arity); - defsubr (&Ssubr_name); - - defsubr (&Sbool_vector_exclusive_or); - defsubr (&Sbool_vector_union); - defsubr (&Sbool_vector_intersection); - defsubr (&Sbool_vector_set_difference); - defsubr (&Sbool_vector_not); - defsubr (&Sbool_vector_subsetp); - defsubr (&Sbool_vector_count_consecutive); - defsubr (&Sbool_vector_count_population); - - set_symbol_function (Qwholenump, XSYMBOL (Qnatnump)->function); + set_symbol_function (Qwholenump, SYMBOL_FUNCTION (Qnatnump)); DEFVAR_LISP ("most-positive-fixnum", Vmost_positive_fixnum, doc: /* The largest value that is representable in a Lisp integer. */); Vmost_positive_fixnum = make_number (MOST_POSITIVE_FIXNUM); - XSYMBOL (intern_c_string ("most-positive-fixnum"))->constant = 1; + SET_SYMBOL_CONSTANT (XSYMBOL (intern_c_string ("most-positive-fixnum")), 1); DEFVAR_LISP ("most-negative-fixnum", Vmost_negative_fixnum, doc: /* The smallest value that is representable in a Lisp integer. */); Vmost_negative_fixnum = make_number (MOST_NEGATIVE_FIXNUM); - XSYMBOL (intern_c_string ("most-negative-fixnum"))->constant = 1; + SET_SYMBOL_CONSTANT (XSYMBOL (intern_c_string ("most-negative-fixnum")), 1); }