2721f050320cd31efc19ded47b3a7c888a4a1e3f
[perl.git] / do / defined
1 int                                     /*SUPPRESS 590*/
2 do_defined(TARG,arg,gimme,arglast)
3 STR *TARG;
4 register ARG *arg;
5 int gimme;
6 int *arglast;
7 {
8     register int type;
9     register int retarg = arglast[0] + 1;
10     int retval;
11     ARRAY *ary;
12     HASH *hash;
13
14     if ((arg[1].arg_type & A_MASK) != A_LEXPR)
15         fatal("Illegal argument to defined()");
16     arg = arg[1].arg_ptr.arg_arg;
17     type = arg->arg_type;
18
19     if (type == O_SUBR || type == O_DBSUBR) {
20         if ((arg[1].arg_type & A_MASK) == A_WORD)
21             retval = stab_sub(arg[1].arg_ptr.arg_stab) != 0;
22         else {
23             STR *tmpstr = STAB_STR(arg[1].arg_ptr.arg_stab);
24
25             retval = tmpstr && stab_sub(stabent(str_get(tmpstr),TRUE)) != 0;
26         }
27     }
28     else if (type == O_ARRAY || type == O_LARRAY ||
29              type == O_ASLICE || type == O_LASLICE )
30         retval = ((ary = stab_xarray(arg[1].arg_ptr.arg_stab)) != 0
31             && ary->ary_max >= 0 );
32     else if (type == O_HASH || type == O_LHASH ||
33              type == O_HSLICE || type == O_LHSLICE )
34         retval = ((hash = stab_xhash(arg[1].arg_ptr.arg_stab)) != 0
35             && hash->tbl_array);
36     else
37         retval = FALSE;
38     str_numset(TARG,(double)retval);
39     stack->ary_array[retarg] = TARG;
40     return retarg;
41 }
42