Short: Bugfix: exec() vs simul_efun From: Daniel von Dincklage <vondincklage@usa.net> Date: Fri, 19 Jun 1998 11:46:42 +0200 Type: Patch State: Rejected: using bind_lambda() is easier understand. Here are some minor patches for the amylaar-driver: *************** *** 5948,5960 **** CASE(F_EXEC); { int i; assign_eval_cost(); TYPE_TEST1(sp-1, T_OBJECT) TYPE_TEST2(sp, T_OBJECT) inter_sp = sp; inter_pc = pc; ! i = replace_interactive((sp-1)->u.ob, sp->u.ob, current_prog->name); pop_stack(); free_svalue(sp); /* object might have been destructed */ put_number(i); --- 5975,5997 ---- CASE(F_EXEC); { int i; + extern struct object *simul_efun_object; assign_eval_cost(); TYPE_TEST1(sp-1, T_OBJECT) TYPE_TEST2(sp, T_OBJECT) inter_sp = sp; inter_pc = pc; ! ! if (current_prog == simul_efun_object->prog) { ! i = replace_interactive((sp-1)->u.ob, sp->u.ob, ! csp[0].prog->name); ! } else { ! i = replace_interactive((sp-1)->u.ob, sp->u.ob, ! current_prog->name); ! } ! // (sp-1)->u.ob->prog->name); ! pop_stack(); free_svalue(sp); /* object might have been destructed */ put_number(i); (Otherwise exec can't be a sefun) Tim Hollebeek wrote: > It is for precisely this reason that the (dreadful) set_this_object() > efun exists. Hacking this in like this probably isn't a good idea > unless you intend to change every other place where this_object() is > assumed. Unfortunatly, that will not work in this case. The check was i = replace_interactive((sp-1)->u.ob, sp->u.ob, current_prog->name); in oder to get the filename of the program that ran the exec(). Unfortunatly, using set_this_object() would change the current_object- variable and not the program that is running (That wouldn't be a good idea ;-) ), so regardless of the current_object the valid_exec would still get the filename of the simul-efun-object. So I guess a better idea would be: *************** *** 5948,5960 **** CASE(F_EXEC); { int i; - assign_eval_cost(); TYPE_TEST1(sp-1, T_OBJECT) TYPE_TEST2(sp, T_OBJECT) inter_sp = sp; inter_pc = pc; ! i = replace_interactive((sp-1)->u.ob, sp->u.ob, current_prog->name); pop_stack(); free_svalue(sp); /* object might have been destructed */ put_number(i); --- 5975,5989 ---- CASE(F_EXEC); { int i; assign_eval_cost(); TYPE_TEST1(sp-1, T_OBJECT) TYPE_TEST2(sp, T_OBJECT) inter_sp = sp; inter_pc = pc; ! ! i = replace_interactive((sp-1)->u.ob, sp->u.ob, ! current_object->prog->name); ! pop_stack(); free_svalue(sp); /* object might have been destructed */ put_number(i); > An alternative approach is to say this sort of thing should be done > with bind_lambda(), which is IMHO much cleaner. Hm, that would work. Daniel von Dincklage (sunblade@silicondream) -- * Daniel von Dincklage (vonDincklage@usa.net) * Windows95 (noun): 32 bit extensions and a graphical shell for a 16 bit patch to an 8 bit operating system originally coded for a 4 bit micro processor, written by a 2 bit company that can't stand 1 bit of competition.