092341b0060c6fe1e7b9d0aa4b66d5eb9d928d81
[perl.git] / do / undef
1 int                                             /*SUPPRESS 590*/
2 do_undef(TARG,arg,gimme,arglast)
3 STR *TARG;
4 register ARG *arg;
5 int gimme;
6 int *arglast;
7 {
8     register int type;
9     register STAB *stab;
10     int retarg = arglast[0] + 1;
11
12     if ((arg[1].arg_type & A_MASK) != A_LEXPR)
13         fatal("Illegal argument to undef()");
14     arg = arg[1].arg_ptr.arg_arg;
15     type = arg->arg_type;
16
17     if (type == O_ARRAY || type == O_LARRAY) {
18         stab = arg[1].arg_ptr.arg_stab;
19         afree(stab_xarray(stab));
20         stab_xarray(stab) = anew(stab);         /* so "@array" still works */
21     }
22     else if (type == O_HASH || type == O_LHASH) {
23         stab = arg[1].arg_ptr.arg_stab;
24         if (stab == envstab)
25             environ[0] = Nullch;
26         else if (stab == sigstab) {
27             int i;
28
29             for (i = 1; i < NSIG; i++)
30                 signal(i, SIG_DFL);     /* munch, munch, munch */
31         }
32         (void)hfree(stab_xhash(stab), TRUE);
33         stab_xhash(stab) = Null(HASH*);
34     }
35     else if (type == O_SUBR || type == O_DBSUBR) {
36         stab = arg[1].arg_ptr.arg_stab;
37         if ((arg[1].arg_type & A_MASK) != A_WORD) {
38             STR *tmpstr = STAB_STR(arg[1].arg_ptr.arg_stab);
39
40             if (tmpstr)
41                 stab = stabent(str_get(tmpstr),TRUE);
42             else
43                 stab = Nullstab;
44         }
45         if (stab && stab_sub(stab)) {
46             cmd_free(stab_sub(stab)->cmd);
47             stab_sub(stab)->cmd = Nullcmd;
48             afree(stab_sub(stab)->tosave);
49             Safefree(stab_sub(stab));
50             stab_sub(stab) = Null(SUBR*);
51         }
52     }
53     else
54         fatal("Can't undefine that kind of object");
55     str_numset(TARG,0.0);
56     stack->ary_array[retarg] = TARG;
57     return retarg;
58 }
59