perl 5.0 alpha 3
[p5sagit/p5-mst-13.2.git] / do / defined
CommitLineData
79072805 1int /*SUPPRESS 590*/
2do_defined(TARG,arg,gimme,arglast)
3STR *TARG;
4register ARG *arg;
5int gimme;
6int *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