2 do_undef(TARG,arg,gimme,arglast)
10 int retarg = arglast[0] + 1;
12 if ((arg[1].arg_type & A_MASK) != A_LEXPR)
13 fatal("Illegal argument to undef()");
14 arg = arg[1].arg_ptr.arg_arg;
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 */
22 else if (type == O_HASH || type == O_LHASH) {
23 stab = arg[1].arg_ptr.arg_stab;
26 else if (stab == sigstab) {
29 for (i = 1; i < NSIG; i++)
30 signal(i, SIG_DFL); /* munch, munch, munch */
32 (void)hfree(stab_xhash(stab), TRUE);
33 stab_xhash(stab) = Null(HASH*);
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);
41 stab = stabent(str_get(tmpstr),TRUE);
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*);
54 fatal("Can't undefine that kind of object");
56 stack->ary_array[retarg] = TARG;