Show
Ignore:
Timestamp:
09/29/05 06:44:20 (3 years ago)
Author:
putter
Message:

Perl6/Code.pm: Typechecking of Array and Hash parameters repaired (vis MM2). And check_params() now returns (mostly placeholder) error messages.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • perl5/Perl6-Value/lib/Perl6/Code.pm

    r7194 r7197  
    154154                Perl6::Type->new(  
    155155                    name => 'Array',  
    156                     match => sub { ref($_[0]) eq 'ARRAY' || ref($_[0]) eq 'Array' } ) :  
     156                    match => sub { ref($_[0]) eq 'ARRAY' || ref($_[0]) eq 'Array' || ref($_[0]) eq 'Dispatchable' && $_[0]->isa('Array') } ) :  
    157157            $name =~ /^\%/ ?  
    158158                Perl6::Type->new(  
    159159                    name => 'Hash',  
    160                     match => sub { ref($_[0]) eq 'HASH'  || ref($_[0]) eq 'Hash' } ) :  
     160                    match => sub { ref($_[0]) eq 'HASH'  || ref($_[0]) eq 'Hash' || ref($_[0]) eq 'Dispatchable' && $_[0]->isa('Hash') } ) :  
    161161            $name =~ /^\&/ ? 
    162162                Perl6::Type->new(  
     
    253253                return $j if $j; 
    254254 
    255                 $self->check_params(@arguments) 
    256                     || confess "Signature does not match - (" . $self->signature_str . ")"; 
     255                my($ok,$err)=$self->check_params(@arguments); 
     256                $ok || confess "Signature does not match - (" . $self->signature_str . "): $err"; 
    257257                # my %bound_params = $::SELF->bind_params(@arguments);  
    258258                # warn "entering sub ".$self->name;    
     
    285285                    if ( $i >= scalar @{ $self->params } && $i >= scalar @params ) { 
    286286                        #warn "CHECK: $i - required $num_required - given @params"; 
    287                         return 0 if $num_required > scalar @params; 
     287                        return (0,"err1") if $num_required > scalar @params; 
    288288                        return 1; 
    289289                    } 
    290290                    # return 1 if $i > scalar $#{ $self->params } && $i > scalar $#params; 
    291                     return 0 if $i > scalar $#{ $self->params } && $i <= scalar $#params; 
     291                    return (0,"err2") if $i > scalar $#{ $self->params } && $i <= scalar $#params; 
    292292                    # warn $i; 
    293293                    my $spec = ${ $self->params }[$i]; 
     
    296296                    next if $spec->optional && ! defined $candidate; 
    297297                    if ( $spec->slurpy ) {    ## && $spec->name eq 'Array' ) { 
    298                         ## return 0 unless $spec->match_type( [ @params[$i..$#params] ] ); XXX 
     298                        ## return (0,"") unless $spec->match_type( [ @params[$i..$#params] ] ); XXX 
    299299                        return 1;   # @params = (); 
    300300                    } 
    301301                    else { 
    302                         return 0 unless $spec->match_type($candidate); 
     302                        my $mt = $spec->match_type($candidate); 
     303                        return (0,"type mismatch: $candidate vs ".$spec->str) 
     304                            if !$mt; 
    303305                    } 
    304306                }