B-DeparseTree

 view release on metacpan or  search on metacpan

lib/B/DeparseTree/P526c.pm  view on Meta::CPAN

		    !B::Deparse::null($real = $arg->first) and
		    ($chr =~ /\$/ && B::Deparse::is_scalar($real->first)
		     or ($chr =~ /@/
			 && class($real->first->sibling) ne 'NULL'
			 && $real->first->sibling->name
			 =~ /^(rv2|pad)av$/)
		     or ($chr =~ /%/
			 && class($real->first->sibling) ne 'NULL'
			 && $real->first->sibling->name
			 =~ /^(rv2|pad)hv$/)
		     #or ($chr =~ /&/ # This doesn't work
		     #   && $real->first->name eq "rv2cv")
		     or ($chr =~ /\*/
			 && $real->first->name eq "rv2gv")))
		  {
		      push @reals, $self->deparse($real, 6, $op);
		  } else {
		      return ('&', []);
		  }
	    }
       }
    }
    return ('&', []) if $proto and !$doneok; # too few args and no ';'
    return ('&', []) if @args;               # too many args
    return ('', \@reals);
}

sub retscalar {
    my $name = $_[0]->name;
    # XXX There has to be a better way of doing this scalar-op check.
    #     Currently PL_opargs is not exposed.
    if ($name eq 'null') {
        $name = substr B::ppname($_[0]->targ), 3
    }
    $name =~ /^(?:scalar|pushmark|wantarray|const|gvsv|gv|padsv|rv2gv
                 |rv2sv|av2arylen|anoncode|prototype|srefgen|ref|bless
                 |regcmaybe|regcreset|regcomp|qr|subst|substcont|trans
                 |transr|sassign|chop|schop|chomp|schomp|defined|undef
                 |study|pos|preinc|i_preinc|predec|i_predec|postinc
                 |i_postinc|postdec|i_postdec|pow|multiply|i_multiply
                 |divide|i_divide|modulo|i_modulo|add|i_add|subtract
                 |i_subtract|concat|stringify|left_shift|right_shift|lt
                 |i_lt|gt|i_gt|le|i_le|ge|i_ge|eq|i_eq|ne|i_ne|n_cmp|i_cmp
                 |s_lt|s_gt|s_le|s_ge|s_eq|s_ne|s_cmp|([isn]_)?bit_(?:and|x?or)|negate
                 |i_negate|not|([isn]_)?complement|smartmatch|atan2|sin|cos
                 |rand|srand|exp|log|sqrt|int|hex|oct|abs|length|substr
                 |vec|index|rindex|sprintf|formline|ord|chr|crypt|ucfirst
                 |lcfirst|uc|lc|quotemeta|aelemfast|aelem|exists|helem
                 |pack|join|anonlist|anonhash|push|pop|shift|unshift|xor
                 |andassign|orassign|dorassign|warn|die|reset|nextstate
                 |dbstate|unstack|last|next|redo|dump|goto|exit|open|close
                 |pipe_op|fileno|umask|binmode|tie|untie|tied|dbmopen
                 |dbmclose|select|getc|read|enterwrite|prtf|print|say
                 |sysopen|sysseek|sysread|syswrite|eof|tell|seek|truncate
                 |fcntl|ioctl|flock|send|recv|socket|sockpair|bind|connect
                 |listen|accept|shutdown|gsockopt|ssockopt|getsockname
                 |getpeername|ftrread|ftrwrite|ftrexec|fteread|ftewrite
                 |fteexec|ftis|ftsize|ftmtime|ftatime|ftctime|ftrowned
                 |fteowned|ftzero|ftsock|ftchr|ftblk|ftfile|ftdir|ftpipe
                 |ftsuid|ftsgid|ftsvtx|ftlink|fttty|fttext|ftbinary|chdir
                 |chown|chroot|unlink|chmod|utime|rename|link|symlink
                 |readlink|mkdir|rmdir|open_dir|telldir|seekdir|rewinddir
                 |closedir|fork|wait|waitpid|system|exec|kill|getppid
                 |getpgrp|setpgrp|getpriority|setpriority|time|alarm|sleep
                 |shmget|shmctl|shmread|shmwrite|msgget|msgctl|msgsnd
                 |msgrcv|semop|semget|semctl|hintseval|shostent|snetent
                 |sprotoent|sservent|ehostent|enetent|eprotoent|eservent
                 |spwent|epwent|sgrent|egrent|getlogin|syscall|lock|runcv
                 |i_aelem|n_aelem|s_aelem|aelem_u|i_aelem_u|n_aelem_u|s_aelem_u
                 |u_add|u_multiply|u_subtract
                 |fc)\z/x
}

sub pp_enterxssub { goto &pp_entersub; }

# FIXME: go over
# sub pp_entersub {
#     my $self = shift;
#     my($op, $cx) = @_;
#     return $self->e_method($self->_method($op, $cx))
#         unless null $op->first->sibling;
#     my $prefix = "";
#     my $amper = "";
#     my($kid, @exprs);
#     if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) {
# 	$prefix = "do ";
#     } elsif ($op->private & OPpENTERSUB_AMPER) {
# 	$amper = "&";
#     }
#     $kid = $op->first;
#     $kid = $kid->first->sibling; # skip ex-list, pushmark
#     for (; not null $kid->sibling; $kid = $kid->sibling) {
# 	push @exprs, $kid;
#     }
#     my $simple = 0;
#     my $proto = undef;
#     my $lexical;
#     if (is_scope($kid)) {
# 	$amper = "&";
# 	$kid = "{" . $self->deparse($kid, 0) . "}";
#     } elsif ($kid->first->name eq "gv") {
# 	my $gv = $self->gv_or_padgv($kid->first);
# 	my $cv;
# 	if (class($gv) eq 'GV' && class($cv = $gv->CV) ne "SPECIAL"
# 	 || $gv->FLAGS & SVf_ROK && class($cv = $gv->RV) eq 'CV') {
# 	    $proto = $cv->PV if $cv->FLAGS & SVf_POK;
# 	}
# 	$simple = 1; # only calls of named functions can be prototyped
# 	$kid = $self->deparse($kid, 24);
# 	my $fq;
# 	# Fully qualify any sub name that conflicts with a lexical.
# 	if ($self->lex_in_scope("&$kid")
# 	 || $self->lex_in_scope("&$kid", 1))
# 	{
# 	    $fq++;
# 	} elsif (!$amper) {
# 	    if ($kid eq 'main::') {
# 		$kid = '::';
# 	    }
# 	    else {
# 	      if ($kid !~ /::/ && $kid ne 'x') {



( run in 0.629 second using v1.01-cache-2.11-cpan-39bf76dae61 )