Mercurial > hg > xemacs-beta
comparison src/eval.c @ 970:0dc7756a58c4
[xemacs-hg @ 2002-08-22 11:31:39 by stephent]
fix GCPRO in do_autoload <871y8rnndk.fsf@tleepslib.sk.tsukuba.ac.jp>
author | stephent |
---|---|
date | Thu, 22 Aug 2002 11:31:43 +0000 |
parents | 0391335b65dc |
children | 184461bc8de4 |
comparison
equal
deleted
inserted
replaced
969:d41e92ee6d12 | 970:0dc7756a58c4 |
---|---|
1401 /* Autoloading function: will it be a macro when loaded? */ | 1401 /* Autoloading function: will it be a macro when loaded? */ |
1402 tem = Felt (def, make_int (4)); | 1402 tem = Felt (def, make_int (4)); |
1403 if (EQ (tem, Qt) || EQ (tem, Qmacro)) | 1403 if (EQ (tem, Qt) || EQ (tem, Qmacro)) |
1404 { | 1404 { |
1405 /* Yes, load it and try again. */ | 1405 /* Yes, load it and try again. */ |
1406 /* do_autoload GCPROs both arguments */ | |
1406 do_autoload (def, sym); | 1407 do_autoload (def, sym); |
1407 continue; | 1408 continue; |
1408 } | 1409 } |
1409 else | 1410 else |
1410 break; | 1411 break; |
3034 | 3035 |
3035 for (;;) | 3036 for (;;) |
3036 { | 3037 { |
3037 final = indirect_function (cmd, 1); | 3038 final = indirect_function (cmd, 1); |
3038 if (CONSP (final) && EQ (Fcar (final), Qautoload)) | 3039 if (CONSP (final) && EQ (Fcar (final), Qautoload)) |
3039 do_autoload (final, cmd); | 3040 { |
3041 /* do_autoload GCPROs both arguments */ | |
3042 do_autoload (final, cmd); | |
3043 } | |
3040 else | 3044 else |
3041 break; | 3045 break; |
3042 } | 3046 } |
3043 | 3047 |
3044 if (CONSP (final) || SUBRP (final) || COMPILED_FUNCTIONP (final)) | 3048 if (CONSP (final) || SUBRP (final) || COMPILED_FUNCTIONP (final)) |
3210 queue = Fcdr (queue); | 3214 queue = Fcdr (queue); |
3211 } | 3215 } |
3212 return Qnil; | 3216 return Qnil; |
3213 } | 3217 } |
3214 | 3218 |
3219 /* do_autoload GCPROs both arguments */ | |
3215 void | 3220 void |
3216 do_autoload (Lisp_Object fundef, | 3221 do_autoload (Lisp_Object fundef, |
3217 Lisp_Object funname) | 3222 Lisp_Object funname) |
3218 { | 3223 { |
3219 /* This function can GC */ | 3224 /* This function can GC */ |
3220 int speccount = specpdl_depth(); | 3225 int speccount = specpdl_depth(); |
3221 Lisp_Object fun = funname; | 3226 Lisp_Object fun = funname; |
3222 struct gcpro gcpro1, gcpro2; | 3227 struct gcpro gcpro1, gcpro2, gcpro3; |
3223 | 3228 |
3224 CHECK_SYMBOL (funname); | 3229 CHECK_SYMBOL (funname); |
3225 GCPRO2 (fun, funname); | 3230 GCPRO3 (fundef, funname, fun); |
3226 | 3231 |
3227 /* Value saved here is to be restored into Vautoload_queue */ | 3232 /* Value saved here is to be restored into Vautoload_queue */ |
3228 record_unwind_protect (un_autoload, Vautoload_queue); | 3233 record_unwind_protect (un_autoload, Vautoload_queue); |
3229 Vautoload_queue = Qt; | 3234 Vautoload_queue = Qt; |
3230 call4 (Qload, Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil, Qnil); | 3235 call4 (Qload, Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil, Qnil); |
3608 { | 3613 { |
3609 Lisp_Object funcar = XCAR (fun); | 3614 Lisp_Object funcar = XCAR (fun); |
3610 | 3615 |
3611 if (EQ (funcar, Qautoload)) | 3616 if (EQ (funcar, Qautoload)) |
3612 { | 3617 { |
3618 /* do_autoload GCPROs both arguments */ | |
3613 do_autoload (fun, original_fun); | 3619 do_autoload (fun, original_fun); |
3614 goto retry; | 3620 goto retry; |
3615 } | 3621 } |
3616 else if (EQ (funcar, Qmacro)) | 3622 else if (EQ (funcar, Qmacro)) |
3617 { | 3623 { |
3800 { | 3806 { |
3801 val = funcall_lambda (fun, fun_nargs, fun_args); | 3807 val = funcall_lambda (fun, fun_nargs, fun_args); |
3802 } | 3808 } |
3803 else if (EQ (funcar, Qautoload)) | 3809 else if (EQ (funcar, Qautoload)) |
3804 { | 3810 { |
3811 /* do_autoload GCPROs both arguments */ | |
3805 do_autoload (fun, args[0]); | 3812 do_autoload (fun, args[0]); |
3806 goto retry; | 3813 goto retry; |
3807 } | 3814 } |
3808 else /* Can't funcall a macro */ | 3815 else /* Can't funcall a macro */ |
3809 { | 3816 { |
3890 function = XCDR (function); | 3897 function = XCDR (function); |
3891 goto retry; | 3898 goto retry; |
3892 } | 3899 } |
3893 else if (EQ (funcar, Qautoload)) | 3900 else if (EQ (funcar, Qautoload)) |
3894 { | 3901 { |
3895 struct gcpro gcpro1; | 3902 /* do_autoload GCPROs both arguments */ |
3896 | |
3897 GCPRO1 (function); | |
3898 do_autoload (function, orig_function); | 3903 do_autoload (function, orig_function); |
3899 UNGCPRO; | |
3900 function = orig_function; | 3904 function = orig_function; |
3901 goto retry; | 3905 goto retry; |
3902 } | 3906 } |
3903 else if (EQ (funcar, Qlambda)) | 3907 else if (EQ (funcar, Qlambda)) |
3904 { | 3908 { |