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 {