diff options
Diffstat (limited to '')
| -rw-r--r-- | src/data.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/src/data.c b/src/data.c index 681054ff8cb..ea611ad1abf 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -248,7 +248,9 @@ a fixed set of types. */) | |||
| 248 | return XSUBR (object)->max_args == UNEVALLED ? Qspecial_form | 248 | return XSUBR (object)->max_args == UNEVALLED ? Qspecial_form |
| 249 | : SUBR_NATIVE_COMPILEDP (object) ? Qsubr_native_elisp | 249 | : SUBR_NATIVE_COMPILEDP (object) ? Qsubr_native_elisp |
| 250 | : Qprimitive_function; | 250 | : Qprimitive_function; |
| 251 | case PVEC_CLOSURE: return Qcompiled_function; | 251 | case PVEC_CLOSURE: |
| 252 | return CONSP (AREF (object, CLOSURE_CODE)) | ||
| 253 | ? Qinterpreted_function : Qbyte_code_function; | ||
| 252 | case PVEC_BUFFER: return Qbuffer; | 254 | case PVEC_BUFFER: return Qbuffer; |
| 253 | case PVEC_CHAR_TABLE: return Qchar_table; | 255 | case PVEC_CHAR_TABLE: return Qchar_table; |
| 254 | case PVEC_BOOL_VECTOR: return Qbool_vector; | 256 | case PVEC_BOOL_VECTOR: return Qbool_vector; |
| @@ -518,12 +520,32 @@ DEFUN ("subrp", Fsubrp, Ssubrp, 1, 1, 0, | |||
| 518 | return Qnil; | 520 | return Qnil; |
| 519 | } | 521 | } |
| 520 | 522 | ||
| 523 | DEFUN ("closurep", Fclosurep, Sclosurep, | ||
| 524 | 1, 1, 0, | ||
| 525 | doc: /* Return t if OBJECT is a function of type `closure'. */) | ||
| 526 | (Lisp_Object object) | ||
| 527 | { | ||
| 528 | if (CLOSUREP (object)) | ||
| 529 | return Qt; | ||
| 530 | return Qnil; | ||
| 531 | } | ||
| 532 | |||
| 521 | DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p, | 533 | DEFUN ("byte-code-function-p", Fbyte_code_function_p, Sbyte_code_function_p, |
| 522 | 1, 1, 0, | 534 | 1, 1, 0, |
| 523 | doc: /* Return t if OBJECT is a byte-compiled function object. */) | 535 | doc: /* Return t if OBJECT is a byte-compiled function object. */) |
| 524 | (Lisp_Object object) | 536 | (Lisp_Object object) |
| 525 | { | 537 | { |
| 526 | if (CLOSUREP (object)) | 538 | if (CLOSUREP (object) && STRINGP (AREF (object, CLOSURE_CODE))) |
| 539 | return Qt; | ||
| 540 | return Qnil; | ||
| 541 | } | ||
| 542 | |||
| 543 | DEFUN ("interpreted-function-p", Finterpreted_function_p, | ||
| 544 | Sinterpreted_function_p, 1, 1, 0, | ||
| 545 | doc: /* Return t if OBJECT is a function of type `interpreted-function'. */) | ||
| 546 | (Lisp_Object object) | ||
| 547 | { | ||
| 548 | if (CLOSUREP (object) && CONSP (AREF (object, CLOSURE_CODE))) | ||
| 527 | return Qt; | 549 | return Qt; |
| 528 | return Qnil; | 550 | return Qnil; |
| 529 | } | 551 | } |
| @@ -1174,17 +1196,11 @@ Value, if non-nil, is a list (interactive SPEC). */) | |||
| 1174 | else if (CONSP (fun)) | 1196 | else if (CONSP (fun)) |
| 1175 | { | 1197 | { |
| 1176 | Lisp_Object funcar = XCAR (fun); | 1198 | Lisp_Object funcar = XCAR (fun); |
| 1177 | if (EQ (funcar, Qclosure) | 1199 | if (EQ (funcar, Qlambda)) |
| 1178 | || EQ (funcar, Qlambda)) | ||
| 1179 | { | 1200 | { |
| 1180 | Lisp_Object form = Fcdr (XCDR (fun)); | 1201 | Lisp_Object form = Fcdr (XCDR (fun)); |
| 1181 | if (EQ (funcar, Qclosure)) | ||
| 1182 | form = Fcdr (form); | ||
| 1183 | Lisp_Object spec = Fassq (Qinteractive, form); | 1202 | Lisp_Object spec = Fassq (Qinteractive, form); |
| 1184 | if (NILP (spec) && VALID_DOCSTRING_P (CAR_SAFE (form))) | 1203 | if (NILP (Fcdr (Fcdr (spec)))) |
| 1185 | /* A "docstring" is a sign that we may have an OClosure. */ | ||
| 1186 | genfun = true; | ||
| 1187 | else if (NILP (Fcdr (Fcdr (spec)))) | ||
| 1188 | return spec; | 1204 | return spec; |
| 1189 | else | 1205 | else |
| 1190 | return list2 (Qinteractive, Fcar (Fcdr (spec))); | 1206 | return list2 (Qinteractive, Fcar (Fcdr (spec))); |
| @@ -1257,12 +1273,9 @@ The value, if non-nil, is a list of mode name symbols. */) | |||
| 1257 | else if (CONSP (fun)) | 1273 | else if (CONSP (fun)) |
| 1258 | { | 1274 | { |
| 1259 | Lisp_Object funcar = XCAR (fun); | 1275 | Lisp_Object funcar = XCAR (fun); |
| 1260 | if (EQ (funcar, Qclosure) | 1276 | if (EQ (funcar, Qlambda)) |
| 1261 | || EQ (funcar, Qlambda)) | ||
| 1262 | { | 1277 | { |
| 1263 | Lisp_Object form = Fcdr (XCDR (fun)); | 1278 | Lisp_Object form = Fcdr (XCDR (fun)); |
| 1264 | if (EQ (funcar, Qclosure)) | ||
| 1265 | form = Fcdr (form); | ||
| 1266 | return Fcdr (Fcdr (Fassq (Qinteractive, form))); | 1279 | return Fcdr (Fcdr (Fassq (Qinteractive, form))); |
| 1267 | } | 1280 | } |
| 1268 | } | 1281 | } |
| @@ -4224,7 +4237,8 @@ syms_of_data (void) | |||
| 4224 | DEFSYM (Qspecial_form, "special-form"); | 4237 | DEFSYM (Qspecial_form, "special-form"); |
| 4225 | DEFSYM (Qprimitive_function, "primitive-function"); | 4238 | DEFSYM (Qprimitive_function, "primitive-function"); |
| 4226 | DEFSYM (Qsubr_native_elisp, "subr-native-elisp"); | 4239 | DEFSYM (Qsubr_native_elisp, "subr-native-elisp"); |
| 4227 | DEFSYM (Qcompiled_function, "compiled-function"); | 4240 | DEFSYM (Qbyte_code_function, "byte-code-function"); |
| 4241 | DEFSYM (Qinterpreted_function, "interpreted-function"); | ||
| 4228 | DEFSYM (Qbuffer, "buffer"); | 4242 | DEFSYM (Qbuffer, "buffer"); |
| 4229 | DEFSYM (Qframe, "frame"); | 4243 | DEFSYM (Qframe, "frame"); |
| 4230 | DEFSYM (Qvector, "vector"); | 4244 | DEFSYM (Qvector, "vector"); |
| @@ -4289,6 +4303,8 @@ syms_of_data (void) | |||
| 4289 | defsubr (&Smarkerp); | 4303 | defsubr (&Smarkerp); |
| 4290 | defsubr (&Ssubrp); | 4304 | defsubr (&Ssubrp); |
| 4291 | defsubr (&Sbyte_code_function_p); | 4305 | defsubr (&Sbyte_code_function_p); |
| 4306 | defsubr (&Sinterpreted_function_p); | ||
| 4307 | defsubr (&Sclosurep); | ||
| 4292 | defsubr (&Smodule_function_p); | 4308 | defsubr (&Smodule_function_p); |
| 4293 | defsubr (&Schar_or_string_p); | 4309 | defsubr (&Schar_or_string_p); |
| 4294 | defsubr (&Sthreadp); | 4310 | defsubr (&Sthreadp); |