]> code.delx.au - gnu-emacs/blobdiff - src/data.c
Merge from trunk
[gnu-emacs] / src / data.c
index d0afca6a09fd411e1b1ab298caa16039b736c18b..ecedba241011398771f6f46f3858f7e1766ca3db 100644 (file)
@@ -84,7 +84,7 @@ static Lisp_Object Qsymbol, Qstring, Qcons, Qmarker, Qoverlay;
 Lisp_Object Qwindow;
 static Lisp_Object Qfloat, Qwindow_configuration;
 Lisp_Object Qprocess;
-static Lisp_Object Qcompiled_function, Qbuffer, Qframe, Qvector;
+static Lisp_Object Qcompiled_function, Qfunction_vector, Qbuffer, Qframe, Qvector;
 static Lisp_Object Qchar_table, Qbool_vector, Qhash_table;
 static Lisp_Object Qsubrp, Qmany, Qunevalled;
 Lisp_Object Qfont_spec, Qfont_entity, Qfont_object;
@@ -194,8 +194,11 @@ for example, (type-of 1) returns `integer'.  */)
        return Qwindow;
       if (SUBRP (object))
        return Qsubr;
-      if (COMPILEDP (object))
-       return Qcompiled_function;
+      if (FUNVECP (object))
+       if (FUNVEC_COMPILED_P (object))
+         return Qcompiled_function;
+       else
+         return Qfunction_vector;
       if (BUFFERP (object))
        return Qbuffer;
       if (CHAR_TABLE_P (object))
@@ -394,6 +397,13 @@ DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p,
   return Qnil;
 }
 
+DEFUN ("funvecp", Ffunvecp, Sfunvecp, 1, 1, 0,
+       doc: /* Return t if OBJECT is a `function vector' object.  */)
+     (Lisp_Object object)
+{
+  return FUNVECP (object) ? Qt : Qnil;
+}
+
 DEFUN ("char-or-string-p", Fchar_or_string_p, Schar_or_string_p, 1, 1, 0,
        doc: /* Return t if OBJECT is a character or a string.  */)
   (register Lisp_Object object)
@@ -745,6 +755,8 @@ Value, if non-nil, is a list \(interactive SPEC).  */)
   else if (CONSP (fun))
     {
       Lisp_Object funcar = XCAR (fun);
+      if (EQ (funcar, Qclosure))
+       fun = Fcdr (XCDR (fun)), funcar = Fcar (fun);
       if (EQ (funcar, Qlambda))
        return Fassq (Qinteractive, Fcdr (XCDR (fun)));
       else if (EQ (funcar, Qautoload))
@@ -1439,7 +1451,7 @@ usage: (setq-default [VAR VALUE]...)  */)
 
   do
     {
-      val = Feval (Fcar (Fcdr (args_left)));
+      val = eval_sub (Fcar (Fcdr (args_left)));
       symbol = XCAR (args_left);
       Fset_default (symbol, val);
       args_left = Fcdr (XCDR (args_left));
@@ -2101,15 +2113,15 @@ or a byte-code object.  IDX starts at 0.  */)
     {
       int size = 0;
       if (VECTORP (array))
-       size = XVECTOR (array)->size;
-      else if (COMPILEDP (array))
-       size = XVECTOR (array)->size & PSEUDOVECTOR_SIZE_MASK;
+       size = ASIZE (array);
+      else if (FUNVECP (array))
+       size = FUNVEC_SIZE (array);
       else
        wrong_type_argument (Qarrayp, array);
 
       if (idxval < 0 || idxval >= size)
        args_out_of_range (array, idx);
-      return XVECTOR (array)->contents[idxval];
+      return AREF (array, idxval);
     }
 }
 
@@ -3168,6 +3180,7 @@ syms_of_data (void)
   Qwindow = intern_c_string ("window");
   /* Qsubr = intern_c_string ("subr"); */
   Qcompiled_function = intern_c_string ("compiled-function");
+  Qfunction_vector = intern_c_string ("function-vector");
   Qbuffer = intern_c_string ("buffer");
   Qframe = intern_c_string ("frame");
   Qvector = intern_c_string ("vector");
@@ -3193,6 +3206,7 @@ syms_of_data (void)
   staticpro (&Qwindow);
   /* staticpro (&Qsubr); */
   staticpro (&Qcompiled_function);
+  staticpro (&Qfunction_vector);
   staticpro (&Qbuffer);
   staticpro (&Qframe);
   staticpro (&Qvector);
@@ -3229,6 +3243,7 @@ syms_of_data (void)
   defsubr (&Smarkerp);
   defsubr (&Ssubrp);
   defsubr (&Sbyte_code_function_p);
+  defsubr (&Sfunvecp);
   defsubr (&Schar_or_string_p);
   defsubr (&Scar);
   defsubr (&Scdr);